comparator / src /env_impact.py
albertvillanova's picture
albertvillanova HF Staff
Support comparing environmental impact
608184c verified
Raw
History Blame Contribute Delete
4.86 kB
from datetime import timedelta
import plotly.express as px
import src.constants as constants
from src.hub import load_model_card
from src.requests import load_request
async def get_env_impact(data):
total_evaluation_time_seconds = data.get("total_evaluation_time_seconds")
if total_evaluation_time_seconds:
total_evaluation_time_seconds = float(total_evaluation_time_seconds)
env_impact = {
"co2_emissions": calculate_co2_emissions(total_evaluation_time_seconds),
"total_evaluation_time": str(timedelta(seconds=total_evaluation_time_seconds)),
"num_parameters_billions": data.get("config", {}).get("model_num_parameters") / 10**9,
"precision": data.get("config", {}).get("model_dtype"),
}
request = await load_request(data["model_name"], env_impact["precision"])
if request:
model_type_label = request.get("model_type", "unknown")
env_impact["model_type"] = constants.MODEL_TYPE_LABEL_TO_TYPE.get(model_type_label, model_type_label)
env_impact["architecture"] = request.get("architectures", "Unknown")
# MoE
model_card = await load_model_card(data["model_name"])
model_tags = get_moe_model_tags(model_card.data, data["model_name"])
moe = "moe" in model_tags or "moe" in data["model_name"].lower()
env_impact["moe"] = moe
return env_impact
# Source: https://huggingface.co/docs/leaderboards/open_llm_leaderboard/emissions#function-for-c02-calculation
def calculate_co2_emissions(total_evaluation_time_seconds: float | None) -> float:
if total_evaluation_time_seconds is None or total_evaluation_time_seconds <= 0:
return -1
# Power consumption for 8 H100 SXM GPUs in kilowatts (kW)
power_consumption_kW = 5.6
# Carbon intensity in grams CO₂ per kWh in Virginia
carbon_intensity_g_per_kWh = 269.8
# Convert evaluation time to hours
total_evaluation_time_hours = total_evaluation_time_seconds / 3600
# Calculate energy consumption in kWh
energy_consumption_kWh = power_consumption_kW * total_evaluation_time_hours
# Calculate CO₂ emissions in grams
co2_emissions_g = energy_consumption_kWh * carbon_intensity_g_per_kWh
# Convert grams to kilograms
return co2_emissions_g / 1000
# Source: https://huggingface.co/spaces/open-llm-leaderboard/open_llm_leaderboard_parser/blob/main/src/submission/check_validity.py#L33
def get_moe_model_tags(model_card, model_id):
# is_merge_from_metadata = False
is_moe_from_metadata = False
is_moe_from_model_card = False
# is_merge_from_model_card = False
tags = []
if model_card is None:
return tags
if model_card.tags:
# is_merge_from_metadata = any(tag in model_card.tags for tag in ["merge", "moerge", "mergekit", "lazymergekit"])
is_moe_from_metadata = any(tag in model_card.tags for tag in ["moe", "moerge", "mixtral"])
if model_card.get("text", False):
# is_merge_from_model_card = any(
# keyword in model_card.text.lower() for keyword in ["merged model", "merge model", "moerge"]
# )
is_moe_from_model_card = any(keyword in model_card.text.lower() for keyword in ["moe", "mixtral"])
# if is_merge_from_model_card or is_merge_from_metadata:
# tags.append("merge")
is_moe_from_name = any(
key in model_id.lower().replace("/", "-").replace("_", "-").split("-") for key in ["moe", "mixtral"]
)
# Hardcoded check for "rhymes-ai/Aria" model
if model_id == "rhymes-ai/Aria":
tags.append("moe")
elif is_moe_from_model_card or is_moe_from_name or is_moe_from_metadata:
tags.append("moe")
return tags
def plot_env_impact(df):
if df is None:
return None, None
fig_1 = px.scatter(
df.rename_axis(index="Model").reset_index(),
x="env_impact.num_parameters_billions",
y="env_impact.co2_emissions",
color="Model",
title="Evaluation CO₂ Emissions (kg) vs. #Params (B)",
labels={
"env_impact.num_parameters_billions": "#Params (B)",
"env_impact.co2_emissions": "Evaluation CO₂ Emissions (kg)",
},
color_discrete_sequence=px.colors.qualitative.Safe, # TODO: https://plotly.com/python/discrete-color/
)
fig_2 = px.scatter(
df.rename_axis(index="Model").reset_index(),
x="results.leaderboard.acc_norm,none",
y="env_impact.co2_emissions",
color="Model",
title="Evaluation CO₂ Emissions (kg) vs. Score",
labels={
"results.leaderboard.acc_norm,none": "Mean Score",
"env_impact.co2_emissions": "Evaluation CO₂ Emissions (kg)",
},
color_discrete_sequence=px.colors.qualitative.Safe, # TODO: https://plotly.com/python/discrete-color/
)
fig_2.update_xaxes(range=[0, 1])
return fig_1, fig_2