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 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 "/" not in model_name:
13
- # not a full model name, cannot be clicked
14
- return model_name
15
- link = f"https://huggingface.co/{model_name}"
 
 
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
- org_and_model = meta_toml.model_key_to_repo_id.get(model_key, model_key)
81
- org_and_model = org_and_model.split("/", 1)
82
-
83
- if len(org_and_model) == 1:
84
- org = None
85
- model = org_and_model[0]
 
 
 
 
 
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
- still_on_hub, _, model_config = is_model_on_hub(
98
- full_model, config.model_sha or "main", trust_remote_code=True, test_tokenizer=False
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": 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)