Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -2,7 +2,6 @@ import gradio as gr
|
|
| 2 |
from gradio_leaderboard import Leaderboard, ColumnFilter, SelectColumns
|
| 3 |
import pandas as pd
|
| 4 |
from apscheduler.schedulers.background import BackgroundScheduler
|
| 5 |
-
from huggingface_hub import snapshot_download
|
| 6 |
import os
|
| 7 |
import json
|
| 8 |
from transformers import AutoModelForCausalLM, AutoTokenizer
|
|
@@ -89,43 +88,43 @@ def get_leaderboard_df(eval_results_path: str, eval_requests_path: str, cols: li
|
|
| 89 |
# 这里我们不再尝试从文件读取,直接生成模拟数据
|
| 90 |
all_results = [
|
| 91 |
{
|
| 92 |
-
"
|
| 93 |
-
"
|
| 94 |
-
"
|
| 95 |
-
"
|
| 96 |
-
"
|
| 97 |
-
"
|
| 98 |
-
"
|
| 99 |
-
"
|
| 100 |
-
"
|
| 101 |
-
"
|
| 102 |
-
"
|
| 103 |
},
|
| 104 |
{
|
| 105 |
-
"
|
| 106 |
-
"
|
| 107 |
-
"
|
| 108 |
-
"
|
| 109 |
-
"
|
| 110 |
-
"
|
| 111 |
-
"
|
| 112 |
-
"
|
| 113 |
-
"
|
| 114 |
-
"
|
| 115 |
-
"
|
| 116 |
},
|
| 117 |
{
|
| 118 |
-
"
|
| 119 |
-
"
|
| 120 |
-
"
|
| 121 |
-
"
|
| 122 |
-
"
|
| 123 |
-
"
|
| 124 |
-
"
|
| 125 |
-
"
|
| 126 |
-
"
|
| 127 |
-
"
|
| 128 |
-
"
|
| 129 |
}
|
| 130 |
]
|
| 131 |
df = pd.DataFrame(all_results)
|
|
@@ -144,8 +143,6 @@ def get_evaluation_queue_df(eval_requests_path: str, eval_cols: list):
|
|
| 144 |
# 假设 src.envs 中的 API, EVAL_REQUESTS_PATH, EVAL_RESULTS_PATH, QUEUE_REPO, REPO_ID, RESULTS_REPO, TOKEN 可用
|
| 145 |
# 如果 TOKEN 未在 src.envs 中定义,您需要在 Hugging Face Space Secrets 中设置 HF_TOKEN。
|
| 146 |
# 这里为了能运行,我们直接使用 os.getenv 获取 TOKEN。
|
| 147 |
-
# from src.envs import API, EVAL_REQUESTS_PATH, EVAL_RESULTS_PATH, QUEUE_REPO, REPO_ID, RESULTS_REPO, TOKEN
|
| 148 |
-
# 这里需要调整为从环境变量读取,以适应 Hugging Face Space 的最佳实践
|
| 149 |
TOKEN = os.getenv("HF_TOKEN") # 确保您的 Space Secrets 中设置了 HF_TOKEN
|
| 150 |
# 假设这些路径是可写的,但在此场景下,我们不再依赖它们来存储评估结果
|
| 151 |
EVAL_REQUESTS_PATH = "./eval_requests"
|
|
@@ -162,6 +159,7 @@ class MockSubmit:
|
|
| 162 |
|
| 163 |
API = MockAPI()
|
| 164 |
add_new_eval = MockSubmit().add_new_eval
|
|
|
|
| 165 |
|
| 166 |
# 预加载模型和分词器
|
| 167 |
# 考虑到免费 Space 的资源限制,这里选择较小的模型
|
|
@@ -212,11 +210,14 @@ load_models()
|
|
| 212 |
# 模型生成函数
|
| 213 |
def generate_text(prompt, max_new_tokens=100):
|
| 214 |
outputs = {}
|
| 215 |
-
for
|
|
|
|
|
|
|
|
|
|
|
|
|
| 216 |
if model_data: # 确保模型已成功加载
|
| 217 |
model = model_data["model"]
|
| 218 |
tokenizer = model_data["tokenizer"]
|
| 219 |
-
model_name = model_data["name"]
|
| 220 |
|
| 221 |
try:
|
| 222 |
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
|
|
@@ -237,8 +238,11 @@ def generate_text(prompt, max_new_tokens=100):
|
|
| 237 |
except Exception as e:
|
| 238 |
outputs[model_name] = f"生成失败: {e}"
|
| 239 |
else:
|
| 240 |
-
outputs[
|
| 241 |
-
|
|
|
|
|
|
|
|
|
|
| 242 |
|
| 243 |
# 更新排行榜数据函数
|
| 244 |
def update_leaderboard(g_score, r_score, a_score, c_score, e_score, model_idx):
|
|
@@ -246,9 +250,9 @@ def update_leaderboard(g_score, r_score, a_score, c_score, e_score, model_idx):
|
|
| 246 |
# 假设模型的索引与 MODELS_TO_COMPARE 列表中的顺序一致
|
| 247 |
# 在实际应用中,您可能需要更健壮的方式来匹配模型
|
| 248 |
if model_idx is not None and 0 <= model_idx < len(MODELS_TO_COMPARE):
|
| 249 |
-
|
| 250 |
# 找到 DataFrame 中对应的行
|
| 251 |
-
row_index = LEADERBOARD_DF[LEADERBOARD_DF['Model'] ==
|
| 252 |
if not row_index.empty:
|
| 253 |
# 更新 GRACE 分数 (这里假设是从 0.0-1.0 的分数,Gradio 滑块可能输出 0-100)
|
| 254 |
# 如果 Gradio 滑块输出 0-100,需要除以 100 转换为 0-1.0
|
|
@@ -257,8 +261,8 @@ def update_leaderboard(g_score, r_score, a_score, c_score, e_score, model_idx):
|
|
| 257 |
LEADERBOARD_DF.loc[row_index, 'A: 创新表现力'] = a_score / 100.0
|
| 258 |
LEADERBOARD_DF.loc[row_index, 'C: 一致性'] = c_score / 100.0
|
| 259 |
LEADERBOARD_DF.loc[row_index, 'E: 效率性'] = e_score / 100.0
|
| 260 |
-
# 重新排序排行榜 (
|
| 261 |
-
LEADERBOARD_DF = LEADERBOARD_DF.sort_values(by=
|
| 262 |
return LEADERBOARD_DF
|
| 263 |
return LEADERBOARD_DF # 返回更新后的 DataFrame
|
| 264 |
|
|
@@ -284,7 +288,7 @@ def init_leaderboard(dataframe):
|
|
| 284 |
hide_columns=[c.name for c in fields(AutoEvalColumn) if c.hidden],
|
| 285 |
filter_columns=[],
|
| 286 |
bool_checkboxgroup_label="隐藏模型",
|
| 287 |
-
interactive=False,
|
| 288 |
)
|
| 289 |
|
| 290 |
return Leaderboard(
|
|
@@ -353,7 +357,7 @@ def init_leaderboard(dataframe):
|
|
| 353 |
),
|
| 354 |
],
|
| 355 |
bool_checkboxgroup_label="隐藏模型",
|
| 356 |
-
interactive=False,
|
| 357 |
)
|
| 358 |
|
| 359 |
|
|
@@ -388,7 +392,8 @@ with demo:
|
|
| 388 |
model_selector = gr.Dropdown(
|
| 389 |
choices=[(m["name"], idx) for idx, m in enumerate(MODELS_TO_COMPARE)],
|
| 390 |
label="选择要评估的模型",
|
| 391 |
-
interactive=True
|
|
|
|
| 392 |
)
|
| 393 |
|
| 394 |
# GRACE 维度滑块
|
|
@@ -401,6 +406,9 @@ with demo:
|
|
| 401 |
|
| 402 |
update_grace_button = gr.Button("更新 GRACE 评分到排行榜")
|
| 403 |
|
|
|
|
|
|
|
|
|
|
| 404 |
# 更新排行榜的逻辑
|
| 405 |
update_grace_button.click(
|
| 406 |
fn=update_leaderboard,
|
|
@@ -417,7 +425,8 @@ with demo:
|
|
| 417 |
|
| 418 |
|
| 419 |
with gr.TabItem("🏅 LLM Benchmark", elem_id="llm-benchmark-tab-table", id=1): # 调整 ID
|
| 420 |
-
|
|
|
|
| 421 |
|
| 422 |
with gr.TabItem("📝 关于", elem_id="llm-benchmark-tab-table", id=2):
|
| 423 |
gr.Markdown(LLM_BENCHMARKS_TEXT, elem_classes="markdown-text")
|
|
@@ -425,10 +434,6 @@ with demo:
|
|
| 425 |
with gr.TabItem("🚀 在此提交!", elem_id="llm-benchmark-tab-table", id=3): # 这个标签页保留,但内容将被简化
|
| 426 |
gr.Markdown("## 在此演示中,模型已预先加载进行比较,无需提交新模型。", elem_classes="markdown-text")
|
| 427 |
gr.Markdown("您可以在 **💬 模型比较与生成** 标签页中输入提示词并评估模型。", elem_classes="markdown-text")
|
| 428 |
-
# 移除所有提交相关的 UI 元素和逻辑
|
| 429 |
-
# 但是由于需要保持 add_new_eval 的引用,我们让它返回一个字符串
|
| 430 |
-
# gr.Textbox(label="模型名称") # 示例:保留一个文本框,但它不会做任何事情
|
| 431 |
-
# gr.Button("提交评估").click(fn=add_new_eval, inputs=[], outputs=[gr.Markdown()])
|
| 432 |
gr.Markdown("(本页面仅用于保留原始结构,实际提交功能已禁用)")
|
| 433 |
|
| 434 |
|
|
|
|
| 2 |
from gradio_leaderboard import Leaderboard, ColumnFilter, SelectColumns
|
| 3 |
import pandas as pd
|
| 4 |
from apscheduler.schedulers.background import BackgroundScheduler
|
|
|
|
| 5 |
import os
|
| 6 |
import json
|
| 7 |
from transformers import AutoModelForCausalLM, AutoTokenizer
|
|
|
|
| 88 |
# 这里我们不再尝试从文件读取,直接生成模拟数据
|
| 89 |
all_results = [
|
| 90 |
{
|
| 91 |
+
"Model": "Gemma 2B Instruct", # 使用友好的名称
|
| 92 |
+
"Model type": ModelType.LanguageModeling.to_str(),
|
| 93 |
+
"Precision": Precision.float16.value.name,
|
| 94 |
+
"Params (B)": 2.0,
|
| 95 |
+
"License": "apache-2.0",
|
| 96 |
+
"On Hub": True,
|
| 97 |
+
"G: 泛化性": 0.0, # 初始为0,等待用户输入
|
| 98 |
+
"R: 相关性": 0.0,
|
| 99 |
+
"A: 创新表现力": 0.0,
|
| 100 |
+
"C: 一致性": 0.0,
|
| 101 |
+
"E: 效率性": 0.0,
|
| 102 |
},
|
| 103 |
{
|
| 104 |
+
"Model": "Phi-2", # 使用友好的名称
|
| 105 |
+
"Model type": ModelType.LanguageModeling.to_str(),
|
| 106 |
+
"Precision": Precision.float16.value.name,
|
| 107 |
+
"Params (B)": 2.7,
|
| 108 |
+
"License": "mit",
|
| 109 |
+
"On Hub": True,
|
| 110 |
+
"G: 泛化性": 0.0,
|
| 111 |
+
"R: 相关性": 0.0,
|
| 112 |
+
"A: 创新表现力": 0.0,
|
| 113 |
+
"C: 一致性": 0.0,
|
| 114 |
+
"E: 效率性": 0.0,
|
| 115 |
},
|
| 116 |
{
|
| 117 |
+
"Model": "GPT-Neo 125M", # 使用友好的名称
|
| 118 |
+
"Model type": ModelType.LanguageModeling.to_str(),
|
| 119 |
+
"Precision": Precision.float16.value.name,
|
| 120 |
+
"Params (B)": 0.125,
|
| 121 |
+
"License": "apache-2.0",
|
| 122 |
+
"On Hub": True,
|
| 123 |
+
"G: 泛化性": 0.0,
|
| 124 |
+
"R: 相关性": 0.0,
|
| 125 |
+
"A: 创新表现力": 0.0,
|
| 126 |
+
"C: 一致性": 0.0,
|
| 127 |
+
"E: 效率性": 0.0,
|
| 128 |
}
|
| 129 |
]
|
| 130 |
df = pd.DataFrame(all_results)
|
|
|
|
| 143 |
# 假设 src.envs 中的 API, EVAL_REQUESTS_PATH, EVAL_RESULTS_PATH, QUEUE_REPO, REPO_ID, RESULTS_REPO, TOKEN 可用
|
| 144 |
# 如果 TOKEN 未在 src.envs 中定义,您需要在 Hugging Face Space Secrets 中设置 HF_TOKEN。
|
| 145 |
# 这里为了能运行,我们直接使用 os.getenv 获取 TOKEN。
|
|
|
|
|
|
|
| 146 |
TOKEN = os.getenv("HF_TOKEN") # 确保您的 Space Secrets 中设置了 HF_TOKEN
|
| 147 |
# 假设这些路径是可写的,但在此场景下,我们不再依赖它们来存储评估结果
|
| 148 |
EVAL_REQUESTS_PATH = "./eval_requests"
|
|
|
|
| 159 |
|
| 160 |
API = MockAPI()
|
| 161 |
add_new_eval = MockSubmit().add_new_eval
|
| 162 |
+
REPO_ID = os.getenv("HF_SPACE_ID", "your-org/your-space-name") # 从环境变量获取 Space ID,或者设置默认值
|
| 163 |
|
| 164 |
# 预加载模型和分词器
|
| 165 |
# 考虑到免费 Space 的资源限制,这里选择较小的模型
|
|
|
|
| 210 |
# 模型生成函数
|
| 211 |
def generate_text(prompt, max_new_tokens=100):
|
| 212 |
outputs = {}
|
| 213 |
+
for model_info in MODELS_TO_COMPARE: # 迭代 MODELS_TO_COMPARE 确保顺序和输出框对应
|
| 214 |
+
model_id = model_info["id"]
|
| 215 |
+
model_name = model_info["name"]
|
| 216 |
+
model_data = loaded_models.get(model_id) # 从 loaded_models 获取数据
|
| 217 |
+
|
| 218 |
if model_data: # 确保模型已成功加载
|
| 219 |
model = model_data["model"]
|
| 220 |
tokenizer = model_data["tokenizer"]
|
|
|
|
| 221 |
|
| 222 |
try:
|
| 223 |
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
|
|
|
|
| 238 |
except Exception as e:
|
| 239 |
outputs[model_name] = f"生成失败: {e}"
|
| 240 |
else:
|
| 241 |
+
outputs[model_name] = "模型未加载或加载失败。"
|
| 242 |
+
|
| 243 |
+
# 按照 MODELS_TO_COMPARE 的顺序返回结果
|
| 244 |
+
ordered_outputs = [outputs.get(m["name"], "模型未加载或加载失败。") for m in MODELS_TO_COMPARE]
|
| 245 |
+
return ordered_outputs # 返回一个列表,对应多个输出框
|
| 246 |
|
| 247 |
# 更新排行榜数据函数
|
| 248 |
def update_leaderboard(g_score, r_score, a_score, c_score, e_score, model_idx):
|
|
|
|
| 250 |
# 假设模型的索引与 MODELS_TO_COMPARE 列表中的顺序一致
|
| 251 |
# 在实际应用中,您可能需要更健壮的方式来匹配模型
|
| 252 |
if model_idx is not None and 0 <= model_idx < len(MODELS_TO_COMPARE):
|
| 253 |
+
model_name_to_update = MODELS_TO_COMPARE[model_idx]["name"]
|
| 254 |
# 找到 DataFrame 中对应的行
|
| 255 |
+
row_index = LEADERBOARD_DF[LEADERBOARD_DF['Model'] == model_name_to_update].index
|
| 256 |
if not row_index.empty:
|
| 257 |
# 更新 GRACE 分数 (这里假设是从 0.0-1.0 的分数,Gradio 滑块可能输出 0-100)
|
| 258 |
# 如果 Gradio 滑块输出 0-100,需要除以 100 转换为 0-1.0
|
|
|
|
| 261 |
LEADERBOARD_DF.loc[row_index, 'A: 创新表现力'] = a_score / 100.0
|
| 262 |
LEADERBOARD_DF.loc[row_index, 'C: 一致性'] = c_score / 100.0
|
| 263 |
LEADERBOARD_DF.loc[row_index, 'E: 效率性'] = e_score / 100.0
|
| 264 |
+
# 重新排序排行榜 (如果需要根据某个分数排序,例如泛化性)
|
| 265 |
+
LEADERBOARD_DF = LEADERBOARD_DF.sort_values(by="G: 泛化性", ascending=False).reset_index(drop=True)
|
| 266 |
return LEADERBOARD_DF
|
| 267 |
return LEADERBOARD_DF # 返回更新后的 DataFrame
|
| 268 |
|
|
|
|
| 288 |
hide_columns=[c.name for c in fields(AutoEvalColumn) if c.hidden],
|
| 289 |
filter_columns=[],
|
| 290 |
bool_checkboxgroup_label="隐藏模型",
|
| 291 |
+
interactive=False, # 设置为非交互式
|
| 292 |
)
|
| 293 |
|
| 294 |
return Leaderboard(
|
|
|
|
| 357 |
),
|
| 358 |
],
|
| 359 |
bool_checkboxgroup_label="隐藏模型",
|
| 360 |
+
interactive=False, # 设置为非交互式
|
| 361 |
)
|
| 362 |
|
| 363 |
|
|
|
|
| 392 |
model_selector = gr.Dropdown(
|
| 393 |
choices=[(m["name"], idx) for idx, m in enumerate(MODELS_TO_COMPARE)],
|
| 394 |
label="选择要评估的模型",
|
| 395 |
+
interactive=True,
|
| 396 |
+
value=MODELS_TO_COMPARE[0]["name"] if MODELS_TO_COMPARE else None # 默认选中第一个模型
|
| 397 |
)
|
| 398 |
|
| 399 |
# GRACE 维度滑块
|
|
|
|
| 406 |
|
| 407 |
update_grace_button = gr.Button("更新 GRACE 评分到排行榜")
|
| 408 |
|
| 409 |
+
# Leaderboard 组件需要在被引用的地方先定义
|
| 410 |
+
leaderboard = init_leaderboard(LEADERBOARD_DF) # 在这里初始化 Leaderboard 组件
|
| 411 |
+
|
| 412 |
# 更新排行榜的逻辑
|
| 413 |
update_grace_button.click(
|
| 414 |
fn=update_leaderboard,
|
|
|
|
| 425 |
|
| 426 |
|
| 427 |
with gr.TabItem("🏅 LLM Benchmark", elem_id="llm-benchmark-tab-table", id=1): # 调整 ID
|
| 428 |
+
# Leaderboard 已经在一开始初始化了,这里只是再次引用
|
| 429 |
+
leaderboard_display = leaderboard # 将初始化后的 Leaderboard 实例赋给一个新的变量以便在这里显示
|
| 430 |
|
| 431 |
with gr.TabItem("📝 关于", elem_id="llm-benchmark-tab-table", id=2):
|
| 432 |
gr.Markdown(LLM_BENCHMARKS_TEXT, elem_classes="markdown-text")
|
|
|
|
| 434 |
with gr.TabItem("🚀 在此提交!", elem_id="llm-benchmark-tab-table", id=3): # 这个标签页保留,但内容将被简化
|
| 435 |
gr.Markdown("## 在此演示中,模型已预先加载进行比较,无需提交新模型。", elem_classes="markdown-text")
|
| 436 |
gr.Markdown("您可以在 **💬 模型比较与生成** 标签页中输入提示词并评估模型。", elem_classes="markdown-text")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 437 |
gr.Markdown("(本页面仅用于保留原始结构,实际提交功能已禁用)")
|
| 438 |
|
| 439 |
|