Оценка LLM (Harness)
lm-eval-harness — бенчмарки для LLM (MMLU, GSM8K и другие).
Метаданные навыка
| Источник | Опциональный — устанавливается командой 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
Ниже — полное определение навыка, которое Hermes загружает при его активации. Именно это агент видит в качестве инструкций, когда навык включён.
lm-evaluation-harness — бенчмаркинг LLM
Что внутри
Оценивает LLM по 60+ академическим бенчмаркам (MMLU, HumanEval, GSM8K, TruthfulQA, HellaSwag). Используйте при оценке качества модели, сравнении моделей, публикации академических результатов или отслеживании прогресса обучения. Отраслевой стандарт, которым пользуются EleutherAI, HuggingFace и крупные лаборатории. Поддерживает HuggingFace, vLLM, API.
Быстрый старт
lm-evaluation-harness оценивает LLM по 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 ls tasks
Типичные сценарии работы
Сценарий 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 # Автоматический подбор оптимального размера батча
Квантованная модель (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: запуск оценки
# Полная оценка 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: отслеживание прогресса обучения
Оценка чекпоинтов в процессе обучения.
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 для скорости
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: ~10 минут на 1 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: сравнение нескольких моделей
Набор бенчмарков для сравнения моделей.
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"
# Извлечение имени модели для файла результатов
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 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 в 5–10 раз быстрее стандартного HuggingFace:
# Стандартный HF: ~2 часа для MMLU на модели 7B
lm_eval --model hf \
--model_args pretrained=meta-llama/Llama-2-7b-hf \
--tasks mmlu \
--batch_size 8
# vLLM: ~15–20 минут для MMLU на модели 7B
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 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 не выполняет код
Задачи с выполнением кода (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: см. references/api-evaluation.md — оценка моделей OpenAI, Anthropic и других через API.
Стратегии для нескольких GPU: см. references/distributed-eval.md — оценка с data parallel и tensor parallel.
Требования к оборудованию
- GPU: NVIDIA (CUDA 11.8+), работает и на CPU (очень медленно)
- VRAM:
- модель 7B: 16 ГБ (bf16) или 8 ГБ (8-бит)
- модель 13B: 28 ГБ (bf16) или 14 ГБ (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
- Библиотека задач: 60+ задач, включая MMLU, GSM8K, HumanEval, TruthfulQA, HellaSwag, ARC, WinoGrande и другие
- Лидерборд: https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard (использует этот харнесс)