evaluating-llms-harness について
lm-evaluation-harnessを使い、標準的な学術タスクでLLMを評価・比較するスキルです。チェックポイントの追跡や再現可能な指標の報告にも対応します。
主な機能
- 0160以上の標準ベンチマークタスク
- 02HuggingFaceとvLLMでの評価
- 03チェックポイント進捗の追跡
- 04モデル比較と結果分析
活用シーン
- 01MMLUやGSM8Kでモデルを比較
- 02学習チェックポイントごとのスコア追跡
- 03標準化された評価結果の作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ orchestra-research/ ai-research-skills --skill evaluating-llms-harnessインストール後、Claude Code で/evaluating-llms-harnessを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/api-evaluation.mdbenchmark-guide.mdcustom-tasks.mddistributed-eval.md詳細
lm-evaluation-harness - LLM ベンチマーク
クイックスタート
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 --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(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)
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
使い分けと代替手段
lm-evaluation-harness を使うべき場合:
- 学術論文向けにモデルをベンチマークする場合
- 標準タスク全体でモデルの品質を比較する場合
- 学習の進捗を追跡する場合
- 標準化された指標を報告する場合(全員が同じプロンプトを使用)
- 再現可能な評価が必要な場合
代わりに別の手段を使うべき場合:
- HELM(Stanford): 公平性、効率性、キャリブレーションなど、より広範な評価
- AlpacaEval: LLM を審査員とする指示追従性の評価
- MT-Bench: 会話形式の複数ターンの評価
- カスタムスクリプト: ドメイン固有の評価
よくある問題
問題: 評価が遅すぎる
vLLM バックエンドを使用します:
lm_eval --model vllm \
--model_args pretrained=model-name,tensor_parallel_size=2
または few-shot の例数を減らします:
--num_fewshot 0 # Instead of 5
または MMLU のサブセットを評価します:
--tasks mmlu_stem # Only STEM subjects
問題: メモリ不足(Out of memory)
バッチサイズを小さくします:
--batch_size 1 # Or --batch_size auto
量子化を使用します:
--model_args pretrained=model-name,load_in_8bit=True
CPU オフロードを有効にします:
--model_args pretrained=model-name,device_map=auto,offload_folder=offload
問題: 報告された結果と異なる
few-shot の数を確認します:
--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 のコードが実行されない
実行に必要な依存関係をインストールします:
pip install human-eval
コード実行を有効にします:
lm_eval --model hf \
--model_args pretrained=model-name \
--tasks humaneval \
--allow_code_execution # Required for HumanEval
高度なトピック
ベンチマークの説明: 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):
- 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(本ハーネスを使用)