Anonumous commited on
Commit
406ade6
·
1 Parent(s): 9bc963b

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
Files changed (1) hide show
  1. 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
- # Download previous autogenerated leaderboard files
 
 
 
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
- # Download model evaluation results
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
- with open("d:/python_projects/DeathMath/results/leaderboard_results.json", "r", encoding="utf-8") as f:
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
- logging.info(f"Loaded {len(saved_data)} models from saved leaderboard data")
113
-
114
- # Добавляем модели, которых ещё нет в результатах
115
- existing_models = [r["model"] for r in results]
116
- for item in saved_data:
117
- if item["model"] not in existing_models:
118
- results.append(item)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  except Exception as e:
120
  logging.error(f"Failed to load saved leaderboard data: {e}")
121
 
122
- # Загружаем модели из директории внешних моделей
123
  try:
124
- for file in os.listdir("./m_data/model_data/external/"):
125
- if file.endswith(".json"):
126
- with open(os.path.join("./m_data/model_data/external/", file), "r") as f:
 
127
  try:
128
- data = json.load(f)
129
- # Проверяем, нет ли уже этой модели в результатах
130
- if data["model_name"] not in [r["model"] for r in results]:
131
- result = {
132
- "model": data["model_name"],
133
- "score": data["score"],
134
- "math_score": data["math_score"],
135
- "physics_score": data["physics_score"],
136
- "total_tokens": data["total_tokens"],
137
- "evaluation_time": data["evaluation_time"],
 
 
 
 
 
 
 
 
 
 
 
 
138
  "system_prompt": data.get("system_prompt", "Вы - полезный помощник по математике и физике. Ответьте на русском языке.")
139
  }
140
- results.append(result)
 
 
 
 
 
 
 
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
- if results:
148
- df = pd.DataFrame(results)
149
- df.sort_values(by='score', ascending=False, inplace=True)
150
-
151
- # Округляем числовые столбцы для красивого отображения
152
- numeric_cols = df.select_dtypes(include=['number']).columns
153
  df[numeric_cols] = df[numeric_cols].round(3)
154
-
155
- return df
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