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

Ресурсы

перевод и редактура:

обновлено

⌕ ESC