Версия в один абзац: бенчмарк-цифру стоит публиковать тогда, когда незнакомец может с ней не согласиться — воспроизвести сетап, получить другое значение и найти причину в дельте конфигураций. Для этого цифра должна нести с собой свою конфигурацию, свой ворклоад, свои отказы и свой разброс. Всё ниже служит одному этому свойству, и каждое правило заслужило своё место тем, что сначала обожгло нас.
Это протокол, стоящий за нашими опубликованными цифрами, — написан для любого, кто постит замер локальной LLM на форум, в README или в блог. Харнесс, который его реализует, открыт; ничего из написанного не требует нашего инструментария.
Спросите работающий сервер, что он запускает
Не ваш скрипт запуска — сервер. llama.cpp отвечает на /props своими
эффективными настройками; vLLM печатает разрешённую конфигурацию на старте.
Дефолты меняются между релизами, а флаг, который вы не выставили, всё равно
часть вашей конфигурации. Самая острая ошибка измерения в
нашем собственном журнале пришла из
дефолта параллельных слотов, который сменился между версиями и молча
поделил пропускную способность на поток ещё до начала бенчмарка. Ваша
память о командной строке — не доказательство; ответ самого процесса — да.
Запините то, что гоняли, до байтов
Рантайм — по digest образа, не по тегу: теги переезжают. Модель — по хэшу артефакта, не по имени: репозитории перезаливают файлы. Прошивка устройства — названа явно: дискурс вокруг DGX Spark развернул вердикт на том же железе после обновления прошивки, а значит, недатированные цифры Spark теперь сплетни без атрибуции. Если читатель не может сказать, какие байты произвели вашу цифру, он не может с ней не согласиться — только спорить вокруг неё.
Заморозьте ворклоад и назовите его
Самый большой разброс в нашем архиве даёт не железо и не флаги, а форма ворклоада: длина промпта, длина вывода, класс содержимого. На одной коробке и одной сборке профиль с коротким выводом и профиль с тяжёлым контекстом дают цифры, расходящиеся сильнее, чем большинство апгрейдов железа — сверка опубликованных цифр DGX Spark по большей части свелась к выяснению, какой неназванный профиль стоял за каждой из них. Зафиксируйте корпус, зафиксируйте настройки сэмплинга и публикуйте профиль рядом с цифрой. Цифра в tok/s без своего ворклоада нефальсифицируема.
Считайте правильные токены с правильной стороны
Здесь живут три отдельные ловушки. Считайте токены вывода из
usage.completion_tokens в ответе API, а не по числу событий стрима: при
спекулятивном декодировании одно событие может нести несколько токенов, и
счёт событий молча раздувает пропускную способность. Скажите, с какой
стороны провода вы мерили: клиентская сторона включает сеть и очередь
сервера, движковая — нет, и под нагрузкой они расходятся. А для
рассуждающих моделей решите, что означает ваша метрика первого токена:
первый токен чего угодно или первый токен ответа — разрыв между этими
определениями
иногда и есть весь результат.
Держите отказы в знаменателе
Запрос, вернувший HTTP 200 с пустым ответом, — не потерянный сэмпл, а результат. Выбрасывание отказавших, пустых и битых ответов перед усреднением тихо превращает проблему надёжности в бонус к скорости: выигрывает сервер, который отказывает быстрее всех. Мы прогоняем каждый ответ через гейты формата, языка и повторов и публикуем долю, не произведшую ничего, рядом с задержкой тех ответов, что состоялись.
Повторяйте — и публикуйте разброс
Одиночный проход — анекдот с десятичными знаками. Наш пол для цитируемой цифры — три повторных прогона на одном юните, а там, где это важно, мы повторяем паттерн на втором коммерчески идентичном юните. На некоторых классах железа идентичные прогоны расходятся на величины, рядом с которыми теряются обсуждаемые эффекты, — точность до десятых из любого одиночного прохода, включая наш собственный, это оптимизм в лабораторном халате.
Утихомирьте хост — и докажите это
Во время замера на коробке не работает ничего больше — а «ничего больше» само по себе утверждение, так что запишите его. Наши манифесты несут снимок инвентаря хоста до и после каждой ячейки; сосед по GPU, появившийся посреди прогона, аннулирует ячейку. Заодно проверьте лог сервера на тихий откат на CPU: модель, незаметно покинувшая GPU, производит прекрасно воспроизводимые цифры о другом устройстве.
Публикуйте так, чтобы с вами можно было не согласиться
Сырые записи прогонов, точная конфигурация, идентичность ворклоада и сама цифра — вместе, по стабильному адресу. В этом весь дизайн наших страниц клеймов: значение, скоуп, ограничения и прогоны делят один пермалинк. А когда чья-то цифра расходится с вашей, обращайтесь с этим как с данными: дельта конфигураций за расхождением обычно информативнее любой из двух цифр. У наших есть постоянный канал приёма.
Чек-лист
Перед публикацией цифра должна отвечать: какое устройство и какая прошивка, какой рантайм и digest, какая модель и хэш, какой квант, какая форма ворклоада и какой сэмплинг, какая конкурентность, какая сторона провода, сколько повторов, что исключено и почему. Если хоть один ответ — «не уверен», цифра не готова. А если все ответы на месте, полезна даже цифра, которая позже окажется неверной, потому что её можно найти неверной. В этом вся разница между измерением и настроением.