LM Eval Harness 是 EleutherAI 开源的 LLM 评估框架,用于对语言模型执行标准化、可复现的基准评测。它把「模型能力如何衡量」从各自为政的临时脚本收敛为同一套任务体系:内置 ARC、HellaSwag、MMLU、GSM8K 等 60+ 主流基准,统一处理 few-shot 拼接、答案抽取、指标计算与结果落盘。在预训练、微调、量化后回归、开源模型选型等场景中,它是行业事实标准之一,也是 PapersWithCode 等榜单复现流程的常用底座。 其核心价值在于三点:一是任务配置化,0.4.x 起用 YAML 声明任务,无需改动代码即可跑通新基准;二是模型后端多样化,同一套评测逻辑可对接 HuggingFace Transformers、vLLM、TGI、OpenAI 兼容接口与 llama.cpp;三是结果可审计,每次运行都会保存完整模型参数与请求级样本日志,支持事后核查而非只看一个总分。本文按「速览卡 → 安装 → 上手 → 能力详解 → 生产部署 → 选型对比 → 版本脉络 → 应用场景 → 误区 → 面试题 → 资源」结构展开,读者可依序操作,约 10 分钟即可跑通第一个基准。

岗位关联

掌握 LM Eval Harness,是 LLM 工程师建立客观模型评价体系的基础能力;同一套标准化评测能支撑模型选型、微调回归与发布前质量门禁,是 AI 团队不可或缺的工程环节。

目录
  1. 为什么需要 LM Eval Harness:评估黑箱 → 可复现的标准化评测
  2. 安装与环境配置:2 步就绪
  3. 快速上手:5 分钟跑通第一个基准评测
  4. 核心能力详解:4 大支柱
  5. 生产部署与监控:从上线到运维
  6. 版本迭代
  7. AI 应用场景
  8. 常见误区
  9. 面试题
工具类型
LLM 评估框架(开源)
开发商
EleutherAI(开源 AI 研究组织)
开源协议
MIT(可商用)
GitHub Stars
无
主要语言
Python
当前版本
0.4.5(0.4.x 系列)
安装方式
pip install lm-eval
上手难度
★★★☆☆(中等)
适合人群
NLP/LLM 工程师、模型评测与发布团队
同类工具
OpenCompass·HELM·DeepEval
托管服务
无

速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。

为什么需要 LM Eval Harness:评估黑箱 → 可复现的标准化评测

在评测框架出现之前,团队评估一个模型通常靠临时脚本:自己写 prompt 模板、自己接模型输出、自己算准确率。这种做法的代价是巨大的——不同人写的评测逻辑口径不一,同一个模型在不同脚本下分数可以相差好几个点;few-shot 示例取几条、答案匹配是精确匹配还是包含匹配、生成长度设多少,都会显著影响结果。更严重的是,这些脚本往往没有保存完整的请求与参数,评测完就散落在各处,无法回溯,导致「分数对不上」成为团队内耗的常见来源。

LM Eval Harness 把这条链路标准化了。它用同一套代码加载模型、组合 prompt、执行推理、计算指标,任务定义、few-shot 配置、后处理逻辑全部固化在仓库中。你只需指定模型和任务名,就能得到与社区公开结果可对照的分数;每次运行还会自动写出 JSON artifact,记录模型参数、任务配置与逐条样本输出,让任何一次评测都可复现、可审计。

与 OpenCompass、HELM 等相比,它的气质是「轻而标准」:不追求大而全的平台化功能,而是把「跑一个可信的基准分」这件事做到极简。对中小团队和模型单体评测,这是性价比最高的切入点。

安装与环境配置:2 步就绪

步骤一:安装。 推荐在 Python 3.9+ 的独立虚拟环境中安装。基础版只需 lm-eval 一个包;若要使用 vLLM 后端加速评测,需安装带 vllm 扩展的版本,并与你本地 CUDA 版本匹配。

