Spaces:
Sleeping
Sleeping
File size: 14,527 Bytes
460fdc7 42e8f64 c40907d 2ec9b03 4f8bac4 2ec9b03 4f8bac4 2ec9b03 4f8bac4 0a8b643 4f8bac4 b3f5a49 c3f4f1f 4f8bac4 c3f4f1f b3f5a49 c3f4f1f b3f5a49 c3f4f1f 828c71e 22ec62d b3f5a49 22ec62d b3f5a49 c3f4f1f 22ec62d b3f5a49 c3f4f1f 22ec62d b3f5a49 22ec62d c3f4f1f 22ec62d c3f4f1f 22ec62d b3f5a49 c3f4f1f 22ec62d b3f5a49 8b7dfb4 c3f4f1f 8b7dfb4 b3f5a49 c3f4f1f 8b7dfb4 b3f5a49 88fbc65 b3f5a49 8b7dfb4 c3f4f1f 41cd010 4567668 f7b4006 7022131 7786ff5 b3f5a49 4f8bac4 88fbc65 b3f5a49 88fbc65 f7b4006 b3f5a49 7022131 b3f5a49 7022131 b3f5a49 7022131 b3f5a49 7022131 b3f5a49 3fe7e68 b3f5a49 3fe7e68 b3f5a49 4f8bac4 b3f5a49 3fe7e68 b3f5a49 3fe7e68 b3f5a49 7022131 b3f5a49 296b387 b3f5a49 40e7d39 4f8bac4 88fbc65 4f8bac4 b3f5a49 |
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 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 |
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):
"""
Given a dataframe with a numeric energy column (gpu_energy_numeric),
generate an HTML table with three columns:
- Model (the link)
- GPU Energy (Wh) plus a horizontal bar whose width is proportional
to the energy value relative to the maximum in the table.
- Score (displayed as stars)
"""
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}"
# Compute 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
# --- Modified functions to include a sort_order parameter ---
def get_model_names_html(task, sort_order="High to Low"):
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)
# Convert kWh to Wh:
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)
ascending = True if sort_order == "Low to High" else False
df = df.sort_values(by='gpu_energy_numeric', ascending=ascending)
return generate_html_table_from_df(df)
def get_all_model_names_html(sort_order="High to Low"):
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'])
ascending = True if sort_order == "Low to High" else False
all_df = all_df.sort_values(by='gpu_energy_numeric', ascending=ascending)
return generate_html_table_from_df(all_df)
def get_text_generation_model_names_html(model_class, sort_order="High to Low"):
df = pd.read_csv('data/energy/text_generation.csv')
if df.columns[0].startswith("Unnamed:"):
df = df.iloc[:, 1:]
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)
ascending = True if sort_order == "Low to High" else False
df = df.sort_values(by='gpu_energy_numeric', ascending=ascending)
return generate_html_table_from_df(df)
# --- Update functions for dropdown changes ---
# For Text Generation, two dropdowns: model class and sort order.
def update_text_generation(selected_display, sort_order):
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")
return get_text_generation_model_names_html(model_class, sort_order)
# For the other tabs, each update function simply takes the sort_order.
def update_image_generation(sort_order):
return get_model_names_html('image_generation.csv', sort_order)
def update_text_classification(sort_order):
return get_model_names_html('text_classification.csv', sort_order)
def update_image_classification(sort_order):
return get_model_names_html('image_classification.csv', sort_order)
def update_image_captioning(sort_order):
return get_model_names_html('image_captioning.csv', sort_order)
def update_summarization(sort_order):
return get_model_names_html('summarization.csv', sort_order)
def update_asr(sort_order):
return get_model_names_html('asr.csv', sort_order)
def update_object_detection(sort_order):
return get_model_names_html('object_detection.csv', sort_order)
def update_sentence_similarity(sort_order):
return get_model_names_html('sentence_similarity.csv', sort_order)
def update_extractive_qa(sort_order):
return get_model_names_html('question_answering.csv', sort_order)
def update_all_tasks(sort_order):
return get_all_model_names_html(sort_order)
# --- 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."""
)
# 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 gr.TabItem("Text Generation 💬"):
with gr.Row():
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]
)
sort_dropdown_tg = gr.Dropdown(
choices=["Low to High", "High to Low"],
label="Sort",
value="High to Low"
)
tg_table = gr.HTML(get_text_generation_model_names_html("A", "High to Low"))
# When either dropdown changes, update the table.
model_class_dropdown.change(fn=update_text_generation, inputs=[model_class_dropdown, sort_dropdown_tg], outputs=tg_table)
sort_dropdown_tg.change(fn=update_text_generation, inputs=[model_class_dropdown, sort_dropdown_tg], outputs=tg_table)
# --- Image Generation Tab ---
with gr.TabItem("Image Generation 📷"):
sort_dropdown_img = gr.Dropdown(
choices=["Low to High", "High to Low"],
label="Sort",
value="High to Low"
)
img_table = gr.HTML(get_model_names_html('image_generation.csv', "High to Low"))
sort_dropdown_img.change(fn=update_image_generation, inputs=sort_dropdown_img, outputs=img_table)
# --- Text Classification Tab ---
with gr.TabItem("Text Classification 🎭"):
sort_dropdown_tc = gr.Dropdown(
choices=["Low to High", "High to Low"],
label="Sort",
value="High to Low"
)
tc_table = gr.HTML(get_model_names_html('text_classification.csv', "High to Low"))
sort_dropdown_tc.change(fn=update_text_classification, inputs=sort_dropdown_tc, outputs=tc_table)
# --- Image Classification Tab ---
with gr.TabItem("Image Classification 🖼️"):
sort_dropdown_ic = gr.Dropdown(
choices=["Low to High", "High to Low"],
label="Sort",
value="High to Low"
)
ic_table = gr.HTML(get_model_names_html('image_classification.csv', "High to Low"))
sort_dropdown_ic.change(fn=update_image_classification, inputs=sort_dropdown_ic, outputs=ic_table)
# --- Image Captioning Tab ---
with gr.TabItem("Image Captioning 📝"):
sort_dropdown_icap = gr.Dropdown(
choices=["Low to High", "High to Low"],
label="Sort",
value="High to Low"
)
icap_table = gr.HTML(get_model_names_html('image_captioning.csv', "High to Low"))
sort_dropdown_icap.change(fn=update_image_captioning, inputs=sort_dropdown_icap, outputs=icap_table)
# --- Summarization Tab ---
with gr.TabItem("Summarization 📃"):
sort_dropdown_sum = gr.Dropdown(
choices=["Low to High", "High to Low"],
label="Sort",
value="High to Low"
)
sum_table = gr.HTML(get_model_names_html('summarization.csv', "High to Low"))
sort_dropdown_sum.change(fn=update_summarization, inputs=sort_dropdown_sum, outputs=sum_table)
# --- Automatic Speech Recognition Tab ---
with gr.TabItem("Automatic Speech Recognition 💬"):
sort_dropdown_asr = gr.Dropdown(
choices=["Low to High", "High to Low"],
label="Sort",
value="High to Low"
)
asr_table = gr.HTML(get_model_names_html('asr.csv', "High to Low"))
sort_dropdown_asr.change(fn=update_asr, inputs=sort_dropdown_asr, outputs=asr_table)
# --- Object Detection Tab ---
with gr.TabItem("Object Detection 🚘"):
sort_dropdown_od = gr.Dropdown(
choices=["Low to High", "High to Low"],
label="Sort",
value="High to Low"
)
od_table = gr.HTML(get_model_names_html('object_detection.csv', "High to Low"))
sort_dropdown_od.change(fn=update_object_detection, inputs=sort_dropdown_od, outputs=od_table)
# --- Sentence Similarity Tab ---
with gr.TabItem("Sentence Similarity 📚"):
sort_dropdown_ss = gr.Dropdown(
choices=["Low to High", "High to Low"],
label="Sort",
value="High to Low"
)
ss_table = gr.HTML(get_model_names_html('sentence_similarity.csv', "High to Low"))
sort_dropdown_ss.change(fn=update_sentence_similarity, inputs=sort_dropdown_ss, outputs=ss_table)
# --- Extractive QA Tab ---
with gr.TabItem("Extractive QA ❔"):
sort_dropdown_qa = gr.Dropdown(
choices=["Low to High", "High to Low"],
label="Sort",
value="High to Low"
)
qa_table = gr.HTML(get_model_names_html('question_answering.csv', "High to Low"))
sort_dropdown_qa.change(fn=update_extractive_qa, inputs=sort_dropdown_qa, outputs=qa_table)
# --- All Tasks Tab ---
with gr.TabItem("All Tasks 💡"):
sort_dropdown_all = gr.Dropdown(
choices=["Low to High", "High to Low"],
label="Sort",
value="High to Low"
)
all_table = gr.HTML(get_all_model_names_html("High to Low"))
sort_dropdown_all.change(fn=update_all_tasks, inputs=sort_dropdown_all, outputs=all_table)
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()
|