# Как бенчмаркать локальную LLM, чтобы цифры пережили проверку

> Большинству опубликованных скоростей локальных LLM нельзя даже возразить: при них нет конфигурации. Протокол лаборатории, публикующей сырые прогоны: что запинить, что спросить у работающего сервера, какие токены считать и почему отказы остаются в знаменателе.

- Published: 2026-08-20
- Evidence level: lab_single_run
- Funding: Собственное финансирование, внутреннее исследование
- Canonical: https://agmind.ai/ru/reports/how-to-benchmark-local-llm/

Версия в один абзац: бенчмарк-цифру стоит публиковать тогда, когда
незнакомец может с ней не согласиться — воспроизвести сетап, получить
другое значение и найти причину в дельте конфигураций. Для этого цифра
должна нести с собой свою конфигурацию, свой ворклоад, свои отказы и свой
разброс. Всё ниже служит одному этому свойству, и каждое правило заслужило
своё место тем, что сначала обожгло нас.

Это протокол, стоящий за нашими опубликованными цифрами, — написан для
любого, кто постит замер локальной LLM на форум, в README или в блог.
Харнесс, который его реализует,
[открыт](https://github.com/botAGI/agmind-bench); ничего из написанного не
требует нашего инструментария.

## Спросите работающий сервер, что он запускает

Не ваш скрипт запуска — сервер. llama.cpp отвечает на `/props` своими
эффективными настройками; vLLM печатает разрешённую конфигурацию на старте.
Дефолты меняются между релизами, а флаг, который вы не выставили, всё равно
часть вашей конфигурации. Самая острая ошибка измерения в
[нашем собственном журнале](https://agmind.ai/ru/essays/luddites-were-right/) пришла из
дефолта параллельных слотов, который сменился между версиями и молча
поделил пропускную способность на поток ещё до начала бенчмарка. Ваша
память о командной строке — не доказательство; ответ самого процесса — да.

## Запините то, что гоняли, до байтов

Рантайм — по digest образа, не по тегу: теги переезжают. Модель — по хэшу
артефакта, не по имени: репозитории перезаливают файлы. Прошивка
устройства — названа явно: дискурс вокруг DGX Spark развернул вердикт на
том же железе после обновления прошивки, а значит, недатированные цифры
Spark теперь
[сплетни без атрибуции](https://agmind.ai/ru/essays/benchmark-number-config-in-disguise/).
Если читатель не может сказать, какие байты произвели вашу цифру, он не
может с ней не согласиться — только спорить вокруг неё.

## Заморозьте ворклоад и назовите его

Самый большой разброс в нашем архиве даёт не железо и не флаги, а форма
ворклоада: длина промпта, длина вывода, класс содержимого. На одной коробке
и одной сборке профиль с коротким выводом и профиль с тяжёлым контекстом
дают цифры, расходящиеся сильнее, чем большинство апгрейдов железа —
[сверка опубликованных цифр DGX Spark](https://agmind.ai/ru/reports/dspark-speed-numbers-disagree/)
по большей части свелась к выяснению, какой неназванный профиль стоял за
каждой из них. Зафиксируйте корпус, зафиксируйте настройки сэмплинга и
публикуйте профиль рядом с цифрой. Цифра в tok/s без своего ворклоада
нефальсифицируема.

## Считайте правильные токены с правильной стороны

Здесь живут три отдельные ловушки. Считайте токены вывода из
`usage.completion_tokens` в ответе API, а не по числу событий стрима: при
спекулятивном декодировании одно событие может нести несколько токенов, и
счёт событий молча раздувает пропускную способность. Скажите, с какой
стороны провода вы мерили: клиентская сторона включает сеть и очередь
сервера, движковая — нет, и под нагрузкой они расходятся. А для
рассуждающих моделей решите, что означает ваша метрика первого токена:
первый токен *чего угодно* или первый токен *ответа* — разрыв между этими
определениями
[иногда и есть весь результат](https://agmind.ai/ru/reports/ttft-thinking-model-strix-halo/).

## Держите отказы в знаменателе

Запрос, вернувший HTTP 200 с пустым ответом, — не потерянный сэмпл, а
результат. Выбрасывание отказавших, пустых и битых ответов перед
усреднением тихо превращает проблему надёжности в бонус к скорости:
выигрывает сервер, который отказывает быстрее всех. Мы прогоняем каждый
ответ через гейты формата, языка и повторов и публикуем
[долю, не произведшую ничего](https://agmind.ai/ru/reports/answerless-http-200/), рядом с
задержкой тех ответов, что состоялись.

## Повторяйте — и публикуйте разброс

Одиночный проход — анекдот с десятичными знаками. Наш пол для цитируемой
цифры — три повторных прогона на одном юните, а там, где это важно, мы
повторяем паттерн на втором коммерчески идентичном юните. На некоторых
классах железа идентичные прогоны расходятся на величины, рядом с которыми
теряются обсуждаемые эффекты, — точность до десятых из любого одиночного
прохода, включая наш собственный, это оптимизм в лабораторном халате.

## Утихомирьте хост — и докажите это

Во время замера на коробке не работает ничего больше — а «ничего больше»
само по себе утверждение, так что запишите его. Наши манифесты несут снимок
инвентаря хоста до и после каждой ячейки; сосед по GPU, появившийся посреди
прогона, аннулирует ячейку. Заодно проверьте лог сервера на тихий откат на
CPU: модель, незаметно покинувшая GPU, производит прекрасно воспроизводимые
цифры о другом устройстве.

## Публикуйте так, чтобы с вами можно было не согласиться

Сырые записи прогонов, точная конфигурация, идентичность ворклоада и сама
цифра — вместе, по стабильному адресу. В этом весь дизайн
[наших страниц клеймов](https://agmind.ai/ru/claims/): значение, скоуп, ограничения и
прогоны делят один пермалинк. А когда чья-то цифра расходится с вашей,
обращайтесь с этим как с данными: дельта конфигураций за расхождением
обычно информативнее любой из двух цифр. У наших есть
[постоянный канал приёма](https://github.com/botAGI/agmind-lab/issues/new).

## Чек-лист

Перед публикацией цифра должна отвечать: какое устройство и какая прошивка,
какой рантайм и digest, какая модель и хэш, какой квант, какая форма
ворклоада и какой сэмплинг, какая конкурентность, какая сторона провода,
сколько повторов, что исключено и почему. Если хоть один ответ — «не
уверен», цифра не готова. А если все ответы на месте, полезна даже цифра,
которая позже окажется неверной, потому что её можно *найти* неверной. В
этом вся разница между измерением и настроением.

---

Machine-readable claim registry: https://agmind.ai/claims.json · llms.txt: https://agmind.ai/llms.txt