步骤二:验证。 安装后执行 lm_eval --help,能正常打印参数说明即就绪。若需从 GitHub 安装最新开发版,可先克隆仓库再执行可编辑安装。

补充说明:包名是 lm-eval(PyPI),导入与命令名是 lm_eval(下划线),两者不要混淆。0.4.x 与 0.3.x 的命令行不兼容,安装后请以本项目官方文档为准,勿照搬旧教程。

bash11 行
# 创建并激活虚拟环境(示例用 conda)conda create -n lm-eval python=3.10 -y && conda activate lm-eval # 基础安装pip install lm-eval # 带 vLLM 后端(可选,按需安装)pip install lm-eval[vllm] # 验证安装lm_eval --help

快速上手:5 分钟跑通第一个基准评测

思路。 最小可用流程只需要三个要素:一个模型(本例用 gpt2)、一个任务(arc_easy)、一条命令。为了快速验证链路,用 --limit 20 只取前 20 个样本,不必跑全量。

操作步骤:

1. 打开终端,进入已安装 lm-eval 的虚拟环境。

2. 运行下方命令,将模型替换为你可访问的任意 HF 模型名。

3. 等待运行结束,Readout 区将打印任务名、样本数与各项指标(acc、acc_norm 及各指标的 stderr)。

4. 追加 --output_path results/ 可把完整 JSON 结果落盘,供后续对比。

结果说明。 输出末尾会给出类似 arc_easy | 20 | 0.3500 | 0.4286 的表格行,含义依次是任务名、样本数、acc、acc_norm;每个指标后带 stderr(标准差)。进阶技巧:小规模冒烟没问题后,去掉 --limit 跑全量;换用更强模型时建议加 --batch_size auto,让框架自动挑选安全且高效的 batch,避免 OOM。

bash6 行
# 有 GPU 时加上 --device cuda:0;CPU 可省略lm_eval --model hf \    --model_args pretrained=gpt2 \    --tasks arc_easy \    --device cuda:0 \    --limit 20

核心能力详解:4 大支柱

支柱一·标准化任务库(60+ 基准)。 项目内置了 MMLU、ARC、HellaSwag、TruthfulQA、WinoGrande、GSM8K、HumanEval 等主流基准的任务定义,每个任务在 YAML 中声明数据集路径、prompt 模板、doc_to_text(把原始样本拼成输入文本的规则)、doc_to_target(标准答案提取规则)与指标。任务自带合理的 few-shot 默认值,符合对应 benchmark 的社区惯例。这意味着你不需要关心「这个任务要用什么 prompt」,开箱即用。

支柱二·多模型后端。 0.4.x 支持 hf(HuggingFace Transformers)、vllm(高吞吐推理)、tgi(HuggingFace TGI 服务)、local-completions(OpenAI 兼容接口的本地服务)、gguf(llama.cpp 量化模型)等后端的适配器。同一份命令只需改 --model 与 --model_args,即可评测不同部署形态的同一个模型,非常适合「先量化、后回归」的流程。其中 vLLM 后端是 0.4.0 引入的核心加速能力,适合长任务、大批量评测。

支柱三·可扩展 Task API。 当项目内置任务无法覆盖你的场景时,可以写一个 YAML 文件注册自定义任务。例如从 JSON 数据集构造「问题→答案」评测,只需声明 dataset_path、doc_to_text 与指标字段,再通过 --include_path 指向该目录即可。相比 0.3.x 时代需要继承 Python Task 类写代码,YAML 方式让非深度开发者也能贡献任务,这也让社区任务库得以快速增长。

支柱四·可复现与可观测。 每次运行默认在 --output_path 目录下生成 JSON artifact,包含完整请求数据(input、arguments、resps)、metric 汇总、模型配置与运行配置。配合 --log_samples 可保留每条样本的实际输出,方便排查 badcase;配合 --wandb_args 可把指标同步到 Weights & Biases,在训练过程中持续监控指标曲线。这一支柱是「评测结果能作为发布依据」的关键保障。

