Когда хочешь знать, насколько твоя модель тупая
Ты собираешь llama.cpp, качаешь свежую Llama 3.3 8B в GGUF, запускаешь — и вроде всё хорошо. Но как понять, не потеряла ли модель мозги после квантования? Раньше приходилось гонять отдельные скрипты, тянуть lm-evaluation-harness (с его громоздкими зависимостями) или писать свой велосипед. Теперь — нет.
На сцену выходит llama-eval — новый пример в репозитории, который добавил сам ggerganov. Это не отдельная утилита, а встроенный бенчмарк, вшитый в рантайм llama.cpp. Он считает стандартные метрики без отправки данных на чужие сервера и без лишних телодвижений. Звучит как манна небесная? Да, но с парой нюансов.
Что под капотом: не просто перплексия
llama-eval поддерживает несколько популярных бенчмарков: MMLU (по 5-shot), HellaSwag, ARC (Easy и Challenge), TruthfulQA и WinoGrande. Также умеет считать перплексию на кастомных датасетах в plain text. Важно: все тесты прогоняются локально, модель остаётся на твоём железе — никаких утечек данных.
В отличие от lm-evaluation-harness (стандарт де-факто в open-source), llama-eval заточен под GGUF-формат и использует нативные оптимизации llama.cpp: поддержка K-квантов, Flash Attention, offloading на GPU, RPC-вычисления. На практике это означает, что прогон MMLU на 7B-модели занимает минуты, а не часы.
Осторожно: результаты llama-eval не стоит считать эталоном для публикаций. Для научных статей по-прежнему нужен lm-eval с полным набором метрик. Но для бытового сравнения квантизаций или проверки дообученной модели — самое то.
Сравнение с альтернативами:
| Критерий | llama-eval | lm-eval-harness | Самописные скрипты |
|---|---|---|---|
| Интеграция с llama.cpp | Нативная, без костылей | Через внешний API | Ручная обёртка |
| Поддержка GGUF | Полная, все кванты | Ограниченная, нужен конвертер | Как повезёт |
| Скорость прогона | Высокая (GPU, K-кванты) | Средняя (зависит от бэкенда) | Низкая |
| Количество метрик | ~10 встроенных | 50+ (с кастомизацией) | Ограничено фантазией |
| Простота запуска | Одна команда после сборки | Требует установки пакетов | Отнимает время |
Запуск: быстрее, чем кажется
Чтобы попробовать, нужно сначала собрать llama.cpp с включёнными примерами. Если ты уже собирал движок (как описано в нашем гиде по сборке под своё железо), просто добавь флаг -DLLAMA_BUILD_EXAMPLES=ON при конфигурации CMake. После сборки в папке build/bin появится исполняемый файл llama-eval.
Типичная команда для прогона MMLU выглядит так:
./llama-eval \
--model /path/to/model.gguf \
--tasks mmlu \
--shots 5 \
--batch-size 32 \
--tensor-split 0.5,0.5 # если два GPU
На выходе — табличка с accuracy по каждой категории (STEM, humanities, social sciences, other) и общий скор. Если модель поддерживает chat template, можно добавить флаг --chat-template — результаты станут ближе к реальному использованию в чат-интерфейсах.
Для HellaSwag и ARC не нужны few-shot примеры — они выполняются в zero-shot режиме. А TruthfulQA требует кастомного промпта, который llama-eval загружает из встроенного конфига. Всё автоматически.
--rpc с адресом сервера.Кому это реально нужно (а кому нет)
llama-eval — идеальный инструмент для трёх категорий людей:
- Энтузиасты, которые сравнивают квантизации. Вместо того чтобы гадать, насколько Q4_K_M хуже Q8_0, запустите прогон MMLU и получите цифры. Разница станет очевидной.
- Разработчики, которые дообучают модели. После каждого LoRA-апдейта полезно быстро проверить, не упала ли точность на стандартных тестах. Встроенная интеграция с llama.cpp ускоряет цикл экспериментов.
- Участники сообщества LocalLLaMA. В Discord-сервере LocalLlama постоянно спорят о том, какая модель лучше. Теперь можно подкрепить аргументы бенчмарком, который воспроизводится одной командой.
А кому не нужен? Тем, кто работает с моделями через высокоуровневые обёртки вроде LM Studio или LlamaBarn и не хотят лезть в консоль. Им проще подождать, пока поддержку бенчмарков добавят в графический интерфейс. Но, судя по скорости развития экосистемы, это вопрос пары месяцев.
Кстати, если вы до сих пор не обновили свои скрипты для блокировки нежелательных фраз — советуем посмотреть старый гайд: после обновления llama.cpp синтаксис мог измениться.
Чего не хватает (субъективно)
llama-eval пока экспериментальный. Нет поддержки GSM8K, MATH и других генеративных бенчмарков — только задачи с выбором ответа. Нет автоматического сравнения двух моделей side-by-side. И, что бесит больше всего, нет ни единого графика. Вывод — просто колонки цифр в терминале. Приходится экспортировать в CSV и рисовать самому. Надеюсь, ggerganov в следующем PR добавит визуализацию.
Но если смотреть в целом — это огромный шаг вперёд. Встроенный бенчмарк в llama.cpp означает, что любая модель, собранная под этот движок, может быть протестирована за пару минут. Никаких внешних зависимостей, никаких споров о воспроизводимости. Просто ./llama-eval --tasks mmlu — и ты знаешь правду.
А правда, как обычно, оказывается где-то посередине: между хайпом и реальным качеством. И теперь её можно измерить.