Spaces:
Sleeping
Sleeping
File size: 9,287 Bytes
460fdc7 42e8f64 c40907d 2ec9b03 4f8bac4 2ec9b03 4f8bac4 2ec9b03 4f8bac4 0a8b643 4f8bac4 41cd010 c3f4f1f 4f8bac4 c3f4f1f 88fbc65 c3f4f1f 88fbc65 c3f4f1f 828c71e 22ec62d c3f4f1f 22ec62d c3f4f1f 22ec62d c3f4f1f 22ec62d 88fbc65 c3f4f1f 22ec62d c3f4f1f 22ec62d c3f4f1f 22ec62d c3f4f1f 22ec62d 88fbc65 c3f4f1f 22ec62d c3f4f1f 8b7dfb4 88fbc65 8b7dfb4 c3f4f1f 8b7dfb4 88fbc65 c3f4f1f 8b7dfb4 88fbc65 c3f4f1f 8b7dfb4 c3f4f1f 41cd010 4567668 f7b4006 7022131 7786ff5 2ec9b03 ca68f3b 4f8bac4 88fbc65 f7b4006 8b7dfb4 7022131 88fbc65 c3f4f1f 88fbc65 cf68488 7022131 c3f4f1f cf68488 7022131 c3f4f1f cf68488 7022131 c3f4f1f cf68488 3fe7e68 c3f4f1f cf68488 3fe7e68 c3f4f1f cf68488 4f8bac4 c3f4f1f cf68488 3fe7e68 c3f4f1f cf68488 3fe7e68 c3f4f1f cf68488 7022131 c3f4f1f cf68488 296b387 c3f4f1f cf68488 40e7d39 4f8bac4 88fbc65 4f8bac4 c3f4f1f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 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 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 |
import gradio as gr
import pandas as pd
CITATION_BUTTON_LABEL = "Copy the following snippet to cite these results"
CITATION_BUTTON_TEXT = r"""@misc{aienergyscore-leaderboard,
author = {Sasha Luccioni and Boris Gamazaychikov and Emma Strubell and Sara Hooker and Yacine Jernite and Carole-Jean Wu and Margaret Mitchell},
title = {AI Energy Score Leaderboard - February 2025},
year = {2025},
publisher = {Hugging Face},
howpublished = "\url{https://huggingface.co/spaces/AIEnergyScore/Leaderboard}",
}"""
# List of tasks (CSV filenames)
tasks = [
'asr.csv',
'object_detection.csv',
'text_classification.csv',
'image_captioning.csv',
'question_answering.csv',
'text_generation.csv',
'image_classification.csv',
'sentence_similarity.csv',
'image_generation.csv',
'summarization.csv'
]
def format_stars(score):
try:
score_int = int(score)
except Exception:
score_int = 0
# Render stars in black with a slightly larger font
return f'<span style="color: black; font-size:1.5em;">{"★" * score_int}</span>'
def make_link(mname):
parts = str(mname).split('/')
display_name = parts[1] if len(parts) > 1 else mname
return f'<a href="https://huggingface.co/{mname}" target="_blank">{display_name}</a>'
def generate_html_table_from_df(df):
"""
Generate an HTML table from the given DataFrame.
Each GPU Energy cell contains both the numeric energy (Wh) and a horizontal bar
whose width is computed relative to the maximum energy in the table.
"""
max_energy = df['gpu_energy_numeric'].max() if not df.empty else 1
color_map = {"1": "red", "2": "orange", "3": "yellow", "4": "lightgreen", "5": "green"}
html = '<table style="width:100%; border-collapse: collapse; font-family: Arial, sans-serif;">'
html += '<thead><tr style="background-color: #f2f2f2;">'
html += '<th style="text-align: left; padding: 8px;">Model</th>'
html += '<th style="text-align: left; padding: 8px;">GPU Energy (Wh)</th>'
html += '<th style="text-align: left; padding: 8px;">Score</th>'
html += '</tr></thead>'
html += '<tbody>'
for _, row in df.iterrows():
energy_numeric = row['gpu_energy_numeric']
energy_str = f"{energy_numeric:.4f}"
# Calculate the relative width as a percentage
bar_width = (energy_numeric / max_energy) * 100
score_val = row['energy_score']
bar_color = color_map.get(str(score_val), "gray")
html += '<tr>'
html += f'<td style="padding: 8px;">{row["Model"]}</td>'
html += (
f'<td style="padding: 8px;">{energy_str}<br>'
f'<div style="background-color: {bar_color}; width: {bar_width:.1f}%; height: 10px;"></div></td>'
)
html += f'<td style="padding: 8px;">{row["Score"]}</td>'
html += '</tr>'
html += '</tbody></table>'
return html
def get_model_names_html(task):
df = pd.read_csv('data/energy/' + task)
if df.columns[0].startswith("Unnamed:"):
df = df.iloc[:, 1:]
# Convert energy_score to integer and total_gpu_energy from kWh to Wh
df['energy_score'] = df['energy_score'].astype(int)
df['gpu_energy_numeric'] = pd.to_numeric(df['total_gpu_energy'], errors='raise') * 1000
df['Model'] = df['model'].apply(make_link)
df['Score'] = df['energy_score'].apply(format_stars)
# Sort descending (high to low)
df = df.sort_values(by='gpu_energy_numeric', ascending=False)
return generate_html_table_from_df(df)
def get_all_model_names_html():
all_df = pd.DataFrame()
for task in tasks:
df = pd.read_csv('data/energy/' + task)
if df.columns[0].startswith("Unnamed:"):
df = df.iloc[:, 1:]
df['energy_score'] = df['energy_score'].astype(int)
df['gpu_energy_numeric'] = pd.to_numeric(df['total_gpu_energy'], errors='raise') * 1000
df['Model'] = df['model'].apply(make_link)
df['Score'] = df['energy_score'].apply(format_stars)
all_df = pd.concat([all_df, df], ignore_index=True)
all_df = all_df.drop_duplicates(subset=['model'])
# Sort descending
all_df = all_df.sort_values(by='gpu_energy_numeric', ascending=False)
return generate_html_table_from_df(all_df)
def get_text_generation_model_names_html(model_class):
df = pd.read_csv('data/energy/text_generation.csv')
if df.columns[0].startswith("Unnamed:"):
df = df.iloc[:, 1:]
# Filter by model class if the "class" column exists
if 'class' in df.columns:
df = df[df['class'] == model_class]
df['energy_score'] = df['energy_score'].astype(int)
df['gpu_energy_numeric'] = pd.to_numeric(df['total_gpu_energy'], errors='raise') * 1000
df['Model'] = df['model'].apply(make_link)
df['Score'] = df['energy_score'].apply(format_stars)
# Sort descending
df = df.sort_values(by='gpu_energy_numeric', ascending=False)
return generate_html_table_from_df(df)
def update_text_generation(selected_display):
# Mapping from display text to the internal value
mapping = {
"A (Single Consumer GPU) <20B parameters": "A",
"B (Single Cloud GPU) 20-66B parameters": "B",
"C (Multiple Cloud GPUs) >66B parameters": "C"
}
model_class = mapping.get(selected_display, "A")
table_html = get_text_generation_model_names_html(model_class)
return table_html
# --- Build the Gradio Interface ---
demo = gr.Blocks(css="""
.gr-dataframe table {
table-layout: fixed;
width: 100%;
}
.gr-dataframe th, .gr-dataframe td {
max-width: 150px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
""")
with demo:
gr.Markdown(
"""# AI Energy Score Leaderboard
### Welcome to the leaderboard for the [AI Energy Score Project!](https://huggingface.co/AIEnergyScore)
Select different tasks to see scored models. Submit open models for testing and learn about testing proprietary models via the [submission portal](https://huggingface.co/spaces/AIEnergyScore/submission_portal)"""
)
# Visually appealing header links
gr.HTML('''
<div style="text-align: center; margin-bottom: 20px;">
<a href="https://huggingface.co/spaces/AIEnergyScore/submission_portal" style="margin: 0 15px; text-decoration: none; font-weight: bold; font-size: 1.1em;">Submission Portal</a>
<a href="https://huggingface.co/spaces/AIEnergyScore/README/discussions" style="margin: 0 15px; text-decoration: none; font-weight: bold; font-size: 1.1em;">Community</a>
<a href="https://huggingface.github.io/AIEnergyScore/#faq" style="margin: 0 15px; text-decoration: none; font-weight: bold; font-size: 1.1em;">FAQ</a>
<a href="https://huggingface.github.io/AIEnergyScore/#documentation" style="margin: 0 15px; text-decoration: none; font-weight: bold; font-size: 1.1em;">Documentation</a>
</div>
''')
with gr.Tabs():
# --- Text Generation Tab with Dropdown for Model Class ---
with gr.TabItem("Text Generation 💬"):
# Define the dropdown with descriptive text options.
model_class_options = [
"A (Single Consumer GPU) <20B parameters",
"B (Single Cloud GPU) 20-66B parameters",
"C (Multiple Cloud GPUs) >66B parameters"
]
model_class_dropdown = gr.Dropdown(
choices=model_class_options,
label="Select Model Class",
value=model_class_options[0]
)
tg_table = gr.HTML(get_text_generation_model_names_html("A"))
model_class_dropdown.change(
fn=update_text_generation,
inputs=model_class_dropdown,
outputs=tg_table
)
with gr.TabItem("Image Generation 📷"):
gr.HTML(get_model_names_html('image_generation.csv'))
with gr.TabItem("Text Classification 🎭"):
gr.HTML(get_model_names_html('text_classification.csv'))
with gr.TabItem("Image Classification 🖼️"):
gr.HTML(get_model_names_html('image_classification.csv'))
with gr.TabItem("Image Captioning 📝"):
gr.HTML(get_model_names_html('image_captioning.csv'))
with gr.TabItem("Summarization 📃"):
gr.HTML(get_model_names_html('summarization.csv'))
with gr.TabItem("Automatic Speech Recognition 💬"):
gr.HTML(get_model_names_html('asr.csv'))
with gr.TabItem("Object Detection 🚘"):
gr.HTML(get_model_names_html('object_detection.csv'))
with gr.TabItem("Sentence Similarity 📚"):
gr.HTML(get_model_names_html('sentence_similarity.csv'))
with gr.TabItem("Extractive QA ❔"):
gr.HTML(get_model_names_html('question_answering.csv'))
with gr.TabItem("All Tasks 💡"):
gr.HTML(get_all_model_names_html())
with gr.Accordion("📙 Citation", open=False):
citation_button = gr.Textbox(
value=CITATION_BUTTON_TEXT,
label=CITATION_BUTTON_LABEL,
elem_id="citation-button",
lines=10,
show_copy_button=True,
)
gr.Markdown("""Last updated: February 2025""")
demo.launch() |