生产部署与监控:从上线到运维

CI 回归测试。 在 GitHub Actions 或自建 CI 中对模型仓配置「评测门禁」:merge 前跑 --limit 200 的冒烟集(如 arc_easy、hellaswag),发版前再跑全量重要基准(如 mmlu + gsm8k 的 few-shot 复现)。将 JSON artifact 上传为 CI artifact,并设置指标阈值,如 GSM8K 分数下降超过 2 分则阻断合并。这是让评测从「临时动作」变成「持续动作」的最低成本方案。

大规模评测调度。 多卡环境可以用 vLLM 后端配合 tensor_parallel_size 参数做张量并行,把大模型分布到多张 GPU;也可以先在 TGI 中部署模型服务,再用 --model tgi 指向服务地址,评测端与推理端解耦,便于在 Slurm 集群上统一调度。CPU 推理建议只用于极小型模型或链路冒烟,生产级全量评测务必用 GPU 后端。

可观测性。 三种手段配合使用:--output_path 保证每次运行有完整落盘记录;--wandb_args 提供指标趋势图,用于训练过程中实时对比 checkpoint;--log_samples 保留样本级输出,作为 badcase 分析与标注迭代的依据。注意不同后端(hf 与 vllm)在部分任务上因 logprob 处理细节可能存在零点几分的差异,记录后端类型后再做跨实验比较。

<p class="para-label">避坑清单:</p>

<ul class="dash-list"><li>0.3.x 教程大规模失效:0.4.0 是破坏性重写,旧版 python -m lm_eval 命令与 Python API 均不兼容,网上大量教程已过期,务必以官方文档和 lm_eval --help 为准。</li><li>复现分数不等于「跑通就有分」:论文分数往往绑定特定 few-shot 数与 prompt 模板,直接跑默认配置得到的结果不能与论文对照;复现前先核对任务在官方仓库中的默认配置,再显式传 --num_fewshot。</li><li>vLLM 后端与 hf 后端数值不是严格相等:不同后端对 logprob 与生成的细节处理略有差异,跨后端比较时要在 artifact 中记录 model 后端字段,避免把实现差异误判为模型退化。</li><li>显存不足时优先加 --limit 做冒烟,全量评测统一用 --batch_size auto 或 vLLM 后端,不要在 0.4.x 上使用旧文档推荐的 --batch_size 1 硬跑大模型。</li></ul>

维度LM Eval HarnessOpenCompassHELMDeepEval
定位轻量标准的 LLM 离线评估套件全流程多模态评测平台(中文生态)学术对照式标准化评估框架LLM 应用单测式评估库(RAG/Agent)
任务覆盖面60+ 主流英文基准100+ 基准,含中文与多模态50+ 学术基准,重复现性偏自定义指标与场景断言
模型后端HF / vLLM / TGI / local-completions / GGUFHF / vLLM / 多源 API自研容器为主,模型支持有限模型由调用方自管,兼容 vLLM/OpenAI
多语言支持以英文为主,任务驱动中文与多语言友好多语言基准语言无关(面向应用行为)
可扩展性YAML 任务声明,低门槛配置化 + 需更多二次开发扩展需较多代码Python 原生 API,易嵌入测试框架
生产部署CLI + JSON artifact + wandb,易接 CI分布式评测工具链,重平台化学术实验环境为主pip 库,嵌入 pytest 等测试栈友好
LicenseMITApache 2.0Apache 2.0Apache 2.0
适合谁模型研发与部署前标准化评测中文模型团队与多模态团队学术研究与榜单对照应用端 RAG/Agent 迭代质量

选型建议:模型基座团队首选 LM Eval Harness,轻量、标准、易接入 CI 门禁;中文与多模态场景补充 OpenCompass 以覆盖更广的国内基准;学术榜单对照可参考 HELM 的结果口径;应用端 RAG/Agent 的行为质量则用 DeepEval 做单测式断言——两者互补而非互斥。

