数据截至 (上游 commit 932e1f2f4c5a)
Lighteval — 架构与原理
30 秒导读: Lighteval 是 HuggingFace 的模型评测框架——评的是 LLM 本身(不是 agent 系统)。你给它一个模型 + 一串任务名,它把每个任务变成标准化样本、按指标需要的提问方式(「生成一段文字」还是「给几个选项打分」)批量请求模型,最后聚合成带标准误的分数表。它同时是 HF 训练栈的「评测插头」:能直接加载 nanotron 训练中的 checkpoint 评测,并把结果推到 Hub 和 TensorBoard。
1. 这是什么(零基础也能懂)
一句话定义
Lighteval 是一个给大语言模型跑基准测试(benchmark)的库:内置 1000+ 个预定义评测任务,你选任务、选后端,它负责出题、收答案、算分、出报告。
它要解决谁的什么问题
设想你在训练一个模型,或者想比较几个开源模型谁更强:
- 基准有几千道题,格式千奇百怪(选择题、开放式问答、翻译、数学题)。
- 有的题该让模型自由生成再对答案,有的题该比较几个候选答案的概率——两种问法对模型 API 的要求完全不同。
- 你想换后端:本地用 vLLM 跑得快,调试时用 transformers,训练中想直接评 nanotron 的 checkpoint,或者干脆调远程 API。
- 分数要有误差线,否则 0.2 分的差距说不清是不是噪声。
- 结果要能复现、能推送、能逐条查(哪道题错了、模型具体输出了什么)。
Lighteval 把这些一次性管掉。它的定位由作者自己写明:灵感来自 EleutherAI 的 harness 和斯坦福 HELM(README「Acknowledgements」)。
它能做什么
| 能力 | 具体支持 |
|---|---|
| 任务来源 | 100+ 个内置任务文件(src/lighteval/tasks/tasks/)+ 多语言任务 + 社区任务 + 用户自定义任务文件 |
| 提问方式 | 生成式(greedy_until)、选项打分式(loglikelihood)、整段困惑度(loglikelihood_rolling),见 src/lighteval/tasks/requests.py:35(SamplingMethod) |
| 本地后端 | vLLM(同步/异步)、transformers(含 adapter/delta/VLM)、nanotron、SGLang(src/lighteval/models/model_loader.py:51,load_model) |
| 远程后端 | TGI、HF Inference Endpoints、LiteLLM、HF Inference Providers(src/lighteval/models/endpoints/) |
| 指标 | exact match、F1、loglikelihood 准确率、pass@k、maj@n、BLEU/ROUGE/BERTScore、LLM-as-judge 等(src/lighteval/metrics/metrics.py:146,Metrics 枚举) |
| 结果 | 本地 JSON + 逐样本 details parquet、推 HF Hub(dataset)、TensorBoard、wandb/trackio(src/lighteval/logging/evaluation_tracker.py:95,EvaluationTracker) |
| 训练集成 | nanotron checkpoint 直评(src/lighteval/main_nanotron.py:42)、训后把结果推进训练 org 的 Hub 仓库 |
用起来什么样
最小形态是一条命令行——评一个 vLLM 模型在 gsm8k 上的表现:
# 命令形态摘自 README Quickstart,参数写法见 src/lighteval/main_vllm.py:52
lighteval vllm "model_name=HuggingFaceH4/zephyr-7b-beta" "gsm8k|0"
任务字符串 "gsm8k|0" 是 lighteval 的小语言:任务名|few_shot 数,解析逻辑在 src/lighteval/tasks/registry.py:184(_update_task_configs)。
Python API 可以评已在内存里的模型(README 的例子,签名见 src/lighteval/models/transformers/transformers_model.py:254,TransformersModel.from_model):
# 摘自 README「Quickstart」,已精简
model = AutoModelForCausalLM.from_pretrained(MODEL_NAME, device_map="auto")
model = TransformersModel.from_model(model, TransformersModelConfig(model_name=MODEL_NAME, batch_size=1))
pipeline = Pipeline(
model=model,
pipeline_parameters=PipelineParameters(launcher_type=ParallelismManager.NONE, max_samples=2),
evaluation_tracker=EvaluationTracker(output_dir="./results"),
tasks="gsm8k",
)
pipeline.evaluate() # 出题 → 跑模型 → 算分
pipeline.show_results()
一句话直觉
把 lighteval 想成一个「标准化考场」。 任务定义是考卷(题面 + 标准答案 + 评分标准),Doc 是发到每个考生手里的统一答题卡,后端是不同的「考生应答方式」(口头作答 = 生成,给选项涂卡 = loglikelihood),Pipeline 是监考流程:发卷、收卷、按评分标准打分、最后把全班成绩汇总成带误差线的成绩单。