Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -18,9 +18,6 @@ HF_TOKEN = os.environ.get("HF_TOKEN")
|
|
| 18 |
# --- Constants for Benchmarks ---
|
| 19 |
MMLU_DATASET = "cais/mmlu"
|
| 20 |
MMLU_PRO_DATASET = "cais/mmlu_pro"
|
| 21 |
-
# Humanity's Last Exam is a composite benchmark, not a single dataset readily available like MMLU/MMLU-Pro.
|
| 22 |
-
# For this implementation, we will focus on MMLU and MMLU-Pro, which are direct datasets.
|
| 23 |
-
# Integrating HLE would require evaluating across multiple specific datasets.
|
| 24 |
|
| 25 |
def get_all_benchmark_options():
|
| 26 |
"""
|
|
@@ -68,12 +65,12 @@ def load_model(model_id):
|
|
| 68 |
return model_cache[model_id]
|
| 69 |
try:
|
| 70 |
# Load tokenizer and model, using bfloat16 if CUDA is available for efficiency
|
| 71 |
-
tokenizer = AutoTokenizer.from_pretrained(model_id, token=HF_TOKEN)
|
| 72 |
model = AutoModelForCausalLM.from_pretrained(
|
| 73 |
model_id,
|
| 74 |
token=HF_TOKEN,
|
| 75 |
-
|
| 76 |
-
|
| 77 |
).to("cuda" if torch.cuda.is_available() else "cpu")
|
| 78 |
|
| 79 |
# Create a text-generation pipeline
|
|
@@ -107,7 +104,7 @@ def extract_choice_letter(output):
|
|
| 107 |
It prioritizes an exact match after "Answer:", then looks for any single capital letter.
|
| 108 |
"""
|
| 109 |
# Look for "Answer: X" pattern first (e.g., "Answer: A" or "Answer: B")
|
| 110 |
-
match = re.search(r"Answer:\s*([ABCD])", output, re.IGNORECASE)
|
| 111 |
if match:
|
| 112 |
return match.group(1).upper() # Ensure it's uppercase
|
| 113 |
|
|
@@ -270,8 +267,6 @@ def run_evaluation(model_id, selected_benchmark_subject, sample_count, progress=
|
|
| 270 |
score_string = f"Accuracy for {benchmark_name} - {subject_name}: {accuracy:.2f}% out of {num_evaluated_samples} samples."
|
| 271 |
|
| 272 |
# Format detailed results for display in the text box
|
| 273 |
-
# The key change here is to wrap the entire multi-line string construction for each item
|
| 274 |
-
# within parentheses to ensure it's treated as a single element in the list comprehension.
|
| 275 |
formatted_details = "\n\n".join([
|
| 276 |
(
|
| 277 |
f"### Question:\n{item['question']}\n\n"
|
|
@@ -300,7 +295,7 @@ def run_evaluation(model_id, selected_benchmark_subject, sample_count, progress=
|
|
| 300 |
gr.Info("Evaluation completed successfully!")
|
| 301 |
return score_string, \
|
| 302 |
gr.update(value="", visible=False), gr.update(visible=False), \
|
| 303 |
-
gr.update(visible=
|
| 304 |
|
| 305 |
except Exception as e:
|
| 306 |
error_message = str(e)
|
|
@@ -328,158 +323,284 @@ def save_text(text_content):
|
|
| 328 |
|
| 329 |
def load_leaderboard():
|
| 330 |
"""
|
| 331 |
-
Loads evaluation data from 'eval.jsonl', computes average accuracy per model,
|
| 332 |
-
and prepares data for
|
| 333 |
"""
|
| 334 |
try:
|
| 335 |
-
# Read the JSONL file into a pandas DataFrame
|
| 336 |
df = pd.read_json("eval.jsonl", lines=True)
|
| 337 |
|
| 338 |
-
#
|
| 339 |
-
|
| 340 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 341 |
|
| 342 |
-
#
|
| 343 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 344 |
|
| 345 |
-
#
|
| 346 |
-
|
| 347 |
-
|
| 348 |
-
# Create the matplotlib plot
|
| 349 |
-
fig, ax = plt.subplots(figsize=(10, 6)) # Adjust figure size for better readability
|
| 350 |
-
# For horizontal bars, it's often better to plot data sorted in ascending order
|
| 351 |
-
# so the highest bar appears at the top of the chart.
|
| 352 |
-
top_models_plot = top_models.sort_values(by="Average Accuracy (%)", ascending=True)
|
| 353 |
-
|
| 354 |
-
ax.barh(top_models_plot['Model ID'], top_models_plot['Average Accuracy (%)'], color='#007bff') # Use a nice blue color
|
| 355 |
-
ax.set_xlabel("Average Accuracy (%)", fontsize=12)
|
| 356 |
-
ax.set_ylabel("Model ID", fontsize=12)
|
| 357 |
-
ax.set_title("Top 10 Models by Average MMLU/MMLU-Pro Accuracy", fontsize=14)
|
| 358 |
-
ax.set_xlim(0, 100) # Ensure accuracy scale is 0-100%
|
| 359 |
-
ax.tick_params(axis='x', labelsize=10)
|
| 360 |
-
ax.tick_params(axis='y', labelsize=10)
|
| 361 |
-
ax.grid(axis='x', linestyle='--', alpha=0.7) # Add grid lines
|
| 362 |
-
plt.tight_layout() # Adjust layout to prevent labels overlapping
|
| 363 |
-
|
| 364 |
-
# Return the figure and the sorted dataframe as a list of dictionaries for Gradio Dataframe
|
| 365 |
-
return fig, df_sorted.to_dict('records')
|
| 366 |
except FileNotFoundError:
|
| 367 |
gr.Warning("No evaluation data found yet. Run an evaluation to populate the leaderboard!")
|
| 368 |
-
return
|
|
|
|
|
|
|
|
|
|
| 369 |
except Exception as e:
|
| 370 |
gr.Error(f"Error loading leaderboard: {e}")
|
| 371 |
-
#
|
| 372 |
-
return
|
|
|
|
|
|
|
|
|
|
| 373 |
|
| 374 |
|
| 375 |
# --- Gradio Interface Definition ---
|
| 376 |
with gr.Blocks(css="""
|
|
|
|
|
|
|
|
|
|
| 377 |
/* General body and container styling */
|
| 378 |
-
body {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 379 |
.gradio-container {
|
| 380 |
max-width: 1200px;
|
| 381 |
margin: 20px auto;
|
| 382 |
-
padding:
|
| 383 |
-
box-shadow: 0
|
| 384 |
-
border-radius:
|
| 385 |
background-color: #ffffff;
|
| 386 |
-
border: 1px solid #
|
| 387 |
}
|
| 388 |
|
| 389 |
/* Headings */
|
| 390 |
h1 {
|
| 391 |
-
color: #
|
| 392 |
text-align: center;
|
| 393 |
margin-bottom: 30px;
|
| 394 |
-
font-size: 2.
|
| 395 |
font-weight: 700;
|
| 396 |
-
letter-spacing: -0.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 397 |
}
|
| 398 |
-
h3 { color: #34495e; font-size: 1.2em; margin-bottom: 10px; }
|
| 399 |
|
| 400 |
/* Markdown text */
|
| 401 |
-
.markdown-text {
|
| 402 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 403 |
|
| 404 |
/* Buttons */
|
| 405 |
.gr-button {
|
| 406 |
-
background-color: #
|
| 407 |
color: white;
|
| 408 |
border: none;
|
| 409 |
-
padding:
|
| 410 |
-
border-radius:
|
| 411 |
cursor: pointer;
|
| 412 |
-
transition: background-color 0.3s ease, transform 0.2s ease;
|
| 413 |
-
font-size: 1.
|
| 414 |
font-weight: 600;
|
| 415 |
-
box-shadow: 0
|
|
|
|
| 416 |
}
|
| 417 |
.gr-button:hover {
|
| 418 |
-
background-color: #
|
| 419 |
-
transform: translateY(-
|
|
|
|
| 420 |
}
|
| 421 |
.gr-button:active {
|
| 422 |
transform: translateY(0);
|
| 423 |
-
box-shadow: 0 2px
|
| 424 |
}
|
| 425 |
/* Specific button styling for debug/show details */
|
| 426 |
#debug-button, #show-details-button {
|
| 427 |
-
background-color: #
|
|
|
|
| 428 |
}
|
| 429 |
#debug-button:hover, #show-details-button:hover {
|
| 430 |
-
background-color: #
|
|
|
|
| 431 |
}
|
| 432 |
#download-button {
|
| 433 |
-
background-color: #
|
|
|
|
| 434 |
}
|
| 435 |
#download-button:hover {
|
| 436 |
-
background-color: #
|
|
|
|
| 437 |
}
|
| 438 |
|
| 439 |
-
|
| 440 |
-
/* Input/Output Boxes */
|
| 441 |
.gr-box {
|
| 442 |
-
border: 1px solid #
|
| 443 |
-
border-radius:
|
| 444 |
-
padding:
|
| 445 |
-
margin-bottom:
|
| 446 |
-
background-color: #
|
| 447 |
-
box-shadow: inset 0
|
| 448 |
}
|
|
|
|
| 449 |
.gr-output-text {
|
| 450 |
white-space: pre-wrap;
|
| 451 |
word-wrap: break-word;
|
| 452 |
-
background-color: #
|
| 453 |
-
border: 1px solid #
|
| 454 |
border-radius: 8px;
|
| 455 |
-
padding:
|
| 456 |
-
min-height:
|
|
|
|
|
|
|
|
|
|
|
|
|
| 457 |
}
|
| 458 |
/* Specific error output style */
|
| 459 |
#error-message-output {
|
| 460 |
-
background-color: #
|
| 461 |
-
border-color: #
|
| 462 |
-
color: #
|
|
|
|
|
|
|
| 463 |
}
|
| 464 |
|
| 465 |
|
| 466 |
/* Labels for inputs */
|
| 467 |
.gr-textbox label, .gr-dropdown label, .gr-slider label {
|
| 468 |
font-weight: 600;
|
| 469 |
-
color: #
|
| 470 |
-
margin-bottom:
|
| 471 |
display: block;
|
| 472 |
-
font-size:
|
| 473 |
}
|
| 474 |
|
| 475 |
-
/*
|
| 476 |
-
.gr-tab-item { padding: 25px; } /* More padding inside tabs */
|
| 477 |
.gr-tabs-nav button {
|
| 478 |
font-weight: 600;
|
| 479 |
font-size: 1.1em;
|
| 480 |
-
padding:
|
| 481 |
-
border-top-left-radius:
|
| 482 |
-
border-top-right-radius:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 483 |
}
|
| 484 |
""") as demo:
|
| 485 |
gr.Markdown("""
|
|
@@ -489,10 +610,11 @@ with gr.Blocks(css="""
|
|
| 489 |
with gr.Tabs():
|
| 490 |
with gr.TabItem("π Run Evaluation"):
|
| 491 |
gr.Markdown("""
|
| 492 |
-
<div
|
| 493 |
Enter your Hugging Face Model ID, choose a benchmark (MMLU or MMLU-Pro),
|
| 494 |
select a subject (or 'ALL' for a comprehensive evaluation),
|
| 495 |
and specify the number of samples per subject.
|
|
|
|
| 496 |
</div>
|
| 497 |
""")
|
| 498 |
|
|
@@ -521,6 +643,8 @@ with gr.Blocks(css="""
|
|
| 521 |
)
|
| 522 |
run_button = gr.Button("π Run Evaluation", elem_classes="gr-button")
|
| 523 |
|
|
|
|
|
|
|
| 524 |
with gr.Column(elem_classes="gr-box"):
|
| 525 |
acc_output = gr.Textbox(
|
| 526 |
label="Benchmark Accuracy Results",
|
|
@@ -598,24 +722,37 @@ with gr.Blocks(css="""
|
|
| 598 |
|
| 599 |
with gr.TabItem("π Leaderboard"):
|
| 600 |
gr.Markdown("""
|
| 601 |
-
<div
|
| 602 |
-
|
| 603 |
-
This leaderboard
|
| 604 |
</div>
|
| 605 |
""")
|
| 606 |
-
|
| 607 |
-
|
| 608 |
-
|
| 609 |
-
|
| 610 |
-
|
| 611 |
-
|
| 612 |
-
|
| 613 |
-
|
| 614 |
-
|
| 615 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 616 |
|
| 617 |
# Load leaderboard when the tab is selected or when the app loads
|
| 618 |
-
demo.load(load_leaderboard, inputs=[], outputs=[
|
| 619 |
|
| 620 |
# Launch the Gradio app
|
| 621 |
-
demo.launch()
|
|
|
|
| 18 |
# --- Constants for Benchmarks ---
|
| 19 |
MMLU_DATASET = "cais/mmlu"
|
| 20 |
MMLU_PRO_DATASET = "cais/mmlu_pro"
|
|
|
|
|
|
|
|
|
|
| 21 |
|
| 22 |
def get_all_benchmark_options():
|
| 23 |
"""
|
|
|
|
| 65 |
return model_cache[model_id]
|
| 66 |
try:
|
| 67 |
# Load tokenizer and model, using bfloat16 if CUDA is available for efficiency
|
| 68 |
+
tokenizer = AutoTokenizer.from_pretrained(model_id, token=HF_TOKEN, trust_remote_code=True)
|
| 69 |
model = AutoModelForCausalLM.from_pretrained(
|
| 70 |
model_id,
|
| 71 |
token=HF_TOKEN,
|
| 72 |
+
torch_dtype=torch.bfloat16 if torch.cuda.is_available() else torch.float32,
|
| 73 |
+
trust_remote_code=True
|
| 74 |
).to("cuda" if torch.cuda.is_available() else "cpu")
|
| 75 |
|
| 76 |
# Create a text-generation pipeline
|
|
|
|
| 104 |
It prioritizes an exact match after "Answer:", then looks for any single capital letter.
|
| 105 |
"""
|
| 106 |
# Look for "Answer: X" pattern first (e.g., "Answer: A" or "Answer: B")
|
| 107 |
+
match = re.search(r"Answer:\s*([ABCD])", output, re.IGNORECASE)
|
| 108 |
if match:
|
| 109 |
return match.group(1).upper() # Ensure it's uppercase
|
| 110 |
|
|
|
|
| 267 |
score_string = f"Accuracy for {benchmark_name} - {subject_name}: {accuracy:.2f}% out of {num_evaluated_samples} samples."
|
| 268 |
|
| 269 |
# Format detailed results for display in the text box
|
|
|
|
|
|
|
| 270 |
formatted_details = "\n\n".join([
|
| 271 |
(
|
| 272 |
f"### Question:\n{item['question']}\n\n"
|
|
|
|
| 295 |
gr.Info("Evaluation completed successfully!")
|
| 296 |
return score_string, \
|
| 297 |
gr.update(value="", visible=False), gr.update(visible=False), \
|
| 298 |
+
gr.update(visible=True), gr.update(visible=True), gr.update(value=formatted_details, visible=False)
|
| 299 |
|
| 300 |
except Exception as e:
|
| 301 |
error_message = str(e)
|
|
|
|
| 323 |
|
| 324 |
def load_leaderboard():
|
| 325 |
"""
|
| 326 |
+
Loads evaluation data from 'eval.jsonl', computes average accuracy per model for MMLU and MMLU-Pro,
|
| 327 |
+
and prepares data for two separate leaderboard tables.
|
| 328 |
"""
|
| 329 |
try:
|
|
|
|
| 330 |
df = pd.read_json("eval.jsonl", lines=True)
|
| 331 |
|
| 332 |
+
# Ensure 'accuracy' is numeric, coerce errors to NaN and drop them
|
| 333 |
+
df['accuracy'] = pd.to_numeric(df['accuracy'], errors='coerce')
|
| 334 |
+
df = df.dropna(subset=['accuracy'])
|
| 335 |
+
|
| 336 |
+
if df.empty:
|
| 337 |
+
gr.Warning("No valid evaluation data found to populate the leaderboard.")
|
| 338 |
+
# Return empty dataframes for both MMLU and MMLU-Pro
|
| 339 |
+
return (
|
| 340 |
+
pd.DataFrame(columns=["Model ID", "Average Accuracy (%)"]).to_dict('records'),
|
| 341 |
+
pd.DataFrame(columns=["Model ID", "Average Accuracy (%)"]).to_dict('records')
|
| 342 |
+
)
|
| 343 |
+
|
| 344 |
+
# Filter for MMLU data
|
| 345 |
+
df_mmlu = df[df['benchmark'] == 'MMLU']
|
| 346 |
+
if 'subject' in df_mmlu.columns:
|
| 347 |
+
# For MMLU, if "ALL" subjects are evaluated, consider the overall accuracy.
|
| 348 |
+
# Otherwise, average specific subject accuracies.
|
| 349 |
+
df_mmlu_grouped = df_mmlu[df_mmlu['subject'] == 'ALL'].groupby("model_id")["accuracy"].mean().reset_index()
|
| 350 |
+
# If a model only has specific subject evaluations, average those.
|
| 351 |
+
# This is a simplification; a more robust approach might be to calculate weighted average.
|
| 352 |
+
# For now, if "ALL" exists, we use that; otherwise, we average available subjects.
|
| 353 |
+
|
| 354 |
+
# If no 'ALL' subject records, average across available subjects for MMLU
|
| 355 |
+
if df_mmlu_grouped.empty:
|
| 356 |
+
df_mmlu_grouped = df_mmlu.groupby("model_id")["accuracy"].mean().reset_index()
|
| 357 |
+
|
| 358 |
+
else: # Handle older eval.jsonl without 'subject' column or if only MMLU was run
|
| 359 |
+
df_mmlu_grouped = df_mmlu.groupby("model_id")["accuracy"].mean().reset_index()
|
| 360 |
+
|
| 361 |
+
|
| 362 |
+
df_mmlu_grouped.columns = ["Model ID", "Average Accuracy (%)"]
|
| 363 |
+
df_mmlu_sorted = df_mmlu_grouped.sort_values(by="Average Accuracy (%)", ascending=False)
|
| 364 |
|
| 365 |
+
# Filter for MMLU-Pro data
|
| 366 |
+
df_mmlu_pro = df[df['benchmark'] == 'MMLU-Pro']
|
| 367 |
+
if 'subject' in df_mmlu_pro.columns:
|
| 368 |
+
df_mmlu_pro_grouped = df_mmlu_pro[df_mmlu_pro['subject'] == 'ALL'].groupby("model_id")["accuracy"].mean().reset_index()
|
| 369 |
+
if df_mmlu_pro_grouped.empty:
|
| 370 |
+
df_mmlu_pro_grouped = df_mmlu_pro.groupby("model_id")["accuracy"].mean().reset_index()
|
| 371 |
+
else: # Handle older eval.jsonl
|
| 372 |
+
df_mmlu_pro_grouped = df_mmlu_pro.groupby("model_id")["accuracy"].mean().reset_index()
|
| 373 |
+
|
| 374 |
+
|
| 375 |
+
df_mmlu_pro_grouped.columns = ["Model ID", "Average Accuracy (%)"]
|
| 376 |
+
df_mmlu_pro_sorted = df_mmlu_pro_grouped.sort_values(by="Average Accuracy (%)", ascending=False)
|
| 377 |
|
| 378 |
+
# Return two dataframes as lists of dictionaries
|
| 379 |
+
return df_mmlu_sorted.to_dict('records'), df_mmlu_pro_sorted.to_dict('records')
|
| 380 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 381 |
except FileNotFoundError:
|
| 382 |
gr.Warning("No evaluation data found yet. Run an evaluation to populate the leaderboard!")
|
| 383 |
+
return (
|
| 384 |
+
pd.DataFrame(columns=["Model ID", "Average Accuracy (%)"]).to_dict('records'),
|
| 385 |
+
pd.DataFrame(columns=["Model ID", "Average Accuracy (%)"]).to_dict('records')
|
| 386 |
+
)
|
| 387 |
except Exception as e:
|
| 388 |
gr.Error(f"Error loading leaderboard: {e}")
|
| 389 |
+
traceback.print_exc() # Print full traceback for debugging
|
| 390 |
+
return (
|
| 391 |
+
pd.DataFrame(columns=["Model ID", "Average Accuracy (%)"]).to_dict('records'),
|
| 392 |
+
pd.DataFrame(columns=["Model ID", "Average Accuracy (%)"]).to_dict('records')
|
| 393 |
+
)
|
| 394 |
|
| 395 |
|
| 396 |
# --- Gradio Interface Definition ---
|
| 397 |
with gr.Blocks(css="""
|
| 398 |
+
/* Import Google Font - Inter */
|
| 399 |
+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
|
| 400 |
+
|
| 401 |
/* General body and container styling */
|
| 402 |
+
body {
|
| 403 |
+
font-family: 'Inter', sans-serif;
|
| 404 |
+
background-color: #eef2f6; /* Lighter background */
|
| 405 |
+
margin: 0;
|
| 406 |
+
padding: 20px;
|
| 407 |
+
}
|
| 408 |
.gradio-container {
|
| 409 |
max-width: 1200px;
|
| 410 |
margin: 20px auto;
|
| 411 |
+
padding: 40px; /* Increased padding */
|
| 412 |
+
box-shadow: 0 10px 25px rgba(0,0,0,0.1); /* Softer, larger shadow */
|
| 413 |
+
border-radius: 15px; /* More rounded corners */
|
| 414 |
background-color: #ffffff;
|
| 415 |
+
border: 1px solid #e0e6ed; /* Subtle border */
|
| 416 |
}
|
| 417 |
|
| 418 |
/* Headings */
|
| 419 |
h1 {
|
| 420 |
+
color: #1a202c; /* Darker, more professional heading color */
|
| 421 |
text-align: center;
|
| 422 |
margin-bottom: 30px;
|
| 423 |
+
font-size: 2.8em; /* Slightly larger H1 */
|
| 424 |
font-weight: 700;
|
| 425 |
+
letter-spacing: -0.03em;
|
| 426 |
+
text-shadow: 1px 1px 2px rgba(0,0,0,0.05); /* Subtle text shadow */
|
| 427 |
+
}
|
| 428 |
+
h3 {
|
| 429 |
+
color: #2d3748;
|
| 430 |
+
font-size: 1.3em; /* Slightly larger H3 */
|
| 431 |
+
margin-bottom: 15px;
|
| 432 |
+
font-weight: 600;
|
| 433 |
}
|
|
|
|
| 434 |
|
| 435 |
/* Markdown text */
|
| 436 |
+
.markdown-text {
|
| 437 |
+
text-align: center;
|
| 438 |
+
color: #4a5568;
|
| 439 |
+
line-height: 1.7;
|
| 440 |
+
font-size: 1.05em;
|
| 441 |
+
margin-bottom: 30px;
|
| 442 |
+
}
|
| 443 |
+
.markdown-text div {
|
| 444 |
+
font-size: 1.1em;
|
| 445 |
+
max-width: 800px; /* Constrain width for readability */
|
| 446 |
+
margin: 0 auto;
|
| 447 |
+
}
|
| 448 |
|
| 449 |
/* Buttons */
|
| 450 |
.gr-button {
|
| 451 |
+
background-color: #2f80ed; /* A vibrant, professional blue */
|
| 452 |
color: white;
|
| 453 |
border: none;
|
| 454 |
+
padding: 14px 30px; /* More padding */
|
| 455 |
+
border-radius: 10px; /* More rounded */
|
| 456 |
cursor: pointer;
|
| 457 |
+
transition: background-color 0.3s ease, transform 0.2s ease, box-shadow 0.2s ease;
|
| 458 |
+
font-size: 1.15em; /* Slightly larger font */
|
| 459 |
font-weight: 600;
|
| 460 |
+
box-shadow: 0 5px 15px rgba(0, 123, 255, 0.2); /* Enhanced shadow for primary button */
|
| 461 |
+
margin: 5px; /* Add some margin for spacing between buttons */
|
| 462 |
}
|
| 463 |
.gr-button:hover {
|
| 464 |
+
background-color: #1a6dcd; /* Darker blue on hover */
|
| 465 |
+
transform: translateY(-3px); /* More pronounced lift effect */
|
| 466 |
+
box-shadow: 0 8px 20px rgba(0, 123, 255, 0.3);
|
| 467 |
}
|
| 468 |
.gr-button:active {
|
| 469 |
transform: translateY(0);
|
| 470 |
+
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
|
| 471 |
}
|
| 472 |
/* Specific button styling for debug/show details */
|
| 473 |
#debug-button, #show-details-button {
|
| 474 |
+
background-color: #718096; /* Professional grey */
|
| 475 |
+
box-shadow: 0 3px 10px rgba(113, 128, 150, 0.2);
|
| 476 |
}
|
| 477 |
#debug-button:hover, #show-details-button:hover {
|
| 478 |
+
background-color: #5d6d81;
|
| 479 |
+
box-shadow: 0 5px 12px rgba(113, 128, 150, 0.3);
|
| 480 |
}
|
| 481 |
#download-button {
|
| 482 |
+
background-color: #38a169; /* Muted green for download */
|
| 483 |
+
box-shadow: 0 3px 10px rgba(56, 161, 105, 0.2);
|
| 484 |
}
|
| 485 |
#download-button:hover {
|
| 486 |
+
background-color: #277e50;
|
| 487 |
+
box-shadow: 0 5px 12px rgba(56, 161, 105, 0.3);
|
| 488 |
}
|
| 489 |
|
| 490 |
+
/* Input/Output Boxes (Containers) */
|
|
|
|
| 491 |
.gr-box {
|
| 492 |
+
border: 1px solid #cbd5e0; /* Lighter, subtle border */
|
| 493 |
+
border-radius: 12px;
|
| 494 |
+
padding: 25px; /* Increased padding */
|
| 495 |
+
margin-bottom: 25px;
|
| 496 |
+
background-color: #f8fafc; /* Very light background */
|
| 497 |
+
box-shadow: inset 0 2px 5px rgba(0,0,0,0.03); /* Subtle inner shadow */
|
| 498 |
}
|
| 499 |
+
/* Specific text output boxes (the content inside the containers) */
|
| 500 |
.gr-output-text {
|
| 501 |
white-space: pre-wrap;
|
| 502 |
word-wrap: break-word;
|
| 503 |
+
background-color: #ffffff; /* White background for readability */
|
| 504 |
+
border: 1px solid #e2e8f0;
|
| 505 |
border-radius: 8px;
|
| 506 |
+
padding: 18px; /* More padding */
|
| 507 |
+
min-height: 120px; /* Ensure a minimum height */
|
| 508 |
+
box-shadow: 0 2px 8px rgba(0,0,0,0.05); /* Small shadow for depth */
|
| 509 |
+
color: #2d3748; /* Darker text for readability */
|
| 510 |
+
font-size: 0.95em;
|
| 511 |
+
line-height: 1.6;
|
| 512 |
}
|
| 513 |
/* Specific error output style */
|
| 514 |
#error-message-output {
|
| 515 |
+
background-color: #ffe0e6; /* Light red */
|
| 516 |
+
border-color: #ff99aa; /* Slightly darker red border */
|
| 517 |
+
color: #c53030; /* Stronger red text */
|
| 518 |
+
font-weight: 500;
|
| 519 |
+
padding: 20px;
|
| 520 |
}
|
| 521 |
|
| 522 |
|
| 523 |
/* Labels for inputs */
|
| 524 |
.gr-textbox label, .gr-dropdown label, .gr-slider label {
|
| 525 |
font-weight: 600;
|
| 526 |
+
color: #2d3748; /* Darker label text */
|
| 527 |
+
margin-bottom: 10px;
|
| 528 |
display: block;
|
| 529 |
+
font-size: 1.05em; /* Slightly larger label font */
|
| 530 |
}
|
| 531 |
|
| 532 |
+
/* Tabs styling */
|
|
|
|
| 533 |
.gr-tabs-nav button {
|
| 534 |
font-weight: 600;
|
| 535 |
font-size: 1.1em;
|
| 536 |
+
padding: 12px 25px; /* More padding for tabs */
|
| 537 |
+
border-top-left-radius: 10px;
|
| 538 |
+
border-top-right-radius: 10px;
|
| 539 |
+
background-color: #ebf4f8; /* Light blueish tab background */
|
| 540 |
+
color: #4a5568;
|
| 541 |
+
border: 1px solid #cce0eb; /* Subtle border for tabs */
|
| 542 |
+
border-bottom: none;
|
| 543 |
+
transition: background-color 0.3s ease, color 0.3s ease;
|
| 544 |
+
}
|
| 545 |
+
.gr-tabs-nav button.selected {
|
| 546 |
+
background-color: #ffffff; /* White for selected tab */
|
| 547 |
+
color: #2f80ed; /* Blue for selected text */
|
| 548 |
+
border-color: #2f80ed;
|
| 549 |
+
border-bottom: 1px solid #ffffff; /* Hide bottom border to merge with content */
|
| 550 |
+
}
|
| 551 |
+
|
| 552 |
+
/* Leaderboard specific table styling (general for all leaderboard tables) */
|
| 553 |
+
.leaderboard-table {
|
| 554 |
+
border-radius: 12px;
|
| 555 |
+
box-shadow: 0 4px 15px rgba(0,0,0,0.08);
|
| 556 |
+
overflow: hidden;
|
| 557 |
+
margin-bottom: 25px; /* Space between tables */
|
| 558 |
+
}
|
| 559 |
+
.leaderboard-table table {
|
| 560 |
+
border-collapse: separate;
|
| 561 |
+
border-spacing: 0;
|
| 562 |
+
width: 100%;
|
| 563 |
+
background-color: #ffffff;
|
| 564 |
+
}
|
| 565 |
+
.leaderboard-table thead th {
|
| 566 |
+
background-color: #edf2f7; /* Light grey header */
|
| 567 |
+
color: #2d3748;
|
| 568 |
+
font-weight: 700;
|
| 569 |
+
padding: 15px 20px;
|
| 570 |
+
text-align: left;
|
| 571 |
+
border-bottom: 2px solid #e2e8f0;
|
| 572 |
+
}
|
| 573 |
+
.leaderboard-table tbody tr {
|
| 574 |
+
transition: background-color 0.2s ease;
|
| 575 |
+
}
|
| 576 |
+
.leaderboard-table tbody tr:nth-child(odd) {
|
| 577 |
+
background-color: #f7fafc; /* Zebra striping */
|
| 578 |
+
}
|
| 579 |
+
.leaderboard-table tbody tr:hover {
|
| 580 |
+
background-color: #e6fffa; /* Light teal on hover for rows */
|
| 581 |
+
}
|
| 582 |
+
.leaderboard-table tbody td {
|
| 583 |
+
padding: 12px 20px;
|
| 584 |
+
border-bottom: 1px solid #ebf4f8;
|
| 585 |
+
color: #4a5568;
|
| 586 |
+
}
|
| 587 |
+
.leaderboard-table tbody tr:last-child td {
|
| 588 |
+
border-bottom: none;
|
| 589 |
+
}
|
| 590 |
+
.leaderboard-table tbody tr:first-child td {
|
| 591 |
+
border-top-left-radius: 12px;
|
| 592 |
+
border-top-right-radius: 12px;
|
| 593 |
+
}
|
| 594 |
+
.leaderboard-table tbody tr:last-child td {
|
| 595 |
+
border-bottom-left-radius: 12px;
|
| 596 |
+
border-bottom-right-radius: 12px;
|
| 597 |
+
}
|
| 598 |
+
|
| 599 |
+
/* Horizontal line for separation */
|
| 600 |
+
hr {
|
| 601 |
+
border: none;
|
| 602 |
+
border-top: 1px solid #e2e8f0;
|
| 603 |
+
margin: 30px 0;
|
| 604 |
}
|
| 605 |
""") as demo:
|
| 606 |
gr.Markdown("""
|
|
|
|
| 610 |
with gr.Tabs():
|
| 611 |
with gr.TabItem("π Run Evaluation"):
|
| 612 |
gr.Markdown("""
|
| 613 |
+
<div class="markdown-text">
|
| 614 |
Enter your Hugging Face Model ID, choose a benchmark (MMLU or MMLU-Pro),
|
| 615 |
select a subject (or 'ALL' for a comprehensive evaluation),
|
| 616 |
and specify the number of samples per subject.
|
| 617 |
+
Ensure your Hugging Face token is set as an environment variable for private models.
|
| 618 |
</div>
|
| 619 |
""")
|
| 620 |
|
|
|
|
| 643 |
)
|
| 644 |
run_button = gr.Button("π Run Evaluation", elem_classes="gr-button")
|
| 645 |
|
| 646 |
+
gr.Markdown("<hr>") # Visual separator
|
| 647 |
+
|
| 648 |
with gr.Column(elem_classes="gr-box"):
|
| 649 |
acc_output = gr.Textbox(
|
| 650 |
label="Benchmark Accuracy Results",
|
|
|
|
| 722 |
|
| 723 |
with gr.TabItem("π Leaderboard"):
|
| 724 |
gr.Markdown("""
|
| 725 |
+
<div class="markdown-text">
|
| 726 |
+
Explore the performance of various LLMs on the MMLU and MMLU-Pro benchmarks.
|
| 727 |
+
This leaderboard is updated automatically with each new evaluation.
|
| 728 |
</div>
|
| 729 |
""")
|
| 730 |
+
|
| 731 |
+
# MMLU Leaderboard Table
|
| 732 |
+
gr.Markdown("### MMLU Top Models")
|
| 733 |
+
mmlu_leaderboard_table = gr.Dataframe(
|
| 734 |
+
headers=["Model ID", "Average Accuracy (%)"],
|
| 735 |
+
interactive=False,
|
| 736 |
+
datatype=["str", "number"],
|
| 737 |
+
row_count=10,
|
| 738 |
+
col_count=2,
|
| 739 |
+
label="MMLU Leaderboard Data",
|
| 740 |
+
elem_classes="leaderboard-table" # Apply custom class for styling
|
| 741 |
+
)
|
| 742 |
+
|
| 743 |
+
gr.Markdown("### MMLU-Pro Top Models")
|
| 744 |
+
mmlu_pro_leaderboard_table = gr.Dataframe(
|
| 745 |
+
headers=["Model ID", "Average Accuracy (%)"],
|
| 746 |
+
interactive=False,
|
| 747 |
+
datatype=["str", "number"],
|
| 748 |
+
row_count=10,
|
| 749 |
+
col_count=2,
|
| 750 |
+
label="MMLU-Pro Leaderboard Data",
|
| 751 |
+
elem_classes="leaderboard-table" # Apply custom class for styling
|
| 752 |
+
)
|
| 753 |
|
| 754 |
# Load leaderboard when the tab is selected or when the app loads
|
| 755 |
+
demo.load(load_leaderboard, inputs=[], outputs=[mmlu_leaderboard_table, mmlu_pro_leaderboard_table])
|
| 756 |
|
| 757 |
# Launch the Gradio app
|
| 758 |
+
demo.launch()
|