版本迭代

LM Eval Harness 由 EleutherAI 维护。2024 年 4 月 0.4.0 完成一次破坏性重写:任务从 Python 子类改为 YAML 声明、新增 vLLM/TGI 等高吞吐后端、CLI 与日志体系重建;此后 0.4.x 以任务库扩充与稳定性修复为主。截至训练数据(2025 年初)最新正式版为 0.4.5,可能已有更新版本,请以 GitHub Releases 为准。

版本时间变化提升
v0.3.02023-05Python API 与 CLI 稳定化稳定了 `simple_evaluate` 等 Python 接口,支持多数 HF 模型与数十个任务
v0.4.02024-04全面重写引入 `lm_eval` 命令、YAML 任务定义、vLLM/TGI 后端、异步执行与 wandb 集成;破坏性变更,旧 API 不再兼容
v0.4.22024-06新增 local-completions 后端可评估 OpenAI 兼容接口的本地推理服务;修复若干任务的评分细节
v0.4.42024-08任务库扩充与稳定性新增更多摘要/翻译类任务,改进 vLLM 后端稳定性与错误提示
v0.4.52025-01维护版修复 0.4.4 的回归问题与依赖兼容,完善文档中的任务列表
基准v0.3.0v0.4.0v0.4.5
任务定义方式Python Task 类YAML 声明 + 类YAML 声明 + 类0.4 起新任务贡献门槛从「写代码」降为「写配置」
推荐推理后端HF TransformersHF / vLLM / TGIHF / vLLM / TGI / local-completions / GGUF后端数量是版本功能覆盖的直接体现
结论

harness 是评测工具而非被测模型,官方没有「工具自身的模型分数」,因此不做分数式对比;版本差异体现在执行速度、任务与后端覆盖上。0.4.0 起 vLLM 后端显著降低大规模评测耗时,YAML 化让社区任务贡献量快速增长。选型建议:直接进入 0.4.x 生态,不要再参照 0.3.x 教程;若需复现历史论文分数,务必锁定与论文一致的版本与任务参数。

AI 应用场景

模型发布前的基准回归测试

阶段:模型评估与发布门禁

解决的问题:微调或预训练新 checkpoint 后,人工抽测几十个 prompt 既不能覆盖能力面,也无法与历史版本做口径一致的对比。每次手工写评测脚本,结果不可复现,发布依据站不住脚。

具体案例:某团队在每次 merge 前用固定脚本跑 arc_easy + hellaswag + gsm8k 的 200 样本冒烟集(约 10 分钟),每周跑一次全量 MMLU;分数变化直接关联到 commit,发现 GSM8K 下降立即定位到数据配比改动。相比原先人工验收一天的周期,回归时间压缩到小时级,并在发布记录中留存全部 JSON artifact。

开源与自研模型的横向选型

阶段:模型选型评估

解决的问题:选择接入哪个开源模型时,各家 README 的分数来自不同评测口径,直接横向比较没有意义。需要同一套命令、同一批任务、同一硬件下的对齐评测。

具体案例:某应用团队用 vLLM 后端在单台 A100 上跑 8 个关键任务(MMLU、GSM8K、TruthfulQA、HumanEval 等),对 3 个候选模型依次执行同一命令,一次调度产出对比表,淘汰了「README 分数高但业务相关任务明显弱」的模型。整个过程半天完成,而此前各自跑脚本需要约一周。

量化与微调后的能力下降监测

阶段:模型压缩回归验证

解决的问题:模型量化(如 INT4)或蒸馏后,能力下降是正常的,但下降多少可接受需要量化依据。若无基线分数,压缩决策就只能靠「体感」。

