Оценка LLM с помощью Harness
lm-eval-harness: бенчмаркинг LLM (MMLU, GSM8K и др.).
Метаданные навыка
| Источник | Встроенный (установлен по умолчанию) |
| Путь | skills/mlops/evaluation/lm-evaluation-harness |
| Версия | 1.0.0 |
| Автор | 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
Ниже приведено полное описание навыка, которое VibeOS загружает при его активации. Это инструкции, которые видит агент, когда навык активен.
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 --tasks list
Типовые сценарии
Сценарий 1: Стандартная оценка бенчмарков
Оценка модели по основным бенчмаркам (MMLU, GSM8K, HumanEval).
Скопируйте этот чек-лист:
Оценка бенчмарков:
- [ ] Шаг 1: Выберите набор бенчмарков
- [ ] Шаг 2: Настройте модель
- [ ] Шаг 3: Запустите оценку
- [ ] Шаг 4: Проанализируйте результаты
Шаг 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 предметов)
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 минут на 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("Шаг обучения")
plt.ylabel("Точность MMLU")
plt.title("Прогресс обучения")
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 "Оценка $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.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))
Результат:
| Модель | 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 в 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 не выполняет код
Установите зависимости для выполнения:
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 для параллельной оценки данных и тензоров.
Требования к оборудованию
- 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 (использует этот harness)