tizaino's picture
Update src/display/utils.py
45164fa verified
from dataclasses import dataclass, make_dataclass, field
from enum import Enum
from functools import partial
import pandas as pd
from src.about import Tasks
def fields(raw_class):
return [v for k, v in raw_class.__dict__.items() if k[:2] != "__" and k[-2:] != "__"]
# These classes are for user facing column names,
# to avoid having to change them all around the code
# when a modif is needed
@dataclass
class ColumnContent:
name: str
type: str
displayed_by_default: bool
hidden: bool = False
never_hidden: bool = False
# Leaderboard columns
auto_eval_column_dict = []
auto_eval_column_dict.append((
"rank",
ColumnContent,
field(default_factory=lambda: ColumnContent("Rank", "number", True, never_hidden=True))
))
auto_eval_column_dict.append((
"size_symbol",
ColumnContent,
field(default_factory=lambda: ColumnContent("Size", "number", True, never_hidden=True))
))
auto_eval_column_dict.append((
"fewshot_symbol",
ColumnContent,
field(default_factory=lambda: ColumnContent("FS", "str", True, never_hidden=True))
))
auto_eval_column_dict.append((
"is_5fewshot",
ColumnContent,
field(default_factory=lambda: ColumnContent("IS_FS", "bool", True))
))
auto_eval_column_dict.append((
"LANG",
ColumnContent,
field(default_factory=lambda: ColumnContent("LANG", "str", True, never_hidden=True))
))
auto_eval_column_dict.append((
"model",
ColumnContent,
field(default_factory=lambda: ColumnContent("Model", "markdown", True, never_hidden=True))
))
# Scores
auto_eval_column_dict.append((
"average",
ColumnContent,
field(default_factory=lambda: ColumnContent("Avg. Comb. Perf. ⬆️", "number", True))
))
for task in Tasks:
auto_eval_column_dict.append((
task.name,
ColumnContent,
field(default_factory=lambda t=task: ColumnContent(t.value.col_name, "number", True))
))
# Model info
auto_eval_column_dict.append((
"architecture",
ColumnContent,
field(default_factory=lambda: ColumnContent("Architecture", "str", False))
))
auto_eval_column_dict.append((
"weight_type",
ColumnContent,
field(default_factory=lambda: ColumnContent("Weight type", "str", False, True))
))
auto_eval_column_dict.append((
"license",
ColumnContent,
field(default_factory=lambda: ColumnContent("Hub License", "str", False))
))
auto_eval_column_dict.append((
"params",
ColumnContent,
field(default_factory=lambda: ColumnContent("#Params (B)", "number", False))
))
auto_eval_column_dict.append((
"likes",
ColumnContent,
field(default_factory=lambda: ColumnContent("Hub ❀️", "number", False))
))
auto_eval_column_dict.append((
"still_on_hub",
ColumnContent,
field(default_factory=lambda: ColumnContent("Available on the hub", "bool", False))
))
auto_eval_column_dict.append((
"revision",
ColumnContent,
field(default_factory=lambda: ColumnContent("Model sha", "str", False, False))
))
# Create dataclass
AutoEvalColumn = make_dataclass(
"AutoEvalColumn",
auto_eval_column_dict,
frozen=True
)
## For the queue columns in the submission tab
@dataclass(frozen=True)
class EvalQueueColumn: # Queue column
model = ColumnContent("model", "markdown", True)
revision = ColumnContent("revision", "str", True)
private = ColumnContent("private", "bool", True)
#precision = ColumnContent("precision", "str", True)
weight_type = ColumnContent("weight_type", "str", "Original")
status = ColumnContent("status", "str", True)
## All the model information that we might need
@dataclass
class ModelDetails:
name: str
display_name: str = ""
symbol: str = "" # emoji
class ModelType(Enum):
PT = ModelDetails(name="pretrained", symbol="🟒")
FT = ModelDetails(name="fine-tuned", symbol="πŸ”Ά")
IFT = ModelDetails(name="instruction-tuned", symbol="β­•")
RL = ModelDetails(name="RL-tuned", symbol="🟦")
Unknown = ModelDetails(name="", symbol="?")
def to_str(self, separator=" "):
return f"{self.value.symbol}{separator}{self.value.name}"
@staticmethod
def from_str(type):
if "fine-tuned" in type or "πŸ”Ά" in type:
return ModelType.FT
if "pretrained" in type or "🟒" in type:
return ModelType.PT
if "RL-tuned" in type or "🟦" in type:
return ModelType.RL
if "instruction-tuned" in type or "β­•" in type:
return ModelType.IFT
return ModelType.Unknown
@dataclass
class FewShotDetails:
name: str
symbol: str = "" # emoji
class FewShotType(Enum):
ZS = FewShotDetails(name="zero-shot", symbol="πŸ…ΎοΈ")
FS = FewShotDetails(name="10-few-shot", symbol="πŸ”Ÿ")
Unknown = FewShotDetails(name="unknown", symbol="❓")
def to_str(self, separator=" "):
return f"{self.value.symbol}{separator}{self.value.name}"
@staticmethod
def from_num_fewshot(is_5fewshot):
"""Determines FewShotType based on num_fewshot."""
if is_5fewshot is False:
return FewShotType.ZS
elif is_5fewshot is True:
return FewShotType.FS
return FewShotType.Unknown
@dataclass
class SizeDetails:
name: str
symbol: str = "" # emoji
class SizeType(Enum):
SMALL = SizeDetails(name="small", symbol="πŸ”΅")
MEDIUM = SizeDetails(name="medium", symbol="πŸ”΅πŸ”΅")
LARGE = SizeDetails(name="large", symbol="πŸ”΅πŸ”΅πŸ”΅")
Unknown = SizeDetails(name="unknown", symbol="❓")
def to_str(self, separator=" "):
return f"{self.value.symbol}{separator}{self.value.name}"
@staticmethod
def num2type(size):
"""Determines FewShotType based on num_fewshot."""
if size <= 10:
return SizeType.SMALL
elif size > 10 and size <= 50:
return SizeType.MEDIUM
else:
return SizeType.LARGE
class WeightType(Enum):
Adapter = ModelDetails("Adapter")
Original = ModelDetails("Original")
Delta = ModelDetails("Delta")
class Precision(Enum):
float16 = ModelDetails("float16")
bfloat16 = ModelDetails("bfloat16")
Unknown = ModelDetails("?")
def from_str(precision):
if precision in ["torch.float16", "float16"]:
return Precision.float16
if precision in ["torch.bfloat16", "bfloat16"]:
return Precision.bfloat16
return Precision.Unknown
# Column selection
COLS = [c.name for c in fields(AutoEvalColumn) if not c.hidden]
EVAL_COLS = [c.name for c in fields(EvalQueueColumn)]
EVAL_TYPES = [c.type for c in fields(EvalQueueColumn)]
BENCHMARK_COLS = [t.value.col_name for t in Tasks]
'''
# Nuovi valori per CPS, AVERAGE, BEST, e ID nella tabella
@dataclass
class NewColumnContent:
name: str
type: str
displayed_by_default: bool
hidden: bool = False
never_hidden: bool = False
'''
'''
new_column_dict = []
# Aggiungi CPS, VERAGE, BEST, ID
new_column_dict.append(["CPS", NewColumnContent, NewColumnContent("CPS", "number", True)])
new_column_dict.append(["AVERAGE", NewColumnContent, NewColumnContent("Average ⬆️", "number", True)])
new_column_dict.append(["BEST", NewColumnContent, NewColumnContent("Best Performance", "number", True)])
new_column_dict.append(["ID", NewColumnContent, NewColumnContent("ID", "str", True)])
NewColumn = make_dataclass("NewColumn", new_column_dict, frozen=True)
NEW_COLS = [c.name for c in fields(NewColumn) if not c.hidden]
'''