linzhengyu commited on
Commit
c768dfc
·
1 Parent(s): 2576caa

remove leaderboard, replace by gradio components

Browse files
Files changed (2) hide show
  1. app.py +173 -40
  2. src/assets/css/custom.css +13 -0
app.py CHANGED
@@ -2,7 +2,6 @@ import gradio as gr
2
  import gradio.components as grc
3
  import pandas as pd
4
  from apscheduler.schedulers.background import BackgroundScheduler
5
- from gradio_leaderboard import ColumnFilter, Leaderboard, SelectColumns
6
  from huggingface_hub import snapshot_download
7
  from rich import print
8
 
@@ -78,44 +77,178 @@ LEADERBOARD_DF = get_leaderboard_df(
78
  ) = get_evaluation_queue_df(settings.EVAL_REQUESTS_PATH, EVAL_COLS)
79
 
80
 
81
- def init_leaderboard(dataframe: pd.DataFrame, cols: list[str]) -> Leaderboard:
82
- if dataframe is None or dataframe.empty:
83
- raise ValueError("Leaderboard DataFrame is empty or None.")
84
- # print("///// --- dataframe.head() --- /////", Markdown(dataframe.head().to_markdown() or "No data"))
85
- selected_columns = SelectColumns(
86
- default_selection=[c.name for c in fields(AutoEvalColumn) if c.displayed_by_default and c.name in cols],
87
- cant_deselect=[c.name for c in fields(AutoEvalColumn) if c.never_hidden and c.name in cols],
88
- label="Select Columns to Display:",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  )
90
- search_columns = [AutoEvalColumn.model.name, AutoEvalColumn.license.name]
91
- hidden_columns = [c.name for c in fields(AutoEvalColumn) if c.hidden and c.name in cols]
92
- filter_columns = [
93
- ColumnFilter(AutoEvalColumn.model_type.name, type="checkboxgroup", label="Model types"),
94
- ColumnFilter(AutoEvalColumn.precision.name, type="checkboxgroup", label="Precision"),
95
- ColumnFilter(
96
- AutoEvalColumn.params.name,
97
- type="slider",
98
- min=0.01,
99
- max=150,
100
- label="Select the number of parameters (B)",
101
- ),
102
- ColumnFilter(
103
- AutoEvalColumn.still_on_hub.name,
104
- type="boolean", # pyright: ignore[reportArgumentType]
105
- label="Deleted/incomplete",
106
- default=False,
107
- ),
108
- ]
109
- return Leaderboard(
110
- value=dataframe,
111
- datatype=[c.type for c in fields(AutoEvalColumn) if c.name in cols],
112
- select_columns=selected_columns,
113
- search_columns=search_columns,
114
- hide_columns=hidden_columns,
115
- filter_columns=filter_columns, # pyright: ignore[reportArgumentType]
116
- bool_checkboxgroup_label="Hide models",
117
- interactive=False,
118
  )
 
 
119
 
120
 
121
  demo = gr.Blocks(css_paths=[custom_css])
@@ -135,12 +268,12 @@ with demo:
135
  cols,
136
  benchmark_cols,
137
  )
138
- leaderboard = init_leaderboard(BENCHMARK_DF, cols)
139
 
140
- with gr.TabItem("📝 About", elem_id="llm-benchmark-tab-table", id=len(BENCHMARKS)):
141
  gr.Markdown(LLM_BENCHMARKS_TEXT, elem_classes="markdown-text")
142
 
143
- with gr.TabItem("🚀 Submit here! ", elem_id="llm-benchmark-tab-table", id=len(BENCHMARKS) + 1):
144
  with gr.Column():
145
  with gr.Row():
146
  gr.Markdown(EVALUATION_QUEUE_TEXT, elem_classes="markdown-text")
 
2
  import gradio.components as grc
3
  import pandas as pd
4
  from apscheduler.schedulers.background import BackgroundScheduler
 
5
  from huggingface_hub import snapshot_download
6
  from rich import print
7
 
 
77
  ) = get_evaluation_queue_df(settings.EVAL_REQUESTS_PATH, EVAL_COLS)
78
 
79
 
