MSG
Merge pull request #4 from MSghais/experiment/small_model_building_testing
59e2c8a
Raw
History Blame Contribute Delete
6.19 kB
"""Load and display eval profile catalog from configs/eval_profiles.yaml."""
from __future__ import annotations
from pathlib import Path
from typing import Any
import yaml
_REPO_ROOT = Path(__file__).resolve().parents[5]
_CONFIGS_DIR = Path(__file__).resolve().parents[3] / "configs"
_PROFILES_FILE = _CONFIGS_DIR / "eval_profiles.yaml"
def load_profiles_catalog() -> dict[str, Any]:
if not _PROFILES_FILE.is_file():
raise FileNotFoundError(f"Profile catalog not found: {_PROFILES_FILE}")
with open(_PROFILES_FILE) as f:
return yaml.safe_load(f) or {}
def config_path_for_profile(name: str) -> Path:
catalog = load_profiles_catalog()
profiles = catalog.get("profiles", {})
if name not in profiles:
known = ", ".join(sorted(profiles))
raise ValueError(f"Unknown lm-eval profile {name!r}. Known: {known}")
rel = profiles[name].get("config")
if not rel:
raise ValueError(f"Profile {name!r} has no config file in eval_profiles.yaml")
path = _CONFIGS_DIR / rel
if not path.is_file():
raise FileNotFoundError(f"Profile config missing: {path}")
return path
def _format_tasks(tasks: list[str] | None) -> str:
if not tasks:
return "—"
return ", ".join(tasks)
def format_profiles_table(*, include_suites: bool = False, include_external: bool = False) -> str:
catalog = load_profiles_catalog()
lines = [
"Eval profiles (slm-lm-eval — use --profile NAME or --config PATH)",
"",
f"{'Profile':<16} {'Claim':<28} {'Tasks'}",
f"{'-'*16} {'-'*28} {'-'*40}",
]
for name, meta in sorted(catalog.get("profiles", {}).items()):
claim = meta.get("claim", "")
tasks = _format_tasks(meta.get("tasks"))
config = meta.get("config", "")
lines.append(f"{name:<16} {claim:<28} {tasks}")
if meta.get("description"):
lines.append(f"{'':16} config: {config}")
lines.append(f"{'':16} {meta['description']}")
lines.append("")
if include_suites:
lines.extend(
[
"",
"Other suites (separate CLI — see docs/eval_profiles.md)",
"",
f"{'Suite':<16} {'Tool':<14} {'Claim':<28}",
f"{'-'*16} {'-'*14} {'-'*28}",
]
)
for name, meta in sorted(catalog.get("suites", {}).items()):
tool = meta.get("tool", "")
claim = meta.get("claim", "")
lines.append(f"{name:<16} {tool:<14} {claim:<28}")
benchmarks = meta.get("benchmarks")
if benchmarks:
lines.append(f"{'':16} benchmarks: {', '.join(benchmarks)}")
if meta.get("command"):
lines.append(f"{'':16} {meta['command']}")
lines.append("")
if include_external:
lines.extend(
[
"",
"External (not integrated in this repo)",
"",
]
)
for name, meta in sorted(catalog.get("external", {}).items()):
lines.append(f"- {name}: {meta.get('claim', '')}{meta.get('description', '')}")
lines.extend(
[
"",
"Examples:",
" slm-lm-eval --list-profiles",
" slm-lm-eval --profile reasoning --preset minicpm5-1b --experiment-name baseline",
" slm-benchmark --list-benchmarks",
]
)
return "\n".join(lines)
def list_lm_eval_task_names(limit: int = 80) -> list[str]:
try:
from lm_eval.tasks import TaskManager
tm = TaskManager()
names = sorted(tm.all_tasks)
return names[:limit] if limit else names
except ImportError:
return []
def format_lm_eval_tasks(*, limit: int = 80) -> str:
tasks = list_lm_eval_task_names(limit=limit)
if not tasks:
catalog = load_profiles_catalog()
seen: set[str] = set()
for section in ("profiles",):
for meta in catalog.get(section, {}).values():
for task in meta.get("tasks") or []:
seen.add(task)
tasks = sorted(seen)
header = (
"lm-eval not installed — showing tasks referenced in eval_profiles.yaml only.\n"
"Install: uv sync --group lm-eval\n"
)
else:
header = f"lm-eval tasks (first {len(tasks)}; run with --list-tasks --all for full list):\n"
lines = [header.rstrip(), ""]
col = 4
for i in range(0, len(tasks), col):
chunk = tasks[i : i + col]
lines.append(" ".join(f"{t:<22}" for t in chunk))
lines.append("")
lines.append("Use in a run: slm-lm-eval --profile reasoning --preset minicpm5-1b")
lines.append("Or override: slm-lm-eval --config ... --tasks gsm8k arc_easy")
return "\n".join(lines)
def format_agentic_benchmarks() -> str:
from slm_evals.run_benchmark import BENCHMARK_REGISTRY
catalog = load_profiles_catalog()
lines = [
"Agentic benchmarks (slm-benchmark — use --benchmarks NAME)",
"",
f"{'Key':<12} {'Measures'}",
f"{'-'*12} {'-'*50}",
"bfcl Single-turn function calling (Berkeley FC Leaderboard)",
"tau_bench Multi-turn tool + user simulation",
"gaia End-to-end assistant tasks (reasoning + tools)",
"swe_bench Code patch generation (SWE-bench Verified)",
"all Run all four benchmarks",
"",
"Registered in code:",
]
for key in sorted(BENCHMARK_REGISTRY):
lines.append(f" - {key}")
lines.append("")
lines.append("Preset suites from eval_profiles.yaml:")
for name, meta in sorted(catalog.get("suites", {}).items()):
if meta.get("tool") != "slm-benchmark":
continue
bms = meta.get("benchmarks") or []
lines.append(f" {name}: {', '.join(bms)}")
lines.append(f" {meta.get('description', '')}")
lines.extend(
[
"",
"Example:",
" slm-benchmark --model openbmb/MiniCPM5-1B --benchmarks bfcl --max-samples 20",
]
)
return "\n".join(lines)