Перейти к основному содержимому

Оценка 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 минут

Ресурсы​