hasune
Initial commit: Model Search Tool
fd7325b
import gradio as gr
import requests
from huggingface_hub import HfApi
import pandas as pd
from datetime import datetime
import json
# Hugging Face API ์ดˆ๊ธฐํ™”
api = HfApi()
def search_models(
search_query="",
task_filter="all",
language_filter="all",
license_filter="all",
sort_by="downloads",
max_results=20
):
"""Hugging Face Hub์—์„œ ๋ชจ๋ธ ๊ฒ€์ƒ‰"""
try:
# ๊ฒ€์ƒ‰ ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ •
search_params = {
"limit": max_results,
"sort": sort_by,
"direction": -1, # ๋‚ด๋ฆผ์ฐจ์ˆœ
}
# ํƒœ์Šคํฌ ํ•„ํ„ฐ
if task_filter != "all":
search_params["pipeline_tag"] = task_filter
# ์–ธ์–ด ํ•„ํ„ฐ
if language_filter != "all":
search_params["language"] = language_filter
# ๋ผ์ด์„ ์Šค ํ•„ํ„ฐ
if license_filter != "all":
search_params["license"] = license_filter
# ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ
if search_query.strip():
search_params["search"] = search_query
# API ํ˜ธ์ถœ
models = api.list_models(**search_params)
# ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ
results = []
for model in models:
# ๋ชจ๋ธ ์ •๋ณด ์ถ”์ถœ
model_info = {
"Model Name": model.modelId,
"Task": getattr(model, 'pipeline_tag', 'Unknown'),
"Downloads": f"{getattr(model, 'downloads', 0):,}",
"Likes": f"{getattr(model, 'likes', 0):,}",
"Updated": getattr(model, 'lastModified', 'Unknown'),
"License": getattr(model, 'license', 'Unknown'),
"Link": f"https://huggingface.co/{model.modelId}"
}
results.append(model_info)
if not results:
return pd.DataFrame([{"Message": "๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒ€์ƒ‰์–ด๋‚˜ ํ•„ํ„ฐ๋ฅผ ์‹œ๋„ํ•ด๋ณด์„ธ์š”."}])
# DataFrame์œผ๋กœ ๋ณ€ํ™˜
df = pd.DataFrame(results)
return df
except Exception as e:
error_df = pd.DataFrame([{"Error": f"๊ฒ€์ƒ‰ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {str(e)}"}])
return error_df
def get_model_details(model_name):
"""ํŠน์ • ๋ชจ๋ธ์˜ ์ƒ์„ธ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ"""
if not model_name:
return "๋ชจ๋ธ๋ช…์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."
try:
# ๋ชจ๋ธ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
model_info = api.model_info(model_name)
details = f"""
# ๐Ÿค— {model_name}
## ๊ธฐ๋ณธ ์ •๋ณด
- **ํƒœ์Šคํฌ**: {getattr(model_info, 'pipeline_tag', 'Unknown')}
- **๋ผ์ด์„ ์Šค**: {getattr(model_info, 'license', 'Unknown')}
- **๋‹ค์šด๋กœ๋“œ**: {getattr(model_info, 'downloads', 0):,}ํšŒ
- **์ข‹์•„์š”**: {getattr(model_info, 'likes', 0):,}๊ฐœ
- **์ตœ์ข… ์—…๋ฐ์ดํŠธ**: {getattr(model_info, 'lastModified', 'Unknown')}
## ์ง€์› ์–ธ์–ด
{', '.join(getattr(model_info, 'language', ['Unknown']))}
## ํƒœ๊ทธ
{', '.join(getattr(model_info, 'tags', ['None']))}
## ๋ชจ๋ธ ๋งํฌ
๐Ÿ”— [Hugging Face์—์„œ ๋ณด๊ธฐ](https://huggingface.co/{model_name})
## ์‚ฌ์šฉ ์˜ˆ์ œ
```python
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("{model_name}")
model = AutoModel.from_pretrained("{model_name}")
```
"""
return details
except Exception as e:
return f"โŒ ์˜ค๋ฅ˜: {str(e)}\n\n๋ชจ๋ธ๋ช…์„ ์ •ํ™•ํžˆ ์ž…๋ ฅํ–ˆ๋Š”์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”."
# Gradio ์ธํ„ฐํŽ˜์ด์Šค
with gr.Blocks(title="๐Ÿ” HF Model Finder", theme=gr.themes.Soft()) as demo:
gr.Markdown("# ๐Ÿ” Hugging Face Model Finder")
gr.Markdown("ํ—ˆ๊น…ํŽ˜์ด์Šค์˜ ์ˆ˜๋งŽ์€ ๋ชจ๋ธ ์ค‘์—์„œ ๋‹น์‹ ์ด ์›ํ•˜๋Š” ์กฐ๊ฑด์— ๋งž๋Š” ๋ชจ๋ธ์„ ์‰ฝ๊ฒŒ ์ฐพ์•„๋ณด์„ธ์š”!")
with gr.Tabs():
# ํƒญ 1: ๋ชจ๋ธ ๊ฒ€์ƒ‰
with gr.Tab("๐Ÿ” ๋ชจ๋ธ ๊ฒ€์ƒ‰"):
with gr.Row():
with gr.Column(scale=1):
gr.Markdown("### ๊ฒ€์ƒ‰ ์กฐ๊ฑด")
search_query = gr.Textbox(
label="๊ฒ€์ƒ‰์–ด",
placeholder="์˜ˆ: korean, sentiment, bert",
value=""
)
task_filter = gr.Dropdown(
label="ํƒœ์Šคํฌ",
choices=[
"all", "text-classification", "token-classification",
"question-answering", "fill-mask", "summarization",
"translation", "text-generation", "conversational"
],
value="all"
)
language_filter = gr.Dropdown(
label="์–ธ์–ด",
choices=["all", "ko", "en", "multilingual", "zh", "ja", "es", "fr"],
value="all"
)
license_filter = gr.Dropdown(
label="๋ผ์ด์„ ์Šค",
choices=["all", "apache-2.0", "mit", "cc-by-4.0", "cc-by-nc-4.0"],
value="all"
)
sort_by = gr.Dropdown(
label="์ •๋ ฌ ๊ธฐ์ค€",
choices=["downloads", "likes", "lastModified"],
value="downloads"
)
max_results = gr.Slider(
label="์ตœ๋Œ€ ๊ฒฐ๊ณผ ์ˆ˜",
minimum=5,
maximum=50,
value=20,
step=5
)
search_btn = gr.Button("๐Ÿ” ๊ฒ€์ƒ‰ํ•˜๊ธฐ", variant="primary")
with gr.Column(scale=2):
gr.Markdown("### ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ")
results_table = gr.Dataframe(
headers=["Model Name", "Task", "Downloads", "Likes", "Updated", "License"],
interactive=False,
wrap=True
)
# ํƒญ 2: ๋ชจ๋ธ ์ƒ์„ธ ์ •๋ณด
with gr.Tab("๐Ÿ“‹ ๋ชจ๋ธ ์ƒ์„ธ ์ •๋ณด"):
with gr.Row():
with gr.Column(scale=1):
model_name_input = gr.Textbox(
label="๋ชจ๋ธ๋ช…",
placeholder="์˜ˆ: klue/bert-base",
info="Hugging Face์˜ ์ •ํ™•ํ•œ ๋ชจ๋ธ๋ช…์„ ์ž…๋ ฅํ•˜์„ธ์š”"
)
detail_btn = gr.Button("๐Ÿ“‹ ์ƒ์„ธ ์ •๋ณด ๋ณด๊ธฐ", variant="primary")
with gr.Column(scale=2):
model_details = gr.Markdown("๋ชจ๋ธ๋ช…์„ ์ž…๋ ฅํ•˜๊ณ  ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์„ธ์š”.")
# ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ
search_btn.click(
fn=search_models,
inputs=[search_query, task_filter, language_filter, license_filter, sort_by, max_results],
outputs=results_table
)
detail_btn.click(
fn=get_model_details,
inputs=model_name_input,
outputs=model_details
)
# ์‚ฌ์šฉ๋ฒ• ์•ˆ๋‚ด
gr.Markdown("""
### ๐Ÿ’ก ์‚ฌ์šฉ ํŒ
**๊ฒ€์ƒ‰ ํƒญ:**
- ๊ฒ€์ƒ‰์–ด์— ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ํ•„ํ„ฐ๋ฅผ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜์„ธ์š”
- ๋‹ค์šด๋กœ๋“œ ์ˆ˜๊ฐ€ ๋งŽ์€ ๋ชจ๋ธ์ผ์ˆ˜๋ก ์•ˆ์ •์ ์ด๊ณ  ๋ฌธ์„œํ™”๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ์–ด์š”
- ๋ผ์ด์„ ์Šค๋ฅผ ํ™•์ธํ•ด์„œ ์ƒ์—…์  ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜์„ธ์š”
**์ƒ์„ธ ์ •๋ณด ํƒญ:**
- ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์—์„œ ๊ด€์‹ฌ ์žˆ๋Š” ๋ชจ๋ธ๋ช…์„ ๋ณต์‚ฌํ•ด์„œ ๋ถ™์—ฌ๋„ฃ์œผ์„ธ์š”
- ์‚ฌ์šฉ ์˜ˆ์ œ ์ฝ”๋“œ๋„ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค
**์ถ”์ฒœ ๊ฒ€์ƒ‰ ์กฐํ•ฉ:**
- ํ•œ๊ตญ์–ด ๊ฐ์ •๋ถ„์„: language=ko, task=text-classification, ๊ฒ€์ƒ‰์–ด=sentiment
- ์˜์–ด ์งˆ์˜์‘๋‹ต: language=en, task=question-answering
- ์ƒ์—…์  ์‚ฌ์šฉ ๊ฐ€๋Šฅ: license=apache-2.0 ๋˜๋Š” mit
""")
if __name__ == "__main__":
demo.launch()