Отчёт

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

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

lab_single_run internal research 20 августа 2026 г. · Финансирование: Собственное финансирование, внутреннее исследование

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

Это протокол, стоящий за нашими опубликованными цифрами, — написан для любого, кто постит замер локальной LLM на форум, в README или в блог. Харнесс, который его реализует, открыт; ничего из написанного не требует нашего инструментария.

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

Не ваш скрипт запуска — сервер. llama.cpp отвечает на /props своими эффективными настройками; vLLM печатает разрешённую конфигурацию на старте. Дефолты меняются между релизами, а флаг, который вы не выставили, всё равно часть вашей конфигурации. Самая острая ошибка измерения в нашем собственном журнале пришла из дефолта параллельных слотов, который сменился между версиями и молча поделил пропускную способность на поток ещё до начала бенчмарка. Ваша память о командной строке — не доказательство; ответ самого процесса — да.

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

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

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

Самый большой разброс в нашем архиве даёт не железо и не флаги, а форма ворклоада: длина промпта, длина вывода, класс содержимого. На одной коробке и одной сборке профиль с коротким выводом и профиль с тяжёлым контекстом дают цифры, расходящиеся сильнее, чем большинство апгрейдов железа — сверка опубликованных цифр DGX Spark по большей части свелась к выяснению, какой неназванный профиль стоял за каждой из них. Зафиксируйте корпус, зафиксируйте настройки сэмплинга и публикуйте профиль рядом с цифрой. Цифра в tok/s без своего ворклоада нефальсифицируема.

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

Здесь живут три отдельные ловушки. Считайте токены вывода из usage.completion_tokens в ответе API, а не по числу событий стрима: при спекулятивном декодировании одно событие может нести несколько токенов, и счёт событий молча раздувает пропускную способность. Скажите, с какой стороны провода вы мерили: клиентская сторона включает сеть и очередь сервера, движковая — нет, и под нагрузкой они расходятся. А для рассуждающих моделей решите, что означает ваша метрика первого токена: первый токен чего угодно или первый токен ответа — разрыв между этими определениями иногда и есть весь результат.

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

Запрос, вернувший HTTP 200 с пустым ответом, — не потерянный сэмпл, а результат. Выбрасывание отказавших, пустых и битых ответов перед усреднением тихо превращает проблему надёжности в бонус к скорости: выигрывает сервер, который отказывает быстрее всех. Мы прогоняем каждый ответ через гейты формата, языка и повторов и публикуем долю, не произведшую ничего, рядом с задержкой тех ответов, что состоялись.

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

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

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

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

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

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

Чек-лист

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

Как цитировать

AGmind Systems Lab (2026-08-20). Как бенчмаркать локальную LLM, чтобы цифры пережили проверку. Evidence level: lab_single_run. https://agmind.ai/ru/reports/how-to-benchmark-local-llm/
← Отчёты