Spaces:
Running
Running
Enhance download_openbench and build_leadearboard_df functions with improved error handling and logging; standardize model data processing and add fallback example models
Browse files- src/leaderboard/build_leaderboard.py +117 -61
src/leaderboard/build_leaderboard.py
CHANGED
@@ -63,14 +63,17 @@ def download_dataset(repo_id, local_dir, repo_type="dataset", max_attempts=3, ba
|
|
63 |
|
64 |
|
65 |
def download_openbench():
|
66 |
-
|
|
|
|
|
|
|
67 |
try:
|
68 |
download_dataset(METAINFO_REPO, DATA_PATH)
|
69 |
logging.info("Successfully downloaded leaderboard metainfo data")
|
70 |
except Exception as e:
|
71 |
logging.error(f"Failed to download leaderboard metainfo: {e}")
|
72 |
|
73 |
-
#
|
74 |
try:
|
75 |
download_dataset(RESULTS_REPO, "m_data")
|
76 |
logging.info("Successfully downloaded model evaluation results")
|
@@ -79,81 +82,134 @@ def download_openbench():
|
|
79 |
|
80 |
|
81 |
def build_leadearboard_df():
|
|
|
|
|
|
|
|
|
82 |
results = []
|
|
|
83 |
|
84 |
-
#
|
85 |
try:
|
86 |
-
|
87 |
-
data = json.load(f)
|
88 |
-
|
89 |
-
# Извлекаем только комбинированные результаты
|
90 |
-
for key, value in data.items():
|
91 |
-
if "_Combined_" in key:
|
92 |
-
result = {
|
93 |
-
"model": value["model_name"],
|
94 |
-
"score": value["score"],
|
95 |
-
"math_score": value["math_score"],
|
96 |
-
"physics_score": value["physics_score"],
|
97 |
-
"total_tokens": value["total_tokens"],
|
98 |
-
"evaluation_time": value["evaluation_time"],
|
99 |
-
"system_prompt": value["system_prompt"]
|
100 |
-
}
|
101 |
-
results.append(result)
|
102 |
-
logging.info(f"Loaded {len(results)} models from local results file")
|
103 |
-
except Exception as e:
|
104 |
-
logging.error(f"Failed to load local model results: {e}")
|
105 |
-
|
106 |
-
# Попытка загрузить сохраненные данные лидерборда
|
107 |
-
try:
|
108 |
-
leaderboard_path = f"{os.path.abspath(DATA_PATH)}/leaderboard.json"
|
109 |
if os.path.exists(leaderboard_path):
|
110 |
with open(leaderboard_path, "r", encoding="utf-8") as eval_file:
|
111 |
saved_data = json.load(eval_file)
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
119 |
except Exception as e:
|
120 |
logging.error(f"Failed to load saved leaderboard data: {e}")
|
121 |
|
122 |
-
# Загружаем модели из директории внешних моделей
|
123 |
try:
|
124 |
-
|
125 |
-
|
126 |
-
|
|
|
127 |
try:
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
"
|
135 |
-
|
136 |
-
|
137 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
138 |
"system_prompt": data.get("system_prompt", "Вы - полезный помощник по математике и физике. Ответьте на русском языке.")
|
139 |
}
|
140 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
141 |
except Exception as e:
|
142 |
-
logging.error(f"Failed to parse {file}: {e}")
|
|
|
143 |
except Exception as e:
|
144 |
logging.error(f"Failed to process external model data: {e}")
|
145 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
146 |
# Создаем DataFrame и сортируем по общему баллу
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
df[numeric_cols] = df[numeric_cols].round(3)
|
154 |
-
|
155 |
-
|
156 |
-
else:
|
157 |
-
# Если нет результатов, возвращаем пустой DataFrame с нужными столбцами
|
158 |
-
return pd.DataFrame(columns=['model', 'score', 'math_score', 'physics_score',
|
159 |
-
'total_tokens', 'evaluation_time', 'system_prompt'])
|
|
|
63 |
|
64 |
|
65 |
def download_openbench():
|
66 |
+
"""
|
67 |
+
Скачивает необходимые данные для лидерборда из репозиториев HuggingFace
|
68 |
+
"""
|
69 |
+
# Скачиваем метаданные лидерборда
|
70 |
try:
|
71 |
download_dataset(METAINFO_REPO, DATA_PATH)
|
72 |
logging.info("Successfully downloaded leaderboard metainfo data")
|
73 |
except Exception as e:
|
74 |
logging.error(f"Failed to download leaderboard metainfo: {e}")
|
75 |
|
76 |
+
# Скачиваем результаты моделей
|
77 |
try:
|
78 |
download_dataset(RESULTS_REPO, "m_data")
|
79 |
logging.info("Successfully downloaded model evaluation results")
|
|
|
82 |
|
83 |
|
84 |
def build_leadearboard_df():
|
85 |
+
"""
|
86 |
+
Функция для сбора данных лидерборда из всех доступных источников.
|
87 |
+
Гарантирует, что в лидерборде будет только одна запись для каждой модели (с наивысшим score).
|
88 |
+
"""
|
89 |
results = []
|
90 |
+
best_model_results = {} # Словарь для отслеживания лучших результатов моделей
|
91 |
|
92 |
+
# 1. Пытаемся загрузить данные из метаинформации лидерборда
|
93 |
try:
|
94 |
+
leaderboard_path = os.path.join(DATA_PATH, "leaderboard.json")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
95 |
if os.path.exists(leaderboard_path):
|
96 |
with open(leaderboard_path, "r", encoding="utf-8") as eval_file:
|
97 |
saved_data = json.load(eval_file)
|
98 |
+
if saved_data:
|
99 |
+
logging.info(f"Loaded {len(saved_data)} models from saved leaderboard data")
|
100 |
+
|
101 |
+
# Обрабатываем каждую модель, сохраняя только лучший результат
|
102 |
+
for item in saved_data:
|
103 |
+
try:
|
104 |
+
# Получаем имя модели, проверяя разные возможные ключи
|
105 |
+
model_name = item.get("model_name", item.get("model", ""))
|
106 |
+
if not model_name:
|
107 |
+
continue
|
108 |
+
|
109 |
+
# Стандартизируем данные
|
110 |
+
model_data = {
|
111 |
+
"model": model_name,
|
112 |
+
"score": float(item.get("score", 0.0)),
|
113 |
+
"math_score": float(item.get("math_score", 0.0)),
|
114 |
+
"physics_score": float(item.get("physics_score", 0.0)),
|
115 |
+
"total_tokens": int(item.get("total_tokens", 0)),
|
116 |
+
"evaluation_time": float(item.get("evaluation_time", 0.0)),
|
117 |
+
"system_prompt": item.get("system_prompt", "Вы - полезный помощник по математике и физике. Ответьте на русском языке.")
|
118 |
+
}
|
119 |
+
|
120 |
+
# Определяем, является ли это лучшим результатом для данной модели
|
121 |
+
model_base_name = model_name.split("/")[-1].split("_v")[0]
|
122 |
+
if model_base_name in best_model_results:
|
123 |
+
if model_data["score"] > best_model_results[model_base_name]["score"]:
|
124 |
+
best_model_results[model_base_name] = model_data
|
125 |
+
else:
|
126 |
+
best_model_results[model_base_name] = model_data
|
127 |
+
except KeyError as e:
|
128 |
+
# Логируем ошибку, но продолжаем обработку других моделей
|
129 |
+
logging.error(f"Failed to process model data: {e}")
|
130 |
except Exception as e:
|
131 |
logging.error(f"Failed to load saved leaderboard data: {e}")
|
132 |
|
133 |
+
# 2. Загружаем модели из директории внешних моделей
|
134 |
try:
|
135 |
+
external_dir = "./m_data/model_data/external/"
|
136 |
+
if os.path.exists(external_dir):
|
137 |
+
for file in os.listdir(external_dir):
|
138 |
+
if file.endswith(".json"):
|
139 |
try:
|
140 |
+
with open(os.path.join(external_dir, file), "r", encoding="utf-8") as f:
|
141 |
+
data = json.load(f)
|
142 |
+
|
143 |
+
# Проверяем наличие необходимых полей
|
144 |
+
model_name = data.get("model_name", data.get("model", ""))
|
145 |
+
if not model_name:
|
146 |
+
logging.error(f"Failed to parse {file}: 'model_name' not found")
|
147 |
+
continue
|
148 |
+
|
149 |
+
score = data.get("score", None)
|
150 |
+
if score is None:
|
151 |
+
logging.error(f"Failed to parse {file}: 'score' not found")
|
152 |
+
continue
|
153 |
+
|
154 |
+
# Стандартизируем данные
|
155 |
+
model_data = {
|
156 |
+
"model": model_name,
|
157 |
+
"score": float(score),
|
158 |
+
"math_score": float(data.get("math_score", 0.0)),
|
159 |
+
"physics_score": float(data.get("physics_score", 0.0)),
|
160 |
+
"total_tokens": int(data.get("total_tokens", 0)),
|
161 |
+
"evaluation_time": float(data.get("evaluation_time", 0.0)),
|
162 |
"system_prompt": data.get("system_prompt", "Вы - полезный помощник по математике и физике. Ответьте на русском языке.")
|
163 |
}
|
164 |
+
|
165 |
+
# Определяем, является ли это лучшим результатом для данной модели
|
166 |
+
model_base_name = model_name.split("/")[-1].split("_v")[0]
|
167 |
+
if model_base_name in best_model_results:
|
168 |
+
if model_data["score"] > best_model_results[model_base_name]["score"]:
|
169 |
+
best_model_results[model_base_name] = model_data
|
170 |
+
else:
|
171 |
+
best_model_results[model_base_name] = model_data
|
172 |
except Exception as e:
|
173 |
+
logging.error(f"Failed to parse {file}: {str(e)}")
|
174 |
+
continue
|
175 |
except Exception as e:
|
176 |
logging.error(f"Failed to process external model data: {e}")
|
177 |
|
178 |
+
# 3. Собираем все лучшие результаты
|
179 |
+
results = list(best_model_results.values())
|
180 |
+
|
181 |
+
# 4. Добавляем базовые модели по умолчанию, если список пуст
|
182 |
+
if not results:
|
183 |
+
# Добавляем несколько моделей-заглушек для отображения интерфейса
|
184 |
+
results = [
|
185 |
+
{
|
186 |
+
"model": "example/model-1",
|
187 |
+
"score": 0.7,
|
188 |
+
"math_score": 0.8,
|
189 |
+
"physics_score": 0.6,
|
190 |
+
"total_tokens": 1000000,
|
191 |
+
"evaluation_time": 3600.0,
|
192 |
+
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
193 |
+
},
|
194 |
+
{
|
195 |
+
"model": "example/model-2",
|
196 |
+
"score": 0.6,
|
197 |
+
"math_score": 0.7,
|
198 |
+
"physics_score": 0.5,
|
199 |
+
"total_tokens": 800000,
|
200 |
+
"evaluation_time": 3000.0,
|
201 |
+
"system_prompt": "Вы - полезный помощник по математике и физике. Ответьте на русском языке."
|
202 |
+
}
|
203 |
+
]
|
204 |
+
logging.warning("No model data found, using example models")
|
205 |
+
|
206 |
# Создаем DataFrame и сортируем по общему баллу
|
207 |
+
df = pd.DataFrame(results)
|
208 |
+
df.sort_values(by='score', ascending=False, inplace=True)
|
209 |
+
|
210 |
+
# Округляем числовые столбцы для красивого отображения
|
211 |
+
numeric_cols = df.select_dtypes(include=['number']).columns
|
212 |
+
if not numeric_cols.empty:
|
213 |
df[numeric_cols] = df[numeric_cols].round(3)
|
214 |
+
|
215 |
+
return df
|
|
|
|
|
|
|
|