NexusCoder / nexus /eval /benchmarks.py
AdminReal's picture
Import NexusCoder from github.com/mhieuhonda/NexusCoder
eca5751 verified
Raw
History Blame Contribute Delete
5.81 kB
"""Benchmark Suite - Đánh giá model trên multiple benchmarks."""
from __future__ import annotations
from typing import Dict, Any, List, Optional, Callable
from dataclasses import dataclass, field
from enum import Enum
class BenchmarkType(str, Enum):
MMLU = "mmlu" # General knowledge
HUMANEVAL = "humaneval" # Code generation
GSM8K = "gsm8k" # Math reasoning
BBH = "bbh" # Big-bench hard
truthful_qa = "truthful_qa"
MT_BENCH = "mt_bench" # Multi-turn chat
VI_BENCH = "vi_bench" # Vietnamese specific
@dataclass
class Benchmark:
"""Một benchmark evaluation."""
name: str
type: BenchmarkType
description: str
num_examples: int
languages: List[str] = field(default_factory=lambda: ["en"])
metrics: List[str] = field(default_factory=lambda: ["accuracy"])
estimated_time_minutes: int = 30
class BenchmarkSuite:
"""Run model on multiple benchmarks.
Usage:
suite = BenchmarkSuite()
suite.add(Benchmark(name="humaneval", ...))
results = suite.run(model, tokenizer)
"""
SUPPORTED_BENCHMARKS = [
Benchmark(
name="humaneval",
type=BenchmarkType.HUMANEVAL,
description="HumanEval - Code generation (164 problems)",
num_examples=164,
languages=["en"],
metrics=["pass@1", "pass@10"],
estimated_time_minutes=60,
),
Benchmark(
name="mbpp",
type=BenchmarkType.HUMANEVAL,
description="MBPP - Mostly Basic Python Problems (974 problems)",
num_examples=974,
languages=["en"],
metrics=["pass@1"],
estimated_time_minutes=90,
),
Benchmark(
name="gsm8k",
type=BenchmarkType.GSM8K,
description="Grade School Math 8K",
num_examples=1319,
languages=["en"],
metrics=["accuracy"],
estimated_time_minutes=45,
),
Benchmark(
name="mmlu",
type=BenchmarkType.MMLU,
description="Massive Multitask Language Understanding",
num_examples=14042,
languages=["en"],
metrics=["accuracy"],
estimated_time_minutes=120,
),
Benchmark(
name="bbh",
type=BenchmarkType.BBH,
description="BIG-Bench Hard (23 tasks)",
num_examples=6511,
languages=["en"],
metrics=["accuracy"],
estimated_time_minutes=180,
),
Benchmark(
name="truthful_qa",
type=BenchmarkType.truthful_qa,
description="TruthfulQA - Measure truthfulness",
num_examples=817,
languages=["en"],
metrics=["truthful", "informative"],
estimated_time_minutes=20,
),
Benchmark(
name="mt_bench",
type=BenchmarkType.MT_BENCH,
description="Multi-turn benchmark for chat assistants",
num_examples=80,
languages=["en"],
metrics=["gpt4_score", "judge_score"],
estimated_time_minutes=30,
),
Benchmark(
name="vi_bench",
type=BenchmarkType.VI_BENCH,
description="Vietnamese language understanding",
num_examples=500,
languages=["vi"],
metrics=["accuracy", "fluency"],
estimated_time_minutes=15,
),
]
def __init__(self):
self._benchmarks: Dict[str, Benchmark] = {
b.name: b for b in self.SUPPORTED_BENCHMARKS
}
self._results: Dict[str, Dict] = {}
def add(self, benchmark: Benchmark) -> None:
self._benchmarks[benchmark.name] = benchmark
def list_available(self) -> List[Benchmark]:
return list(self._benchmarks.values())
def run(
self,
model,
tokenizer,
benchmarks: Optional[List[str]] = None,
sample_size: Optional[int] = None,
) -> Dict[str, Dict[str, Any]]:
"""Run benchmarks on model.
Args:
model: NexusCoderForCausalLM
tokenizer: NexusTokenizer
benchmarks: List of benchmark names (None = all)
sample_size: Limit examples per benchmark (for quick eval)
"""
to_run = benchmarks or list(self._benchmarks.keys())
results = {}
for name in to_run:
if name not in self._benchmarks:
results[name] = {"error": f"Unknown benchmark: {name}"}
continue
bench = self._benchmarks[name]
results[name] = {
"status": "not_implemented",
"benchmark": bench.name,
"description": bench.description,
"num_examples": bench.num_examples,
"sample_size": sample_size,
"note": "Evaluation requires downloading dataset. Run scripts/evaluate.py with --download flag.",
}
self._results = results
return results
def summary(self) -> str:
"""Generate summary report."""
if not self._results:
return "No results yet. Run benchmarks first."
lines = ["Benchmark Results Summary", "=" * 50]
for name, result in self._results.items():
if "error" in result:
lines.append(f" {name}: ERROR - {result['error']}")
elif "scores" in result:
lines.append(f" {name}: {result['scores']}")
else:
lines.append(f" {name}: {result.get('status', 'unknown')}")
return "\n".join(lines)