hasune commited on
Commit
fd7325b
ยท
1 Parent(s): 7a81177

Initial commit: Model Search Tool

Browse files
Files changed (3) hide show
  1. README.md +71 -6
  2. app.py +227 -0
  3. requirements.txt +4 -0
README.md CHANGED
@@ -1,14 +1,79 @@
1
  ---
2
  title: Model Search Tool
3
- emoji: ๐Ÿ˜ป
4
- colorFrom: pink
5
  colorTo: pink
6
  sdk: gradio
7
- sdk_version: 5.31.0
8
  app_file: app.py
9
  pinned: false
10
- license: mit
11
- short_description: ๐Ÿ” Smart search and filtering tool for Hugging Face models
12
  ---
13
 
14
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
  title: Model Search Tool
3
+ emoji: ๐Ÿ”
4
+ colorFrom: purple
5
  colorTo: pink
6
  sdk: gradio
7
+ sdk_version: 4.0.0
8
  app_file: app.py
9
  pinned: false
 
 
10
  ---
11
 
12
+ # ๐Ÿ” Hugging Face Model Search Tool
13
+
14
+ ํ—ˆ๊น…ํŽ˜์ด์Šค์˜ ์ˆ˜๋งŽ์€ ๋ชจ๋ธ ์ค‘์—์„œ ๋‹น์‹ ์ด ์›ํ•˜๋Š” ์กฐ๊ฑด์— ๋งž๋Š” ๋ชจ๋ธ์„ ์‰ฝ๊ฒŒ ์ฐพ์•„๋ณด์„ธ์š”!
15
+
16
+ ## โœจ ์ฃผ์š” ๊ธฐ๋Šฅ
17
+
18
+ ### ๐Ÿ” ์Šค๋งˆํŠธ ๊ฒ€์ƒ‰
19
+ - **ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰**: ๋ชจ๋ธ๋ช…, ํƒœ์Šคํฌ, ์„ค๋ช… ๋“ฑ์œผ๋กœ ๊ฒ€์ƒ‰
20
+ - **๋‹ค์ค‘ ํ•„ํ„ฐ**: ํƒœ์Šคํฌ, ์–ธ์–ด, ๋ผ์ด์„ ์Šค ์กฐํ•ฉ ํ•„ํ„ฐ๋ง
21
+ - **์ •๋ ฌ ์˜ต์…˜**: ์ธ๊ธฐ๋„, ์ข‹์•„์š” ์ˆ˜, ์ตœ์‹ ์ˆœ ์ •๋ ฌ
22
+
23
+ ### ๐Ÿ“Š ์‹ค์šฉ์  ์ •๋ณด ์ œ๊ณต
24
+ - ๋‹ค์šด๋กœ๋“œ ์ˆ˜ ๋ฐ ์ข‹์•„์š” ์ˆ˜ ํ‘œ์‹œ
25
+ - ์ตœ๊ทผ ์—…๋ฐ์ดํŠธ ๋‚ ์งœ ํ™•์ธ
26
+ - ๋ผ์ด์„ ์Šค ์ •๋ณด๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ๋ฒ”์œ„ ํ™•์ธ
27
+ - ์ง์ ‘ ๋งํฌ๋กœ ๋ฐ”๋กœ ๋ชจ๋ธ ํŽ˜์ด์ง€ ์ด๋™
28
+
29
+ ### ๐Ÿ“‹ ์ƒ์„ธ ์ •๋ณด ๋ทฐ์–ด
30
+ - ๊ฐœ๋ณ„ ๋ชจ๋ธ์˜ ์ž์„ธํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
31
+ - ์ž๋™ ์ƒ์„ฑ๋œ ์‚ฌ์šฉ ์˜ˆ์ œ ์ฝ”๋“œ
32
+ - ์ง€์› ์–ธ์–ด ๋ฐ ํƒœ๊ทธ ์ •๋ณด
33
+
34
+ ## ๐Ÿš€ ์‚ฌ์šฉ๋ฒ•
35
+
36
+ ### ๋ชจ๋ธ ๊ฒ€์ƒ‰
37
+ 1. **๊ฒ€์ƒ‰์–ด ์ž…๋ ฅ**: ์ฐพ๊ณ ์ž ํ•˜๋Š” ํ‚ค์›Œ๋“œ ์ž…๋ ฅ (์˜ˆ: "korean", "sentiment", "bert")
38
+ 2. **ํ•„ํ„ฐ ์„ค์ •**:
39
+ - ํƒœ์Šคํฌ ํƒ€์ž… (๊ฐ์ •๋ถ„์„, ์งˆ์˜์‘๋‹ต ๋“ฑ)
40
+ - ์–ธ์–ด (ํ•œ๊ตญ์–ด, ์˜์–ด, ๋‹ค๊ตญ์–ด ๋“ฑ)
41
+ - ๋ผ์ด์„ ์Šค (์ƒ์—…์  ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€)
42
+ 3. **์ •๋ ฌ ๊ธฐ์ค€ ์„ ํƒ**: ๋‹ค์šด๋กœ๋“œ ์ˆ˜, ์ข‹์•„์š” ์ˆ˜, ์ตœ์‹ ์ˆœ
43
+ 4. **๊ฒ€์ƒ‰ ์‹คํ–‰**: ์กฐ๊ฑด์— ๋งž๋Š” ๋ชจ๋ธ ๋ฆฌ์ŠคํŠธ ํ™•์ธ
44
+
45
+ ### ๋ชจ๋ธ ์ƒ์„ธ ์ •๋ณด
46
+ 1. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์—์„œ ๊ด€์‹ฌ ์žˆ๋Š” ๋ชจ๋ธ๋ช… ๋ณต์‚ฌ
47
+ 2. "๋ชจ๋ธ ์ƒ์„ธ ์ •๋ณด" ํƒญ์—์„œ ๋ชจ๋ธ๋ช… ์ž…๋ ฅ
48
+ 3. ์ƒ์„ธ ์ •๋ณด ๋ฐ ์‚ฌ์šฉ ์˜ˆ์ œ ์ฝ”๋“œ ํ™•์ธ
49
+
50
+ ## ๐Ÿ’ก ์ถ”์ฒœ ๊ฒ€์ƒ‰ ์กฐํ•ฉ
51
+
52
+ ### ํ•œ๊ตญ์–ด NLP ๋ชจ๋ธ ์ฐพ๊ธฐ
53
+ - **์–ธ์–ด**: Korean (ko)
54
+ - **ํƒœ์Šคํฌ**: Text Classification
55
+ - **๊ฒ€์ƒ‰์–ด**: sentiment, klue, korean
56
+
57
+ ### ์ƒ์—…์  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋ธ
58
+ - **๋ผ์ด์„ ์Šค**: apache-2.0 ๋˜๋Š” mit
59
+ - **์ •๋ ฌ**: Downloads (์ธ๊ธฐ์ˆœ)
60
+
61
+ ### ์ตœ์‹  ๋ชจ๋ธ ํƒ์ƒ‰
62
+ - **์ •๋ ฌ**: Last Modified (์ตœ์‹ ์ˆœ)
63
+ - **์›ํ•˜๋Š” ํƒœ์Šคํฌ ํ•„ํ„ฐ ์ ์šฉ**
64
+
65
+ ## ๐ŸŽฏ ๋ˆ„๊ตฌ์—๊ฒŒ ์œ ์šฉํ•œ๊ฐ€์š”?
66
+
67
+ - **AI ์—ฐ๊ตฌ์ž**: ์—ฐ๊ตฌ์— ์ ํ•ฉํ•œ pre-trained ๋ชจ๋ธ ํƒ์ƒ‰
68
+ - **๊ฐœ๋ฐœ์ž**: ํ”„๋กœ์ ํŠธ์— ํ™œ์šฉํ•  ๋ชจ๋ธ ์„ ํƒ
69
+ - **ํ•™์ƒ**: ํ•™์Šต์šฉ ๋ชจ๋ธ ์ฐพ๊ธฐ
70
+ - **๊ธฐ์—…**: ์ƒ์—…์  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋ธ ๊ฒ€์ƒ‰
71
+
72
+ ## ๐Ÿ”— ์—ฐ๊ด€ ๋„๊ตฌ
73
+
74
+ ์ด ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ๋‹ค๋ฅธ ๋„๊ตฌ๋“ค:
75
+ - [Model Card Generator](https://huggingface.co/spaces/cadenza83/model-card-generator): ์ฐพ์€ ๋ชจ๋ธ์˜ ์นด๋“œ ์ž๋™ ์ƒ์„ฑ
76
+
77
+ ---
78
+
79
+ Made with โค๏ธ for the AI community
app.py ADDED
@@ -0,0 +1,227 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import requests
3
+ from huggingface_hub import HfApi
4
+ import pandas as pd
5
+ from datetime import datetime
6
+ import json
7
+
8
+ # Hugging Face API ์ดˆ๊ธฐํ™”
9
+ api = HfApi()
10
+
11
+ def search_models(
12
+ search_query="",
13
+ task_filter="all",
14
+ language_filter="all",
15
+ license_filter="all",
16
+ sort_by="downloads",
17
+ max_results=20
18
+ ):
19
+ """Hugging Face Hub์—์„œ ๋ชจ๋ธ ๊ฒ€์ƒ‰"""
20
+
21
+ try:
22
+ # ๊ฒ€์ƒ‰ ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ •
23
+ search_params = {
24
+ "limit": max_results,
25
+ "sort": sort_by,
26
+ "direction": -1, # ๋‚ด๋ฆผ์ฐจ์ˆœ
27
+ }
28
+
29
+ # ํƒœ์Šคํฌ ํ•„ํ„ฐ
30
+ if task_filter != "all":
31
+ search_params["pipeline_tag"] = task_filter
32
+
33
+ # ์–ธ์–ด ํ•„ํ„ฐ
34
+ if language_filter != "all":
35
+ search_params["language"] = language_filter
36
+
37
+ # ๋ผ์ด์„ ์Šค ํ•„ํ„ฐ
38
+ if license_filter != "all":
39
+ search_params["license"] = license_filter
40
+
41
+ # ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ
42
+ if search_query.strip():
43
+ search_params["search"] = search_query
44
+
45
+ # API ํ˜ธ์ถœ
46
+ models = api.list_models(**search_params)
47
+
48
+ # ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ
49
+ results = []
50
+ for model in models:
51
+ # ๋ชจ๋ธ ์ •๋ณด ์ถ”์ถœ
52
+ model_info = {
53
+ "Model Name": model.modelId,
54
+ "Task": getattr(model, 'pipeline_tag', 'Unknown'),
55
+ "Downloads": f"{getattr(model, 'downloads', 0):,}",
56
+ "Likes": f"{getattr(model, 'likes', 0):,}",
57
+ "Updated": getattr(model, 'lastModified', 'Unknown'),
58
+ "License": getattr(model, 'license', 'Unknown'),
59
+ "Link": f"https://huggingface.co/{model.modelId}"
60
+ }
61
+ results.append(model_info)
62
+
63
+ if not results:
64
+ return pd.DataFrame([{"Message": "๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒ€์ƒ‰์–ด๋‚˜ ํ•„ํ„ฐ๋ฅผ ์‹œ๋„ํ•ด๋ณด์„ธ์š”."}])
65
+
66
+ # DataFrame์œผ๋กœ ๋ณ€ํ™˜
67
+ df = pd.DataFrame(results)
68
+ return df
69
+
70
+ except Exception as e:
71
+ error_df = pd.DataFrame([{"Error": f"๊ฒ€์ƒ‰ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {str(e)}"}])
72
+ return error_df
73
+
74
+ def get_model_details(model_name):
75
+ """ํŠน์ • ๋ชจ๋ธ์˜ ์ƒ์„ธ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ"""
76
+ if not model_name:
77
+ return "๋ชจ๋ธ๋ช…์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."
78
+
79
+ try:
80
+ # ๋ชจ๋ธ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
81
+ model_info = api.model_info(model_name)
82
+
83
+ details = f"""
84
+ # ๐Ÿค— {model_name}
85
+
86
+ ## ๊ธฐ๋ณธ ์ •๋ณด
87
+ - **ํƒœ์Šคํฌ**: {getattr(model_info, 'pipeline_tag', 'Unknown')}
88
+ - **๋ผ์ด์„ ์Šค**: {getattr(model_info, 'license', 'Unknown')}
89
+ - **๋‹ค์šด๋กœ๋“œ**: {getattr(model_info, 'downloads', 0):,}ํšŒ
90
+ - **์ข‹์•„์š”**: {getattr(model_info, 'likes', 0):,}๊ฐœ
91
+ - **์ตœ์ข… ์—…๋ฐ์ดํŠธ**: {getattr(model_info, 'lastModified', 'Unknown')}
92
+
93
+ ## ์ง€์› ์–ธ์–ด
94
+ {', '.join(getattr(model_info, 'language', ['Unknown']))}
95
+
96
+ ## ํƒœ๊ทธ
97
+ {', '.join(getattr(model_info, 'tags', ['None']))}
98
+
99
+ ## ๋ชจ๋ธ ๋งํฌ
100
+ ๐Ÿ”— [Hugging Face์—์„œ ๋ณด๊ธฐ](https://huggingface.co/{model_name})
101
+
102
+ ## ์‚ฌ์šฉ ์˜ˆ์ œ
103
+ ```python
104
+ from transformers import AutoTokenizer, AutoModel
105
+
106
+ tokenizer = AutoTokenizer.from_pretrained("{model_name}")
107
+ model = AutoModel.from_pretrained("{model_name}")
108
+ ```
109
+ """
110
+ return details
111
+
112
+ except Exception as e:
113
+ return f"โŒ ์˜ค๋ฅ˜: {str(e)}\n\n๋ชจ๋ธ๋ช…์„ ์ •ํ™•ํžˆ ์ž…๋ ฅํ–ˆ๋Š”์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”."
114
+
115
+ # Gradio ์ธํ„ฐํŽ˜์ด์Šค
116
+ with gr.Blocks(title="๐Ÿ” HF Model Finder", theme=gr.themes.Soft()) as demo:
117
+
118
+ gr.Markdown("# ๐Ÿ” Hugging Face Model Finder")
119
+ gr.Markdown("ํ—ˆ๊น…ํŽ˜์ด์Šค์˜ ์ˆ˜๋งŽ์€ ๋ชจ๋ธ ์ค‘์—์„œ ๋‹น์‹ ์ด ์›ํ•˜๋Š” ์กฐ๊ฑด์— ๋งž๋Š” ๋ชจ๋ธ์„ ์‰ฝ๊ฒŒ ์ฐพ์•„๋ณด์„ธ์š”!")
120
+
121
+ with gr.Tabs():
122
+ # ํƒญ 1: ๋ชจ๋ธ ๊ฒ€์ƒ‰
123
+ with gr.Tab("๐Ÿ” ๋ชจ๋ธ ๊ฒ€์ƒ‰"):
124
+ with gr.Row():
125
+ with gr.Column(scale=1):
126
+ gr.Markdown("### ๊ฒ€์ƒ‰ ์กฐ๊ฑด")
127
+
128
+ search_query = gr.Textbox(
129
+ label="๊ฒ€์ƒ‰์–ด",
130
+ placeholder="์˜ˆ: korean, sentiment, bert",
131
+ value=""
132
+ )
133
+
134
+ task_filter = gr.Dropdown(
135
+ label="ํƒœ์Šคํฌ",
136
+ choices=[
137
+ "all", "text-classification", "token-classification",
138
+ "question-answering", "fill-mask", "summarization",
139
+ "translation", "text-generation", "conversational"
140
+ ],
141
+ value="all"
142
+ )
143
+
144
+ language_filter = gr.Dropdown(
145
+ label="์–ธ์–ด",
146
+ choices=["all", "ko", "en", "multilingual", "zh", "ja", "es", "fr"],
147
+ value="all"
148
+ )
149
+
150
+ license_filter = gr.Dropdown(
151
+ label="๋ผ์ด์„ ์Šค",
152
+ choices=["all", "apache-2.0", "mit", "cc-by-4.0", "cc-by-nc-4.0"],
153
+ value="all"
154
+ )
155
+
156
+ sort_by = gr.Dropdown(
157
+ label="์ •๋ ฌ ๊ธฐ์ค€",
158
+ choices=["downloads", "likes", "lastModified"],
159
+ value="downloads"
160
+ )
161
+
162
+ max_results = gr.Slider(
163
+ label="์ตœ๋Œ€ ๊ฒฐ๊ณผ ์ˆ˜",
164
+ minimum=5,
165
+ maximum=50,
166
+ value=20,
167
+ step=5
168
+ )
169
+
170
+ search_btn = gr.Button("๐Ÿ” ๊ฒ€์ƒ‰ํ•˜๊ธฐ", variant="primary")
171
+
172
+ with gr.Column(scale=2):
173
+ gr.Markdown("### ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ")
174
+ results_table = gr.Dataframe(
175
+ headers=["Model Name", "Task", "Downloads", "Likes", "Updated", "License"],
176
+ interactive=False,
177
+ wrap=True
178
+ )
179
+
180
+ # ํƒญ 2: ๋ชจ๋ธ ์ƒ์„ธ ์ •๋ณด
181
+ with gr.Tab("๐Ÿ“‹ ๋ชจ๋ธ ์ƒ์„ธ ์ •๋ณด"):
182
+ with gr.Row():
183
+ with gr.Column(scale=1):
184
+ model_name_input = gr.Textbox(
185
+ label="๋ชจ๋ธ๋ช…",
186
+ placeholder="์˜ˆ: klue/bert-base",
187
+ info="Hugging Face์˜ ์ •ํ™•ํ•œ ๋ชจ๋ธ๋ช…์„ ์ž…๋ ฅํ•˜์„ธ์š”"
188
+ )
189
+ detail_btn = gr.Button("๐Ÿ“‹ ์ƒ์„ธ ์ •๋ณด ๋ณด๊ธฐ", variant="primary")
190
+
191
+ with gr.Column(scale=2):
192
+ model_details = gr.Markdown("๋ชจ๋ธ๋ช…์„ ์ž…๋ ฅํ•˜๊ณ  ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์„ธ์š”.")
193
+
194
+ # ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ
195
+ search_btn.click(
196
+ fn=search_models,
197
+ inputs=[search_query, task_filter, language_filter, license_filter, sort_by, max_results],
198
+ outputs=results_table
199
+ )
200
+
201
+ detail_btn.click(
202
+ fn=get_model_details,
203
+ inputs=model_name_input,
204
+ outputs=model_details
205
+ )
206
+
207
+ # ์‚ฌ์šฉ๋ฒ• ์•ˆ๋‚ด
208
+ gr.Markdown("""
209
+ ### ๐Ÿ’ก ์‚ฌ์šฉ ํŒ
210
+
211
+ **๊ฒ€์ƒ‰ ํƒญ:**
212
+ - ๊ฒ€์ƒ‰์–ด์— ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ํ•„ํ„ฐ๋ฅผ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜์„ธ์š”
213
+ - ๋‹ค์šด๋กœ๋“œ ์ˆ˜๊ฐ€ ๋งŽ์€ ๋ชจ๋ธ์ผ์ˆ˜๋ก ์•ˆ์ •์ ์ด๊ณ  ๋ฌธ์„œํ™”๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ์–ด์š”
214
+ - ๋ผ์ด์„ ์Šค๋ฅผ ํ™•์ธํ•ด์„œ ์ƒ์—…์  ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜์„ธ์š”
215
+
216
+ **์ƒ์„ธ ์ •๋ณด ํƒญ:**
217
+ - ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์—์„œ ๊ด€์‹ฌ ์žˆ๋Š” ๋ชจ๋ธ๋ช…์„ ๋ณต์‚ฌํ•ด์„œ ๋ถ™์—ฌ๋„ฃ์œผ์„ธ์š”
218
+ - ์‚ฌ์šฉ ์˜ˆ์ œ ์ฝ”๋“œ๋„ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค
219
+
220
+ **์ถ”์ฒœ ๊ฒ€์ƒ‰ ์กฐํ•ฉ:**
221
+ - ํ•œ๊ตญ์–ด ๊ฐ์ •๋ถ„์„: language=ko, task=text-classification, ๊ฒ€์ƒ‰์–ด=sentiment
222
+ - ์˜์–ด ์งˆ์˜์‘๋‹ต: language=en, task=question-answering
223
+ - ์ƒ์—…์  ์‚ฌ์šฉ ๊ฐ€๋Šฅ: license=apache-2.0 ๋˜๋Š” mit
224
+ """)
225
+
226
+ if __name__ == "__main__":
227
+ demo.launch()
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ gradio
2
+ huggingface_hub
3
+ pandas
4
+ requests