Это ранбук за нашими опубликованными цифрами DeepSeek-V4-Flash-0731 на паре DGX Spark (GB10, TP=2 по 200G RoCE) — каждый шаг так, как мы реально запускаем, с ловушками, стоившими нам времени, размеченными как ловушки. Авторитетная версионируемая копия живёт в публичном репозитории вместе с манифестом прогонов и сырыми выводами; эта страница — аннотированная экскурсия.
Пять шагов
1. Веса на ОБА узла — ~156 ГиБ на диске на узел . Мы
бенчмаркали community-чекпоинт FP8, пиненный ревизией; официальный
чекпоинт в репо упомянут, но наши цифры описывают не его. Пиньте ревизию —
main едет.
2. Образ рантайма по digest, на оба узла. Теги двигаются; digest в репо — нет. Каждая опубликованная цифра называет digest, под которым бежала, — именно это делает будущее расхождение диагностируемым.
3. Сначала HEAD, потом peer. Rank 0 держит TCPStore; peer,
подключившийся до того, как head начал слушать, виснет на broken pipe без
внятной ошибки. Запустите head, дождитесь порта стора в ss -tln, только
потом запускайте peer. Записанным этот баг порядка читается очевидным —
вживую он стоил нам часов.
4. Готово, когда отвечает /v1/models. Загрузка весов занимает
≈6–7 минут ; настройки фабрики (IP head/peer, HCA, GID index) —
переменные окружения в шапке launch-скрипта.
5. Проверьте, что MoE-бэкенд реально взялся. Движок везёт ядро,
специально собранное под MXFP4-экспертов этой модели на GB10, и
сознательно исключает его из auto:
docker logs vllm_dsv4 2>&1 | grep "Mxfp4 MoE backend"
# нужно: Using 'B12X_MXFP4' не: Using 'DEEPGEMM_MXFP4'
Пропуск этой проверки — самая частая причина, по которой опубликованная
цифра Spark’а оказывается в высоких пятидесятых вместо высоких
шестидесятых: auto дал нам 59.7 tok/s клиентского декода там, где
flashinfer_b12x дал 67.6 , движковый замер — 9–12% по
частоте шагов верификации.
Какие цифры ждать
Финальная конфигурация, медианы по повторным запросам, из публичных результатов :
| Ячейка | tok/s |
|---|---|
| card-like короткий вывод, c=1 | 67.6 |
| code-профиль, c=1 | 65.5 |
| тяжёлая проза с 4K-контекстом, c=1 | 43.7 |
| code-профиль, c=12 агрегат | 260.4 |
Разброс по профилям больше большинства конфигурационных изменений — цифра без профиля нефальсифицируема. Почему гуляющие по форумам числа не сходятся друг с другом — отдельная страница.
Считайте токены по usage.completion_tokens, никогда по числу
SSE-событий. Под спекулятивным декодингом одно событие может нести
несколько принятых токенов; счёт по событиям молча раздувает throughput.
Ловушка мониторинга
На unified memory GB10 dcgm-exporter не работает совсем, а NVML отдаёт
N/A на заметную долю запросов — ваша Grafana будет зелёной и пустой. Мы
парсим nvidia-smi собственным textfile-коллектором в метрики
node-exporter; разбор — на Habr.
Заложите это в бюджет: серверная коробка, которую нельзя наблюдать, —
коробка, которую нельзя эксплуатировать.
Секция честности
- Всё здесь —
lab_single_run: одиночные проходы с прогревами, одна пара юнитов, вне трёхповторной методологии. Разброс на этом классе железа широкий — идентичные агрегатные прогоны расходились на 18–24% , так что однодесятичную точность из любого источника, включая наш, считайте оптимизмом. - Наш собственный первый замер был смещён клиентской методикой, и мы пометили его в репо superseded, а не удалили; цитировать следует движковую серию.
- Нашли расходящуюся цифру? Пришлите её — конфигурационная дельта за расхождением обычно информативнее любой из цифр.
Связанное: кривая глубины до 1M · отчёт про MoE-бэкенд · стоит ли Spark вообще.