mcpField
E
evaluating-llms-harness

evaluating-llms-harness

github.com/kalarislabs测试与质量7746 次安装4 天前更新
代码仓库

关于 evaluating-llms-harness

evaluating-llms-harness 技能介绍如何用 lm-evaluation-harness 按标准化提示词和指标评测 LLM,面向研究者及模型开发者。内容包括基准测试、训练进度跟踪和模型比较。

主要功能

  1. 01覆盖 60 多项学术基准
  2. 02标准化提示词与指标
  3. 03HuggingFace 和 vLLM 后端
  4. 04自定义评测任务
  5. 05多模型结果比较

适用场景

  1. 01比较模型在标准任务上的表现
  2. 02跟踪训练检查点的评测进度
  3. 03复现并报告基准评测结果

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/kalarislabs/research-agent-skills --skill evaluating-llms-harness

安装后在 Claude Code 中输入/evaluating-llms-harness确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
api-evaluation.md
benchmark-guide.md
common-issues.md
custom-tasks.md
distributed-eval.md
hardware-requirements.md

详细介绍

lm-evaluation-harness - 大模型基准测试

快速入门

lm-evaluation-harness 使用标准化提示词和指标,评估大模型在 60 多项学术基准测试中的表现。

安装:

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)上评估模型。

复制此检查清单:

Benchmark Evaluation:
- [ ] Step 1: Choose benchmark suite
- [ ] Step 2: Configure model
- [ ] Step 3: Run evaluation
- [ ] Step 4: Analyze results

步骤 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  # Auto-detect optimal 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:运行评估

# Full MMLU evaluation (57 subjects)
lm_eval --model hf \
  --model_args pretrained=meta-llama/Llama-2-7b-hf \
  --tasks mmlu \
  --num_fewshot 5 \  # 5-shot evaluation (standard)
  --batch_size 8 \
  --output_path results/ \
  --log_samples  # Save individual predictions

# Multiple benchmarks at once
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:跟踪训练进度

在训练期间评估检查点。

Training Progress Tracking:
- [ ] Step 1: Set up periodic evaluation
- [ ] Step 2: Choose quick benchmarks
- [ ] Step 3: Automate evaluation
- [ ] Step 4: Plot learning curves

步骤 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 for speed
  --batch_size 16 \
  --output_path results/step-$STEP.json

步骤 2:选择快速基准测试

适合频繁评估的快速基准测试:

  • HellaSwag:在 1 块 GPU 上约需 10 分钟
  • GSM8K:约需 5 分钟
  • PIQA:约需 2 分钟

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

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

步骤 3:自动化评估

集成到训练脚本中:

# In training loop
if step % eval_interval == 0:
    model.save_pretrained(f"checkpoints/step-{step}")

    # Run evaluation
    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}"

        # Save checkpoint
        trainer.save_checkpoint(checkpoint_path)

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

步骤 4:绘制学习曲线

import json
import matplotlib.pyplot as plt

# Load all results
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"])

# Plot
plt.plot(steps, mmlu_scores)
plt.xlabel("Training Step")
plt.ylabel("MMLU Accuracy")
plt.title("Training Progress")
plt.savefig("training_curve.png")
工作流 3:比较多个模型

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

Model Comparison:
- [ ] Step 1: Define model list
- [ ] Step 2: Run evaluations
- [ ] Step 3: Generate comparison table

步骤 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"

    # Extract model name for output file
    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:
            # Get primary metric for each task
            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 Evaluation:
- [ ] Step 1: Install vLLM
- [ ] Step 2: Configure vLLM backend
- [ ] Step 3: Run evaluation

步骤 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 倍:

# Standard HF: ~2 hours for MMLU on 7B model
lm_eval --model hf \
  --model_args pretrained=meta-llama/Llama-2-7b-hf \
  --tasks mmlu \
  --batch_size 8

# vLLM: ~15-20 minutes for MMLU on 7B model
lm_eval --model vllm \
  --model_args pretrained=meta-llama/Llama-2-7b-hf,tensor_parallel_size=2 \
  --tasks mmlu \
  --batch_size auto

何时使用及其替代方案

适用于以下情况:

  • 为学术论文对模型进行基准测试
  • 比较模型在标准任务上的质量
  • 跟踪训练进度
  • 报告标准化指标(所有人使用相同的提示词)
  • 需要可复现的评估

也可使用以下替代方案:

  • HELM(Stanford):更广泛的评估(公平性、效率、校准)
  • AlpacaEval:使用大模型评审进行指令遵循评估
  • MT-Bench:对话式多轮评估
  • 自定义脚本:特定领域的评估

常见问题

详情、代码示例和参数表:references/common-issues.md。适用此步骤时请阅读。

高级主题

基准测试说明:所有 60 多项任务的详细说明、衡量内容和结果解读,请参阅 references/benchmark-guide.md。

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

API 评估:评估 OpenAI、Anthropic 及其他 API 模型,请参阅 references/api-evaluation.md。

多 GPU 策略:数据并行和张量并行评估,请参阅 references/distributed-eval.md。

硬件要求

详情、代码示例和参数表:references/hardware-requirements.md。适用此步骤时请阅读。

资源

Agent 操作流程

  1. 检查环境。 确认模型、检查点、基准测试版本和评测框架版本。
  2. 明确输入。 根据数据或用户提供的信息,确认格式、标识符和参数。任何会影响结果的值都应询问确认,不要猜测。
  3. 先运行小规模测试。 在小型子集上进行评测,以验证提示词、解析和评分。
  4. 使用以上说明和参考资料执行完整任务。
  5. 验证结果。 使用基准测试的官方划分和指标;检查数据污染情况;报告不同随机种子或提示词下的差异。
  6. 报告结果。 说明运行内容(版本、命令、参数)、检查内容以及仍不确定的事项。
如果出现这种情况请这样做
分数与已发布的数值不同在下结论前,检查提示词格式、少样本设置和评测框架版本。
这些说明中的函数、标志或端点在已安装版本中不存在查看已安装版本自己的文档(help()、--help、官方文档),进行调整并告知用户。切勿编造 API。
必需的输入、标识符或参数不明确询问用户,或在运行前明确说明所采用的假设。

诚信规则

  • 切勿捏造结果、参数、标识符、引文或统计数据。如果无法运行或验证某项内容,请如实说明。
  • 完整报告评测设置;切勿挑选提示词、随机种子或子集。
  • 将此处与版本相关的细节视为可能已过时:请对照已安装版本的官方文档进行确认。
  • 对于会产生费用、占用共享 GPU 或云配额、涉及个人或患者数据,或无法撤销的操作,请先征得同意。

相关技能

  • evaluating-code-models:使用 pass@k 指标,在 HumanEval、MBPP、MultiPL-E 和 15 项以上基准测试中评估代码生成模型。
  • nemo-evaluator-sdk:通过多后端执行,使用 18 种以上评测框架评估大模型在 100 多项基准测试(MMLU、HumanEval、GSM8K、安全性、VLM)上的表现。
  • hqq-quantization:无需校准数据的 LLM 半二次量化。

评论

支持 Markdown