Evaluating Llms Harness
目次
lm-eval-harness で LLM を評価します(MMLU、GSM8K など)。
skill の情報
| 提供元 | 追加 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 全文
lm-evaluation-harness - LLM Benchmarking
何が入っているか
60 種類以上の学術ベンチマーク(MMLU、HumanEval、GSM8K、TruthfulQA、HellaSwag)で LLM を評価します。モデルの品質をはかるとき、モデル同士を比べるとき、論文向けの数値を出すとき、学習の進み具合を追うときに使ってください。EleutherAI や HuggingFace、主要な研究所が使っている業界標準です。HuggingFace、vLLM、API のいずれにも対応します。
すぐ始める
lm-evaluation-harness は、共通のプロンプトと指標を使って、60 種類以上の学術ベンチマークで LLM を評価します。
導入:
pip install lm-evalHuggingFace のモデルを評価する:
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よくある進め方
Workflow 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(Massive Multitask Language Understanding)- 57 分野、選択式
- GSM8K - 小学校レベルの文章題
- HellaSwag - 常識的な推論
- TruthfulQA - 正直さと事実性
- ARC(AI2 Reasoning Challenge)- 理科の問題
コードのベンチマーク:
- HumanEval - Python のコード生成(164 問)
- MBPP(Mostly Basic Python Problems)- 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 ビット / 8 ビット):
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), standard 5-shot evaluation
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 # 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
}
}Workflow 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 ごとに評価します。
#!/usr/bin/env bash
# eval_checkpoint.sh
CHECKPOINT_DIR=$1
STEP=$2
# 0-shot for speed
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 1 枚でおよそ 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: 学習曲線を描く
# 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")Workflow 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: 評価を実行する
#!/usr/bin/env 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: 比較表を作る
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 |Workflow 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ほかの選択肢との使い分け
lm-evaluation-harness を使う場面:
- 論文のためにモデルを評価するとき
- 標準的なタスクでモデルの品質を比べるとき
- 学習の進み具合を追うとき
- 誰もが同じプロンプトを使う、標準化された数値を出したいとき
- 何度でも同じ結果を再現できる評価が必要なとき
ほかを使ったほうがよい場面:
- HELM(スタンフォード大学): より幅広い評価(公平性、効率、較正)
- AlpacaEval: LLM を審査役にした、指示への従い方の評価
- MT-Bench: 複数ターンの会話の評価
- 自作のスクリプト: 特定の分野に絞った評価
よくある問題
問題: 評価が遅すぎる
vLLM を使ってください。
lm_eval --model vllm \
--model_args pretrained=model-name,tensor_parallel_size=2例示の数を減らす方法もあります。
--num_fewshot 0 # Instead of 5MMLU の一部だけを評価することもできます。
--tasks mmlu_stem # Only STEM subjects問題: メモリが足りない
バッチサイズを下げてください。
--batch_size 1 # Or --batch_size auto量子化を使ってください。
--model_args pretrained=model-name,load_in_8bit=TrueCPU への退避を有効にしてください。
--model_args pretrained=model-name,device_map=auto,offload_folder=offload問題: 公表されている数値と違う
例示の数を確かめてください。
--num_fewshot 5 # Most papers use 5-shotタスク名が正確か確かめてください。
--tasks mmlu # Not mmlu_direct or mmlu_fewshotモデルとトークナイザーが対応しているか確かめてください。
--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 # Required to run tasks that execute generated 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 ビット)
- 13B のモデル: 28GB(bf16)または 14GB(8 ビット)
- 70B のモデル: GPU を複数使うか、量子化が必要です
- 所要時間(7B のモデル、A100 1 枚):
- 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
- タスク一覧: MMLU、GSM8K、HumanEval、TruthfulQA、HellaSwag、ARC、WinoGrande など 60 種類以上
- リーダーボード: https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard (この harness を使っています)