80
+ def filter_dataframe_by_columns(selected_cols: list[str], original_df: pd.DataFrame) -> pd.DataFrame:
81
+ """
82
+ 根据选择的列过滤 DataFrame
83
+ """
84
+ # 始终包含基础列 'T' 和 'Model'
85
+ base_cols = ['T', 'Model']
86
+ all_selected_cols = [col for col in base_cols if col in original_df.columns]
87
+
88
+ # 添加用户选择的列(排除已存在的基础列)
89
+ for col in selected_cols:
90
+ if col in original_df.columns and col not in all_selected_cols:
91
+ all_selected_cols.append(col)
92
+
93
+ # 确保列的顺序:基础列在前,然后是按原始顺序的选中列
94
+ ordered_cols = []
95
+ for col in original_df.columns:
96
+ if col in all_selected_cols:
97
+ ordered_cols.append(col)
98
+
99
+ # 确保总是返回 DataFrame,即使是单列也使用 [[]] 来保持 DataFrame 类型
100
+ if ordered_cols:
101
+ filtered_df = original_df.loc[:, ordered_cols]
102
+ else:
103
+ filtered_df = original_df
104
+ return filtered_df
105
+
106
+
107
+ def filter_dataframe_by_precision(selected_precisions: list[str], df: pd.DataFrame) -> pd.DataFrame:
108
+ """
109
+ 根据选择的 precision 筛选 DataFrame
110
+ 如果没有选择 precision,返回空的 DataFrame
111
+ """
112
+ if not selected_precisions:
113
+ return df.iloc[0:0].copy() # 返回相同结构但为空的 DataFrame
114
+
115
+ precision_col = AutoEvalColumn.precision.name
116
+ if precision_col not in df.columns:
117
+ return df
118
+
119
+ # 筛选包含任一选定 precision 的行
120
+ mask = df[precision_col].isin(selected_precisions)
121
+ filtered_df = df.loc[mask, :]
122
+ return filtered_df
123
+
124
+
125
+ def search_models_in_dataframe(search_text: str, df: pd.DataFrame) -> pd.DataFrame:
126
+ """
127
+ 在 DataFrame 中搜索包含关键词的 Model 名称
128
+ 支持逗号分隔的多个关键词,匹配包含任一关键词的行
129
+ """
130
+ if not search_text or not search_text.strip():
131
+ return df
132
+
133
+ # 分割逗号,去除空白并转换为小写用于匹配
134
+ import re
135
+
136
+ keywords = [keyword.strip().lower() for keyword in search_text.split(',') if keyword.strip()]
137
+ if not keywords:
138
+ return df
139
+
140
+ if 'Model' not in df.columns:
141
+ return df
142
+
143
+ # 匹配函数:从 HTML 中提取纯文本并检查是否包含关键词
144
+ def matches_search(model_cell):
145
+ if pd.isna(model_cell):
146
+ return False
147
+
148
+ # 从 HTML 链接中提取纯文本(model_name)
149
+ # 格式: <a ...>model_name</a> 或直接是文本
150
+ text = str(model_cell)
151
+
152
+ # 提取 HTML 标签内的文本
153
+ # 匹配 <a>...</a> 标签内的内容,或直接使用文本
154
+ match = re.search(r'<a[^>]*>([^<]+)</a>', text, re.IGNORECASE)
155
+ if match:
156
+ model_name = match.group(1).lower()
157
+ else:
158
+ model_name = text.lower()
159
+
160
+ # 检查是否包含任一关键词
161
+ return any(keyword in model_name for keyword in keywords)
162
+
163
+ # 应用搜索过滤
164
+ mask = df['Model'].apply(matches_search)
165
+ filtered_df = df.loc[mask, :]
166
+ return filtered_df
167
+
168
+
169
+ def init_leaderboard_tabs(dataframe: pd.DataFrame, cols: list[str]):
170
+ # 存储原始 DataFrame 以便后续过滤使用(使用闭包保存)
171
+ original_df = dataframe.copy()
172
+
173
+ available_precisions = sorted(original_df["Precision"].dropna().unique().tolist())
174
+ default_precision = ['bfloat16'] if 'bfloat16' in available_precisions else (available_precisions[:1] if available_precisions else [])
175
+
176
+ # 初始化显示的列(包含基础列和默认选中的列)
177
+ default_selected = [col for col in dataframe.columns if col in cols] + ['Average ⬆️']
178
+
179
+ # 先按 precision 筛选 original_df
180
+ precision_filtered_df = filter_dataframe_by_precision(default_precision, original_df)
181
+ # 根据默认选择再筛选一次 DataFrame
182
+ initial_filtered_df = filter_dataframe_by_columns(default_selected, precision_filtered_df)
183
+
184
+ with gr.Row():
185
+ with gr.Column(scale=1):
186
+ search = gr.Textbox(label="Search", placeholder="Separate multiple queries with commas")
187
+ show_columns = gr.CheckboxGroup(
188
+ choices=[col for col in dataframe.columns if col not in ['T', 'Model']],
189
+ label="Select Columns to Display",
190
+ value=default_selected,
191
+ interactive=True,
192
+ )
193
+ with gr.Column(scale=1):
194
+ model_type = gr.CheckboxGroup(
195
+ [],
196
+ label="Model Type",
197
+ value=[],
198
+ )
199
+ precision = gr.CheckboxGroup(
200
+ choices=available_precisions,
201
+ label="Precision",
202
+ value=default_precision,
203
+ interactive=True,
204
+ )
205
+ hide_models = gr.CheckboxGroup(
206
+ ['Deleted/incomplete'],
207
+ label="Hide Models",
208
+ value=['Deleted/incomplete'],
209
+ interactive=True,
210
+ )
211
+
212
+ with gr.Row():
213
+ with gr.Column(scale=3):
214
+ leaderboard = gr.Dataframe(
215
+ value=initial_filtered_df, # 使用初始筛选后的 DataFrame
216
+ interactive=False,
217
+ wrap=False,
218
+ datatype='markdown',
219
+ elem_id="auto-width-dataframe",
220
+ )
221
+
222
+ # 统一的更新函数:同时处理 precision、列筛选和搜索
223
+ def update_dataframe(search_text: str, selected_cols: list[str], selected_precisions: list[str]):
224
+ # 先按 precision 筛选 original_df
225
+ precision_filtered_df = filter_dataframe_by_precision(selected_precisions, original_df)
226
+ # 再按列筛选
227
+ column_filtered_df = filter_dataframe_by_columns(selected_cols, precision_filtered_df)
228
+ # 最后按搜索关键词筛选
229
+ final_df = search_models_in_dataframe(search_text, column_filtered_df)
230
+ return final_df
231
+
232
+ # 绑定搜索、列选择和 precision 的变化事件,动态更新 DataFrame
233
+ search.change(
234
+ fn=update_dataframe,
235
+ inputs=[search, show_columns, precision],
236
+ outputs=leaderboard,
237
+ )
238
+
239
+ show_columns.change(
240
+ fn=update_dataframe,
241
+ inputs=[search, show_columns, precision],
242
+ outputs=leaderboard,
243
  )