具体案例:团队对 7B 模型做 INT4 量化,用 gguf 后端在 GSM8K 与 MMLU 上对比量化前后分数,设定「任一任务下降超过 2 分则回滚」的门禁。多次实验显示量化后 GSM8K 下降在 2 分以内,放行线上部署;后续换用更低精度时分数跌破阈值,及时拦截了一次上线事故。

常见误区

误区我照着 2023 年的教程运行 `python -m lm_eval --model gpt2 ...`,结果直接报错,是不是我安装有问题?

正解0.4.0 起命令行入口从 python -m lm_eval 改为 lm_eval 命令。0.4.x 是破坏性重写,0.3.x 时代的 Python API(如 simple_evaluate)和 CLI 姿势均已不兼容。安装后先运行 lm_eval --help 确认入口可用,教程以官方 ReadTheDocs 为准,不要混用两个大版本的资料。

为何常见:搜索引擎里 0.3.x 时期的高质量教程数量多、排名靠前,而 0.4.0 重写后文档迁移不够显眼,新手极易被旧教程带偏。

误区直接用 `--tasks mmlu` 跑出来的分数比论文低 3 分,说明模型本身比论文差。

正解分数差异往往来自评测配置而非模型本体:论文常用 MMLU 5-shot,而你没传 --num_fewshot 或任务默认值与你预期不同;max_length、答案匹配的解析规则、样本子集也会影响结果。先核对任务在官方仓库中的默认配置与论文配置是否一致,再下结论。

为何常见:把「跑完命令出分数」误认为「科学评测」,没有意识到 few-shot 与 prompt 模板是评测协议的一部分,而非可选项。

误区hf 后端和 vllm 后端跑同一个模型同一个任务,分数不一致,肯定是 vLLM 适配器有 bug。

正解不同后端对 logprob 获取、生成参数与并发处理的实现细节不同,零点几分以内的差异在社区中是已知且可接受的。正确做法是在 artifact 中记录后端类型,对比时保证同后端、同参数;若差异超过 1 分,再考虑提交 issue 排查。

为何常见:用户默认「同一模型同一任务分数必然相同」,忽略了评估链路中推理实现的细微差异,也忽略了跨后端的日志记录。

误区GSM8K 和 MMLU 都接近 SOTA,部署到我们的客服问答场景应该没问题。

正解harness 的基准是「标准化信号」,用于横向对比模型通用能力,不等于特定业务效果。业务场景的 prompt 分布、数据分布与基准差异可能很大;上线前仍需用业务自建评测集或引入 DeepEval 等应用级评估做补充验证。

为何常见:基准分数是团队最容易获取的公开信号,容易产生「高分为王」的简化认知,忽略了评测域与业务域之间的迁移鸿沟。

面试题

Q1. 安装 LM Eval Harness 的正确 pip 命令是?

单选题 · easy

  • A.pip install lm-eval← 正确答案
  • B.pip install evaluate
  • C.pip install eval
  • D.pip install harness

答案:A。PyPI 上的正式包名是 lm-eval,安装后提供 lm_eval 命令与同名导入模块。evaluate 是 HuggingFace 的另一个评估库;eval 与 harness 均非本项目包名。安装后可用 lm_eval --help 验证。

Q2. LM Eval Harness 0.4.x 运行基准评测的标准入口是?

单选题 · easy

  • A.lm_eval 命令行← 正确答案
  • B.transformers CLI
  • C.官方未提供 CLI
  • D.仅 Python API

答案:A。0.4.0 重写后统一的评测入口是 lm_eval 命令,通过 --model、--tasks 等参数声明模型与任务。transformers CLI 与本项目无关;0.4.x 同时提供 Python API,但 CLI 是文档推荐的常规姿势。

Q3. --model 参数的作用是指定?

单选题 · easy

  • A.模型后端类型← 正确答案
  • B.模型权重路径
  • C.Batch 大小
  • D.任务名称

