{/* This page is auto-generated from the skill's SKILL.md by website/scripts/generate-skill-docs.py. Edit the source SKILL.md, not this page. */}

Evaluating Llms Harness

lm-eval-harness:对 LLM 跑基准(MMLU、GSM8K 等)。

Skill 元数据

来源可选 — 通过 hermes skills install official/mlops/evaluating-llms-harness 安装
路径optional-skills/mlops/evaluation/evaluating-llms-harness
版本1.0.1
作者Orchestra Research
许可证MIT
依赖项lm-eval, transformers, vllm
平台linux, macos
标签Evaluation, LM Evaluation Harness, Benchmarking, MMLU, HumanEval, GSM8K, EleutherAI, Model Quality, Academic Benchmarks, Industry Standard

参考:完整 SKILL.md

INFO

以下是 Hermes 在触发此 skill 时加载的完整 skill 定义。这是 skill 激活时 agent 所看到的指令内容。

lm-evaluation-harness - LLM 基准测试

内容一览

在 60+ 个学术基准上评估 LLM(MMLU、HumanEval、GSM8K、TruthfulQA、HellaSwag)。在基准测试模型质量、对比模型、报告学术结果或跟踪训练进度时使用。EleutherAI、HuggingFace 和各大实验室使用的行业标准。支持 HuggingFace、vLLM、API。

快速开始

lm-evaluation-harness 用标准化提示和指标,在 60+ 个学术基准上评估 LLM。

安装:

pip install lm-eval

评估任意 HuggingFace 模型:

lm_eval --model hf \
  --model_args pretrained=meta-llama/Llama-2-7b-hf \
  --tasks mmlu,gsm8k,hellaswag \
  --device cuda:0 \
  --batch_size 8

查看可用任务:

lm-eval ls tasks

常用工作流

工作流 1:标准基准评估

在核心基准上评估模型(MMLU、GSM8K、HumanEval)。

复制此清单:

基准评估:
- [ ] 第 1 步:选择基准套件
- [ ] 第 2 步:配置模型
- [ ] 第 3 步:运行评估
- [ ] 第 4 步:分析结果

第 1 步:选择基准套件

核心推理基准:

  • MMLU(大规模多任务语言理解)- 57 个学科,多选
  • GSM8K - 小学数学应用题
  • HellaSwag - 常识推理
  • TruthfulQA - 真实性与事实性
  • ARC(AI2 推理挑战)- 科学题

代码基准:

  • HumanEval - Python 代码生成(164 题)
  • MBPP(主要基础 Python 题)- Python 编码

标准套件(模型发布推荐):

--tasks mmlu,gsm8k,hellaswag,truthfulqa,arc_challenge

第 2 步:配置模型

HuggingFace 模型:

lm_eval --model hf \
  --model_args pretrained=meta-llama/Llama-2-7b-hf,dtype=bfloat16 \
  --tasks mmlu \
  --device cuda:0 \
  --batch_size auto  # 自动检测最优 batch size

量化模型(4-bit/8-bit):

lm_eval --model hf \
  --model_args pretrained=meta-llama/Llama-2-7b-hf,load_in_4bit=True \
  --tasks mmlu \
  --device cuda:0

自定义 checkpoint:

lm_eval --model hf \
  --model_args pretrained=/path/to/my-model,tokenizer=/path/to/tokenizer \
  --tasks mmlu \
  --device cuda:0

第 3 步:运行评估

# 完整 MMLU 评估(57 学科),标准 5-shot 评估
lm_eval --model hf \
  --model_args pretrained=meta-llama/Llama-2-7b-hf \
  --tasks mmlu \
  --num_fewshot 5 \
  --batch_size 8 \
  --output_path results/ \
  --log_samples  # 保存单个预测

# 一次跑多个基准
lm_eval --model hf \
  --model_args pretrained=meta-llama/Llama-2-7b-hf \
  --tasks mmlu,gsm8k,hellaswag,truthfulqa,arc_challenge \
  --num_fewshot 5 \
  --batch_size 8 \
  --output_path results/llama2-7b-eval.json

第 4 步:分析结果

结果保存到 results/llama2-7b-eval.json:

{
  "results": {
    "mmlu": {
      "acc": 0.459,
      "acc_stderr": 0.004
    },
    "gsm8k": {
      "exact_match": 0.142,
      "exact_match_stderr": 0.006
    },
    "hellaswag": {
      "acc_norm": 0.765,
      "acc_norm_stderr": 0.004
    }
  },
  "config": {
    "model": "hf",
    "model_args": "pretrained=meta-llama/Llama-2-7b-hf",
    "num_fewshot": 5
  }
}

