欢迎回来

登录 EAKE AI,继续您的智能之旅

忘记密码?
还没有账号?立即注册

LLM 评测基准

LLM 评测基准

lm-eval-harness:基准测试 LLM(MMLU、GSM8K 等)

lm-evaluation-harness - LLM 基准测试

内容概览

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

快速入门

lm-evaluation-harness 使用标准化 prompt 和指标,在 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 --tasks list

常见工作流

工作流 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
    

    自定义检查点:

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

    步骤 3:运行评估

    
    # 完整 MMLU 评估(57 个科目)
    lm_eval --model hf 
      --model_args pretrained=meta-llama/Llama-2-7b-hf 
      --tasks mmlu 
      --num_fewshot 5   # 5-shot 评估(标准)
      --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: 追踪训练进度

    在训练过程中评估检查点。

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

    步骤 1:设置周期性评估

    每隔 N 个训练步评估一次:

    
    #!/bin/bash
    # eval_checkpoint.sh
    
    CHECKPOINT_DIR=$1
    STEP=$2
    
    lm_eval --model hf 
      --model_args pretrained=$CHECKPOINT_DIR/checkpoint-$STEP 
      --tasks gsm8k,hellaswag 
      --num_fewshot 0   # 0-shot 以加快速度
      --batch_size 16 
      --output_path results/step-$STEP.json
    

    步骤 2:选择快速基准

    频繁评估用快速基准:

  • HellaSwag:约 10 分钟(单 GPU)
  • 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}"
    
            # 保存检查点
            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:运行评估

    
    #!/bin/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
    

    使用场景 vs 替代方案

    使用 lm-evaluation-harness 当:

  • 为学术论文基准测试模型
  • 在标准任务上对比模型质量
  • 追踪训练进度
  • 报告标准化指标(所有人使用相同 prompt)
  • 需要可复现的评估
  • 使用替代方案:

  • 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
    

    验证模型和分词器匹配:

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

    问题:HumanEval 不执行代码

    安装执行依赖:

    
    pip install human-eval
    

    启用代码执行:

    
    lm_eval --model hf 
      --model_args pretrained=model-name 
      --tasks humaneval 
      --allow_code_execution  # HumanEval 必需
    

    高级话题

    基准测试说明:详见 references/benchmark-guide.md,包含所有 60+ 任务的详细说明、测量内容和解读。

    自定义任务:详见 references/custom-tasks.md,了解如何创建领域特定的评估任务。

    API 模型评估:详见 references/api-evaluation.md,了解如何评估 OpenAI、Anthropic 及其他 API 模型。

    多 GPU 策略:详见 references/distributed-eval.md,了解数据并行和 tensor 并行评估。

    硬件需求

  • GPU:NVIDIA(CUDA 11.8+),支持 CPU(非常慢)
  • 显存
  • 7B 模型:16GB(bf16)或 8GB(8-bit)
  • 13B 模型:28GB(bf16)或 14GB(8-bit)
  • 70B 模型:需要多 GPU 或量化
  • 时间(7B 模型,单 A100):
  • HellaSwag:10 分钟
  • GSM8K:5 分钟
  • MMLU(完整):2 小时
  • HumanEval:20 分钟
  • 资源

  • GitHub: https://github.com/EleutherAI/lm-evaluation-harness
  • 文档: https://github.com/EleutherAI/lm-evaluation-harness/tree/main/docs
  • 任务库: 60+ 任务,含 MMLU、GSM8K、HumanEval、TruthfulQA、HellaSwag、ARC、WinoGrande 等
  • 排行榜: https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard(使用此 harness)
  • 安装指南

    复制下方命令,在终端运行即可安装:

    # 安装到当前项目
    npx skills add lm-evaluation-harness
    # 全局安装 — 所有项目可用
    npx skills add lm-evaluation-harness -g

    使用指南

    安装完成后,在对话框中直接使用此技能。

    基本信息
    作者 Community 分类 coding 难度 Intermediate 时长 1 hour
    🛠️ 安装命令
    # 安装到当前项目
    npx skills add lm-evaluation-harness
    # 全局安装
    npx skills add lm-evaluation-harness -g

    发表评论