244
+
245
+ precision.change(
246
+ fn=update_dataframe,
247
+ inputs=[search, show_columns, precision],
248
+ outputs=leaderboard,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
249
  )
250
+
251
+ return leaderboard
252
 
253
 
254
  demo = gr.Blocks(css_paths=[custom_css])
 
268
  cols,
269
  benchmark_cols,
270
  )
271
+ leaderboard = init_leaderboard_tabs(BENCHMARK_DF, benchmark_cols)
272
 
273
+ with gr.TabItem("📝 About", elem_id="about-tab", id=len(BENCHMARKS)):
274
  gr.Markdown(LLM_BENCHMARKS_TEXT, elem_classes="markdown-text")
275
 
276
+ with gr.TabItem("🚀 Submit here! ", elem_id="submit-tab", id=len(BENCHMARKS) + 1):
277
  with gr.Column():
278
  with gr.Row():
279
  gr.Markdown(EVALUATION_QUEUE_TEXT, elem_classes="markdown-text")
src/assets/css/custom.css CHANGED
@@ -92,3 +92,16 @@
92
  #box-filter > .form{
93
  border: 0
94
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
  #box-filter > .form{
93
  border: 0
94
  }
95
+
96
+ /* Auto-width DataFrame: single line per column, width based on content */
97
+ #auto-width-dataframe table {
98
+ table-layout: auto !important;
99
+ width: auto !important;
100
+ }
101
+
102
+ #auto-width-dataframe td,
103
+ #auto-width-dataframe th {
104
+ white-space: nowrap !important;
105
+ overflow: hidden !important;
106
+ text-overflow: ellipsis !important;
107
+ }