工作流 2:跟踪训练进度

训练过程中评估 checkpoint。

训练进度跟踪:
- [ ] 第 1 步:设置周期性评估
- [ ] 第 2 步:选择快速基准
- [ ] 第 3 步:自动化评估
- [ ] 第 4 步:绘制学习曲线

第 1 步:设置周期性评估

每 N 个训练步评估一次:

#!/usr/bin/env bash
# eval_checkpoint.sh

CHECKPOINT_DIR=$1
STEP=$2

# 0-shot 求快
lm_eval --model hf \
  --model_args pretrained=$CHECKPOINT_DIR/checkpoint-$STEP \
  --tasks gsm8k,hellaswag \
  --num_fewshot 0 \
  --batch_size 16 \
  --output_path results/step-$STEP.json

第 2 步:选择快速基准

适合频繁评估的快基准:

  • HellaSwag:单 GPU 约 10 分钟
  • GSM8K:约 5 分钟
  • PIQA:约 2 分钟

频繁评估时避免(太慢):

  • MMLU:约 2 小时(57 学科)
  • HumanEval:需要代码执行

第 3 步:自动化评估

集成到训练脚本:

# 在训练循环中
if step % eval_interval == 0:
    model.save_pretrained(f"checkpoints/step-{step}")

    # 运行评估
    os.system(f"./eval_checkpoint.sh checkpoints step-{step}")

或用 PyTorch Lightning 回调:

from pytorch_lightning import Callback

class EvalHarnessCallback(Callback):
    def on_validation_epoch_end(self, trainer, pl_module):
        step = trainer.global_step
        checkpoint_path = f"checkpoints/step-{step}"

        # 保存 checkpoint
        trainer.save_checkpoint(checkpoint_path)

        # 运行 lm-eval
        os.system(f"lm_eval --model hf --model_args pretrained={checkpoint_path} ...")

第 4 步:绘制学习曲线

import json
import matplotlib.pyplot as plt

# 加载所有结果
steps = []
mmlu_scores = []

for file in sorted(glob.glob("results/step-*.json")):
    with open(file) as f:
        data = json.load(f)
        step = int(file.split("-")[1].split(".")[0])
        steps.append(step)
        mmlu_scores.append(data["results"]["mmlu"]["acc"])

# 绘图
plt.plot(steps, mmlu_scores)
plt.xlabel("Training Step")
plt.ylabel("MMLU Accuracy")
plt.title("Training Progress")
plt.savefig("training_curve.png")

工作流 3:对比多个模型

用于模型对比的基准套件。

模型对比:
- [ ] 第 1 步:定义模型列表
- [ ] 第 2 步:运行评估
- [ ] 第 3 步:生成对比表

第 1 步:定义模型列表

# models.txt
meta-llama/Llama-2-7b-hf
meta-llama/Llama-2-13b-hf
mistralai/Mistral-7B-v0.1
microsoft/phi-2

第 2 步:运行评估

#!/usr/bin/env bash
# eval_all_models.sh

TASKS="mmlu,gsm8k,hellaswag,truthfulqa"

while read model; do
    echo "Evaluating $model"

    # 从模型名派生输出文件名
    model_name=$(echo $model | sed 's/\//-/g')

    lm_eval --model hf \
      --model_args pretrained=$model,dtype=bfloat16 \
      --tasks $TASKS \
      --num_fewshot 5 \
      --batch_size auto \
      --output_path results/$model_name.json

done < models.txt

第 3 步:生成对比表

import json
import pandas as pd

models = [
    "meta-llama-Llama-2-7b-hf",
    "meta-llama-Llama-2-13b-hf",
    "mistralai-Mistral-7B-v0.1",
    "microsoft-phi-2"
]

tasks = ["mmlu", "gsm8k", "hellaswag", "truthfulqa"]

results = []
for model in models:
    with open(f"results/{model}.json") as f:
        data = json.load(f)
        row = {"Model": model.replace("-", "/")}
        for task in tasks:
            # 取每个任务的主指标
            metrics = data["results"][task]
            if "acc" in metrics:
                row[task.upper()] = f"{metrics['acc']:.3f}"
            elif "exact_match" in metrics:
                row[task.upper()] = f"{metrics['exact_match']:.3f}"
        results.append(row)

df = pd.DataFrame(results)
print(df.to_markdown(index=False))

输出:

