Spaces:
Running
Running
yangzhitao
commited on
Commit
·
b2443f5
1
Parent(s):
944602c
feat: enhance MetaToml and EvalResult classes with new mapping properties and link handling
Browse files- src/display/formatting.py +7 -5
- src/leaderboard/read_evals.py +43 -20
- src/prepare.py +33 -16
src/display/formatting.py
CHANGED
|
@@ -8,11 +8,13 @@ def model_hyperlink(link: str, model_name: str) -> str:
|
|
| 8 |
return f'<a target="_blank" href="{link}" style="color: var(--link-text-color); text-decoration: underline;text-decoration-style: dotted;">{model_name}</a>'
|
| 9 |
|
| 10 |
|
| 11 |
-
def make_clickable_model(model_name: str) -> str:
|
| 12 |
-
if
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
|
|
|
|
|
|
| 16 |
return model_hyperlink(link, model_name)
|
| 17 |
|
| 18 |
|
|
|
|
| 8 |
return f'<a target="_blank" href="{link}" style="color: var(--link-text-color); text-decoration: underline;text-decoration-style: dotted;">{model_name}</a>'
|
| 9 |
|
| 10 |
|
| 11 |
+
def make_clickable_model(model_name: str, link: str | None = None) -> str:
|
| 12 |
+
if not link:
|
| 13 |
+
org, _, model = model_name.rpartition("/")
|
| 14 |
+
if not org:
|
| 15 |
+
# Not a full model name, cannot be clicked
|
| 16 |
+
return model_name
|
| 17 |
+
link = f"https://huggingface.co/{org}/{model}"
|
| 18 |
return model_hyperlink(link, model_name)
|
| 19 |
|
| 20 |
|
src/leaderboard/read_evals.py
CHANGED
|
@@ -12,7 +12,7 @@ from typing import Annotated, Any
|
|
| 12 |
|
| 13 |
import dateutil.parser
|
| 14 |
import numpy as np
|
| 15 |
-
from pydantic import BaseModel, ConfigDict, Field
|
| 16 |
from typing_extensions import Self
|
| 17 |
|
| 18 |
from src.about import get_benchmarks
|
|
@@ -51,6 +51,7 @@ class EvalResult(BaseModel):
|
|
| 51 |
full_model: str # org/model (path on hub)
|
| 52 |
org: str | None
|
| 53 |
model: str
|
|
|
|
| 54 |
revision: str # commit hash, "" if main
|
| 55 |
results: dict[str, float]
|
| 56 |
precision: Precision = Precision.Unknown
|
|
@@ -63,6 +64,18 @@ class EvalResult(BaseModel):
|
|
| 63 |
date: str = "" # submission date of request file
|
| 64 |
still_on_hub: bool = False
|
| 65 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 66 |
@classmethod
|
| 67 |
def init_from_json_file(cls, json_filepath: str) -> Self:
|
| 68 |
"""Inits the result from the specific model result file"""
|
|
@@ -77,26 +90,35 @@ class EvalResult(BaseModel):
|
|
| 77 |
|
| 78 |
# Get model and org
|
| 79 |
model_key = config.model_name or config.model_args or ""
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 86 |
result_key = f"{model}_{precision.value.name}"
|
| 87 |
else:
|
| 88 |
-
org = org_and_model[0]
|
| 89 |
-
model = org_and_model[1]
|
| 90 |
result_key = f"{org}_{model}_{precision.value.name}"
|
| 91 |
-
full_model = "/".join(org_and_model)
|
| 92 |
-
|
| 93 |
-
# update full_model from meta_toml if it exists
|
| 94 |
-
if "/" not in full_model:
|
| 95 |
-
full_model = meta_toml.model_key_to_title.get(full_model, full_model)
|
| 96 |
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 100 |
architecture: str = "?"
|
| 101 |
if model_config is not None:
|
| 102 |
architectures: list[str] | None = getattr(model_config, "architectures", None)
|
|
@@ -125,9 +147,10 @@ class EvalResult(BaseModel):
|
|
| 125 |
|
| 126 |
return cls.model_validate({
|
| 127 |
"eval_name": result_key,
|
| 128 |
-
"full_model":
|
| 129 |
-
"org": org,
|
| 130 |
"model": model,
|
|
|
|
| 131 |
"results": results,
|
| 132 |
"precision": precision,
|
| 133 |
"revision": config.model_sha or "",
|
|
@@ -165,7 +188,7 @@ class EvalResult(BaseModel):
|
|
| 165 |
AutoEvalColumn.model_type_symbol.name: self.model_type.value.symbol,
|
| 166 |
AutoEvalColumn.weight_type.name: self.weight_type.value.name,
|
| 167 |
AutoEvalColumn.architecture.name: self.architecture,
|
| 168 |
-
AutoEvalColumn.model.name: make_clickable_model(self.full_model),
|
| 169 |
AutoEvalColumn.revision.name: self.revision,
|
| 170 |
AutoEvalColumn.average.name: average,
|
| 171 |
AutoEvalColumn.license.name: self.license,
|
|
|
|
| 12 |
|
| 13 |
import dateutil.parser
|
| 14 |
import numpy as np
|
| 15 |
+
from pydantic import BaseModel, ConfigDict, Field, computed_field
|
| 16 |
from typing_extensions import Self
|
| 17 |
|
| 18 |
from src.about import get_benchmarks
|
|
|
|
| 51 |
full_model: str # org/model (path on hub)
|
| 52 |
org: str | None
|
| 53 |
model: str
|
| 54 |
+
link_url: str | None = None
|
| 55 |
revision: str # commit hash, "" if main
|
| 56 |
results: dict[str, float]
|
| 57 |
precision: Precision = Precision.Unknown
|
|
|
|
| 64 |
date: str = "" # submission date of request file
|
| 65 |
still_on_hub: bool = False
|
| 66 |
|
| 67 |
+
@computed_field
|
| 68 |
+
@property
|
| 69 |
+
def link(self) -> str | None:
|
| 70 |
+
"""Link to the model on the hub or other platform."""
|
| 71 |
+
if self.link_url:
|
| 72 |
+
# Use explicitly provided link
|
| 73 |
+
return self.link_url
|
| 74 |
+
if self.org and self.model:
|
| 75 |
+
# Use inferred link on HuggingFace
|
| 76 |
+
return f"https://huggingface.co/{self.org}/{self.model}"
|
| 77 |
+
return None
|
| 78 |
+
|
| 79 |
@classmethod
|
| 80 |
def init_from_json_file(cls, json_filepath: str) -> Self:
|
| 81 |
"""Inits the result from the specific model result file"""
|
|
|
|
| 90 |
|
| 91 |
# Get model and org
|
| 92 |
model_key = config.model_name or config.model_args or ""
|
| 93 |
+
model = model_key
|
| 94 |
+
org = None
|
| 95 |
+
link_url = None
|
| 96 |
+
m_repo = meta_toml.model_key_to_repo.get(model_key)
|
| 97 |
+
if m_repo is not None:
|
| 98 |
+
if m_repo.repo_id:
|
| 99 |
+
org, _, model = m_repo.repo_id.rpartition("/")
|
| 100 |
+
org = org or None
|
| 101 |
+
if m_repo.link:
|
| 102 |
+
link_url = m_repo.link
|
| 103 |
+
if not org:
|
| 104 |
result_key = f"{model}_{precision.value.name}"
|
| 105 |
else:
|
|
|
|
|
|
|
| 106 |
result_key = f"{org}_{model}_{precision.value.name}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 107 |
|
| 108 |
+
model_title = model_key
|
| 109 |
+
m_meta = meta_toml.model_key_to_model.get(model_key)
|
| 110 |
+
if m_meta is not None and m_meta.title:
|
| 111 |
+
model_title = m_meta.title
|
| 112 |
+
|
| 113 |
+
if org:
|
| 114 |
+
still_on_hub, _, model_config = is_model_on_hub(
|
| 115 |
+
f"{org}/{model}",
|
| 116 |
+
config.model_sha or "main",
|
| 117 |
+
trust_remote_code=True,
|
| 118 |
+
test_tokenizer=False,
|
| 119 |
+
)
|
| 120 |
+
else:
|
| 121 |
+
still_on_hub = False
|
| 122 |
architecture: str = "?"
|
| 123 |
if model_config is not None:
|
| 124 |
architectures: list[str] | None = getattr(model_config, "architectures", None)
|
|
|
|
| 147 |
|
| 148 |
return cls.model_validate({
|
| 149 |
"eval_name": result_key,
|
| 150 |
+
"full_model": model_title,
|
| 151 |
+
"org": org or None,
|
| 152 |
"model": model,
|
| 153 |
+
"link_url": link_url or None,
|
| 154 |
"results": results,
|
| 155 |
"precision": precision,
|
| 156 |
"revision": config.model_sha or "",
|
|
|
|
| 188 |
AutoEvalColumn.model_type_symbol.name: self.model_type.value.symbol,
|
| 189 |
AutoEvalColumn.weight_type.name: self.weight_type.value.name,
|
| 190 |
AutoEvalColumn.architecture.name: self.architecture,
|
| 191 |
+
AutoEvalColumn.model.name: make_clickable_model(self.full_model, self.link),
|
| 192 |
AutoEvalColumn.revision.name: self.revision,
|
| 193 |
AutoEvalColumn.average.name: average,
|
| 194 |
AutoEvalColumn.license.name: self.license,
|
src/prepare.py
CHANGED
|
@@ -60,9 +60,41 @@ class MetaToml(BaseModel):
|
|
| 60 |
model_config = ConfigDict(extra="allow", frozen=True)
|
| 61 |
|
| 62 |
models: list["MetaToml_Model"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 63 |
benchmarks: list["MetaToml_Benchmark"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 64 |
model_repos: list["MetaToml_ModelRepo"]
|
| 65 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 66 |
@cached_property
|
| 67 |
def model_title_to_key(self) -> dict[str, str]:
|
| 68 |
return {model.title.lower(): model.key for model in self.models}
|
|
@@ -75,22 +107,6 @@ class MetaToml(BaseModel):
|
|
| 75 |
def model_key_to_repo_id(self) -> dict[str, str]:
|
| 76 |
return {model.key: model.repo_id for model in self.model_repos if model.repo_id is not None}
|
| 77 |
|
| 78 |
-
@cached_property
|
| 79 |
-
def model_key_to_title(self) -> dict[str, str]:
|
| 80 |
-
return {model.key: model.title for model in self.models}
|
| 81 |
-
|
| 82 |
-
@cached_property
|
| 83 |
-
def model_title_to_repo_id(self) -> dict[str, str]:
|
| 84 |
-
mapping: dict[str, str] = {}
|
| 85 |
-
for model in self.models:
|
| 86 |
-
model_title = model.title.lower()
|
| 87 |
-
model_key = self.model_title_to_key.get(model_title)
|
| 88 |
-
if model_key:
|
| 89 |
-
model_repo_id = self.model_key_to_repo_id.get(model_key)
|
| 90 |
-
if model_repo_id:
|
| 91 |
-
mapping[model_title] = model_repo_id
|
| 92 |
-
return mapping
|
| 93 |
-
|
| 94 |
|
| 95 |
class _HashableComparableMixin(BaseModel):
|
| 96 |
model_config = ConfigDict(extra="allow", frozen=True)
|
|
@@ -129,6 +145,7 @@ class MetaToml_ModelRepo(BaseModel):
|
|
| 129 |
|
| 130 |
key: str
|
| 131 |
repo_id: str | None = None
|
|
|
|
| 132 |
|
| 133 |
|
| 134 |
@lru_cache(maxsize=1)
|
|
|
|
| 60 |
model_config = ConfigDict(extra="allow", frozen=True)
|
| 61 |
|
| 62 |
models: list["MetaToml_Model"]
|
| 63 |
+
|
| 64 |
+
@cached_property
|
| 65 |
+
def model_key_to_model(self) -> dict[str, "MetaToml_Model"]:
|
| 66 |
+
return {model.key: model for model in self.models}
|
| 67 |
+
|
| 68 |
+
@cached_property
|
| 69 |
+
def model_title_to_model(self) -> dict[str, "MetaToml_Model"]:
|
| 70 |
+
"""Model title (lower case) to model mapping"""
|
| 71 |
+
return {model.title.lower(): model for model in self.models}
|
| 72 |
+
|
| 73 |
benchmarks: list["MetaToml_Benchmark"]
|
| 74 |
+
|
| 75 |
+
@cached_property
|
| 76 |
+
def benchmark_key_to_benchmark(self) -> dict[str, "MetaToml_Benchmark"]:
|
| 77 |
+
return {benchmark.key: benchmark for benchmark in self.benchmarks}
|
| 78 |
+
|
| 79 |
model_repos: list["MetaToml_ModelRepo"]
|
| 80 |
|
| 81 |
+
@cached_property
|
| 82 |
+
def model_key_to_repo(self) -> dict[str, "MetaToml_ModelRepo"]:
|
| 83 |
+
return {repo.key: repo for repo in self.model_repos}
|
| 84 |
+
|
| 85 |
+
# --- Helper properties ---
|
| 86 |
+
@cached_property
|
| 87 |
+
def model_title_to_repo(self) -> dict[str, "MetaToml_ModelRepo"]:
|
| 88 |
+
"""Model title (lower case) to model repo mapping"""
|
| 89 |
+
mapping = {}
|
| 90 |
+
for model in self.models:
|
| 91 |
+
title = model.title.lower()
|
| 92 |
+
key = model.key
|
| 93 |
+
repo = self.model_key_to_repo.get(key)
|
| 94 |
+
if repo:
|
| 95 |
+
mapping[title] = repo
|
| 96 |
+
return mapping
|
| 97 |
+
|
| 98 |
@cached_property
|
| 99 |
def model_title_to_key(self) -> dict[str, str]:
|
| 100 |
return {model.title.lower(): model.key for model in self.models}
|
|
|
|
| 107 |
def model_key_to_repo_id(self) -> dict[str, str]:
|
| 108 |
return {model.key: model.repo_id for model in self.model_repos if model.repo_id is not None}
|
| 109 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 110 |
|
| 111 |
class _HashableComparableMixin(BaseModel):
|
| 112 |
model_config = ConfigDict(extra="allow", frozen=True)
|
|
|
|
| 145 |
|
| 146 |
key: str
|
| 147 |
repo_id: str | None = None
|
| 148 |
+
link: str | None = None
|
| 149 |
|
| 150 |
|
| 151 |
@lru_cache(maxsize=1)
|