Spaces:
Running
Running
import os | |
import gradio as gr | |
import numpy as np | |
import matplotlib.pyplot as plt | |
import seaborn as sns | |
import re | |
from io import BytesIO | |
from PIL import Image | |
from datasets.exceptions import DatasetNotFoundError | |
print(gr.__version__) | |
from src.dataloading import get_leaderboard_models_cached, get_leaderboard_datasets | |
from src.similarity import load_data_and_compute_similarities | |
# Set matplotlib backend for non-GUI environments | |
plt.switch_backend('Agg') | |
def create_heatmap(selected_models, selected_dataset, selected_metric): | |
if not selected_models or not selected_dataset: | |
return None | |
# Sort models and get short names | |
selected_models = sorted(selected_models) | |
similarities = load_data_and_compute_similarities(selected_models, selected_dataset, selected_metric) | |
# Check if similarity matrix contains NaN rows | |
failed_models = [] | |
for i in range(len(similarities)): | |
if np.isnan(similarities[i]).all(): | |
failed_models.append(selected_models[i]) | |
if failed_models: | |
raise gr.Error(f"Failed to load data for models: {', '.join(failed_models)}") | |
# Create figure and heatmap using seaborn | |
plt.figure(figsize=(8, 6)) | |
ax = sns.heatmap( | |
similarities, | |
annot=True, | |
fmt=".2f", | |
cmap="viridis", | |
vmin=0, | |
vmax=1, | |
xticklabels=selected_models, | |
yticklabels=selected_models | |
) | |
# Customize plot | |
plt.title(f"{selected_metric} for {selected_dataset}", fontsize=16) | |
plt.xlabel("Models", fontsize=14) | |
plt.ylabel("Models", fontsize=14) | |
plt.xticks(rotation=45, ha='right') | |
plt.yticks(rotation=0) | |
plt.tight_layout() | |
# Save to buffer | |
buf = BytesIO() | |
plt.savefig(buf, format="png", dpi=100, bbox_inches="tight") | |
plt.close() | |
# Convert to PIL Image | |
buf.seek(0) | |
img = Image.open(buf).convert("RGB") | |
return img | |
def validate_inputs(selected_models, selected_dataset): | |
if not selected_models: | |
raise gr.Error("Please select at least one model!") | |
if not selected_dataset: | |
raise gr.Error("Please select a dataset!") | |
def update_datasets_based_on_models(selected_models, current_dataset): | |
try: | |
available_datasets = get_leaderboard_datasets(selected_models) if selected_models else [] | |
valid_dataset = current_dataset if current_dataset in available_datasets else None | |
return gr.update( | |
choices=available_datasets, | |
value=valid_dataset | |
) | |
except DatasetNotFoundError as e: | |
# Extract model name from error message | |
match = re.search(r"open-llm-leaderboard/([\w\-]+)", str(e)) | |
model_name = match.group(1) if match else "Unknown Model" | |
# Display a shorter warning | |
gr.Warning(f"Data for '{model_name}' is gated or unavailable.") | |
return gr.update(choices=[], value=None) | |
with gr.Blocks(title="LLM Similarity Analyzer") as demo: | |
gr.Markdown("## Model Similarity Comparison Tool \n\nAs Language Model (LM) capabilities advance, evaluating and supervising them at scale is getting harder for humans. There is hope that other language models can automate both these tasks, which we refer to as AI Oversight. We study how model similarity affects both aspects of AI oversight by proposing a probabilistic metric for LM similarity based on overlap in model mistakes. Using this metric, we first show that LLM-as-a-judge scores favor models similar to the judge, generalizing recent self-preference results. Then, we study training on LM annotations, and find complementary knowledge between the weak supervisor and strong student model plays a crucial role in gains from weak-to-strong generalization. As model capabilities increase, it becomes harder to find their mistakes, and we might defer more to AI oversight. However, we observe a concerning trend -- model mistakes are becoming more similar with increasing capabilities, pointing to risks from correlated failures. Our work underscores the importance of reporting and correcting for model similarity, especially in the emerging paradigm of AI oversight. ") | |
with gr.Row(): | |
dataset_dropdown = gr.Dropdown( | |
choices=get_leaderboard_datasets(None), | |
label="Select Dataset", | |
filterable=True, | |
interactive=True, | |
allow_custom_value=False, | |
info="Open LLM Leaderboard v2 benchmark datasets" | |
) | |
metric_dropdown = gr.Dropdown( | |
choices=["Kappa_p (prob.)", "Kappa_p (det.)", "Error Consistency"], | |
label="Select Metric", | |
info="Select a similarity metric to compute" | |
) | |
model_dropdown = gr.Dropdown( | |
choices=get_leaderboard_models_cached(), | |
label="Select Models", | |
multiselect=True, | |
filterable=True, | |
allow_custom_value=False, | |
info="Search and select multiple models" | |
) | |
gr.Markdown("* For the probabilistic Kappa_p metric self-similarity is only 1, if the model predicts a single option with 100% confidence.") | |
model_dropdown.change( | |
fn=update_datasets_based_on_models, | |
inputs=[model_dropdown, dataset_dropdown], | |
outputs=dataset_dropdown | |
) | |
generate_btn = gr.Button("Generate Heatmap", variant="primary") | |
heatmap = gr.Image(label="Similarity Heatmap", visible=True) | |
generate_btn.click( | |
fn=validate_inputs, | |
inputs=[model_dropdown, dataset_dropdown], | |
queue=False | |
).then( | |
fn=create_heatmap, | |
inputs=[model_dropdown, dataset_dropdown, metric_dropdown], | |
outputs=heatmap | |
) | |
clear_btn = gr.Button("Clear Selection") | |
clear_btn.click( | |
lambda: [[], None, None], | |
outputs=[model_dropdown, dataset_dropdown, heatmap] | |
) | |
if __name__ == "__main__": | |
demo.launch(ssr_mode=False) |