| Model                  | MMLU  | GSM8K | HELLASWAG | TRUTHFULQA |
|------------------------|-------|-------|-----------|------------|
| meta-llama/Llama-2-7b  | 0.459 | 0.142 | 0.765     | 0.391      |
| meta-llama/Llama-2-13b | 0.549 | 0.287 | 0.801     | 0.430      |
| mistralai/Mistral-7B   | 0.626 | 0.395 | 0.812     | 0.428      |
| microsoft/phi-2        | 0.560 | 0.613 | 0.682     | 0.447      |

工作流 4:用 vLLM 评估(更快推理)

用 vLLM 后端获得 5-10 倍更快的评估。

vLLM 评估:
- [ ] 第 1 步:安装 vLLM
- [ ] 第 2 步:配置 vLLM 后端
- [ ] 第 3 步:运行评估

第 1 步:安装 vLLM

pip install vllm

第 2 步:配置 vLLM 后端

lm_eval --model vllm \
  --model_args pretrained=meta-llama/Llama-2-7b-hf,tensor_parallel_size=1,dtype=auto,gpu_memory_utilization=0.8 \
  --tasks mmlu \
  --batch_size auto

第 3 步:运行评估

vLLM 比标准 HuggingFace 快 5-10 倍:

# 标准 HF:7B 模型跑 MMLU 约 2 小时
lm_eval --model hf \
  --model_args pretrained=meta-llama/Llama-2-7b-hf \
  --tasks mmlu \
  --batch_size 8

# vLLM:7B 模型跑 MMLU 约 15-20 分钟
lm_eval --model vllm \
  --model_args pretrained=meta-llama/Llama-2-7b-hf,tensor_parallel_size=2 \
  --tasks mmlu \
  --batch_size auto

与替代方案的取舍

以下情况用 lm-evaluation-harness:

  • 为学术论文做模型基准
  • 跨标准任务对比模型质量
  • 跟踪训练进度
  • 报告标准化指标(大家用同一套提示)
  • 需要可复现的评估

以下情况改用其他:

  • HELM(Stanford):更广的评估(公平性、效率、校准)
  • AlpacaEval:带 LLM 裁判的指令遵循评估
  • MT-Bench:多轮对话评估
  • 自定义脚本:领域特定评估

常见问题

问题:评估太慢

用 vLLM 后端:

lm_eval --model vllm \
  --model_args pretrained=model-name,tensor_parallel_size=2

或减少 fewshot 示例:

--num_fewshot 0  # 代替 5

或评估 MMLU 子集:

--tasks mmlu_stem  # 仅 STEM 学科

问题:内存不足

减小 batch size:

--batch_size 1  # 或 --batch_size auto

用量化:

--model_args pretrained=model-name,load_in_8bit=True

启用 CPU 卸载:

--model_args pretrained=model-name,device_map=auto,offload_folder=offload

问题:结果与报告不一致

检查 fewshot 数:

--num_fewshot 5  # 大多数论文用 5-shot

检查确切任务名:

--tasks mmlu  # 不是 mmlu_direct 或 mmlu_fewshot

确认模型与 tokenizer 匹配:

--model_args pretrained=model-name,tokenizer=same-model-name

问题:HumanEval 没有执行代码

执行代码类任务(HumanEval、MBPP 等)被一个显式确认标志挡住——必须传 --confirm_run_unsafe_code 才会运行:

lm_eval --model hf \
  --model_args pretrained=model-name \
  --tasks humaneval \
  --confirm_run_unsafe_code  # 运行会执行生成代码的任务所必需

没有这个标志,lm-eval 会拒绝运行该任务,而不是悄悄跳过代码执行。

进阶话题

基准说明:全部 60+ 任务的详细说明、各测什么、如何解读见 references/benchmark-guide.md。

自定义任务:创建领域特定评估任务见 references/custom-tasks.md。

API 评估:评估 OpenAI、Anthropic 等 API 模型见 references/api-evaluation.md。

多 GPU 策略:数据并行与张量并行评估见 references/distributed-eval.md。

硬件需求

  • GPU:NVIDIA(CUDA 11.8+),可在 CPU 上跑(很慢)
  • VRAM:
    • 7B 模型:16GB(bf16)或 8GB(8-bit)
    • 13B 模型:28GB(bf16)或 14GB(8-bit)
    • 70B 模型:需多 GPU 或量化
  • 时间(7B 模型,单张 A100):
    • HellaSwag:10 分钟
    • GSM8K:5 分钟
    • MMLU(完整):2 小时
    • HumanEval:20 分钟

资源