答案:A。--model 指定后端类型,如 hf、vllm、tgi、local-completions、gguf;具体模型名与加载参数放在 --model_args 中(如 pretrained=Qwen/Qwen2-7B)。权重路径与 batch 大小分别对应 --model_args 与 --batch_size。

Q4. 0.4.x 中定义一个新评测任务的主要方式是?

单选题 · mid

  • A.YAML 配置文件← 正确答案
  • B.JSON Schema
  • C.仅内置任务
  • D.数据库表配置

答案:A。0.4.x 引入 YAML 任务声明,声明数据集路径、doc_to_text、doc_to_target 与 metric 即可注册新任务,无需写 Python 类。这降低了社区贡献任务的门槛。内置任务库之外完全支持扩展,并非「仅内置」。

Q5. 下列哪个不是 LM Eval Harness 支持的模型后端?

单选题 · mid

  • A.vLLM 推理后端
  • B.llama.cpp 后端
  • C.TGI 服务后端
  • D.TensorFlow 后端← 正确答案

答案:D。官方适配器包括 hf(Transformers)、vllm、tgi、local-completions(OpenAI 兼容)、gguf(llama.cpp)等。TensorFlow Serving 不在官方后端列表中。注意 Answer 中 D 是「不支持项」的对应选项。

Q6. 想在本地快速验证评测链路是否打通,最合适的做法是?

单选题 · mid

  • A.添加 --limit 参数← 正确答案
  • B.调整 --device 参数
  • C.修改 --batch_size 参数
  • D.删除 --output_path 参数

答案:A。--limit 20 只取前 20 个样本,几秒到几分钟即可跑完冒烟测试,是验证链路的标准手段。调整 device/batch_size 不会减少任务总量;删除 output_path 反而丢失落盘记录,不利于排查。

Q7. 复现 MMLU 论文分数时,社区常用的 few-shot 配置是?

单选题 · hard

  • A.0-shot
  • B.5-shot← 正确答案
  • C.10-shot
  • D.25-shot

答案:B。MMLU 在 PapersWithCode 与多数论文中采用 5-shot 作为标准配置。直接运行任务或使用其他 shot 数得到的结果不能与论文分数直接对比。复现前应核对任务默认配置并显式传 --num_fewshot 5。

Q8. 关于 0.4.0 重写,下列说法正确的是?

多选题 · hard

  • A.引入 YAML 任务定义← 正确答案
  • B.新增 vLLM 后端← 正确答案
  • C.移除 few-shot 支持
  • D.仅支持单卡推理

答案:AB。0.4.0 是破坏性重写:任务改为 YAML 声明、引入 vLLM/TGI 等高性能后端、重建 CLI 与日志体系。few-shot 能力不仅保留而且配置更规范;vLLM 后端支持张量并行等多卡模式。C、D 与事实相反。

Q9. 保证一次评测结果可复现,应重点记录哪些信息?

多选题 · hard

  • A.model_args 配置← 正确答案
  • B.few-shot 配置← 正确答案
  • C.固定 batch_size
  • D.固定后端类型← 正确答案

答案:ABD。可复现的核心是模型配置(checkpoint、精度)、任务配置(few-shot、prompt 模板)与后端类型,这些直接决定输出文本与 logprob。batch_size 在确定性计算下通常不影响最终得分,不是复现的关键变量。

Q10. 关于 vLLM 后端,以下说法正确的是?

多选题 · extreme

  • A.大幅提升推理吞吐← 正确答案
  • B.与 HF 后端分数完全一致
  • C.可评估 OpenAI 兼容接口的本地服务← 正确答案
  • D.是 0.4 之前的唯一后端

答案:AC。vLLM 后端通过 PagedAttention 与连续批处理显著提升吞吐,是 0.4.x 大规模评测的推荐后端。local-completions 后端负责评估 OpenAI 兼容服务,vLLM 与它是两个不同后端。vLLM 后端与 hf 后端的 logprob 实现存在细节差异,分数并非严格一致;该后端是 0.4.0 才新增的。