Мануал по развёртыванию
Развернуть большой MoE на DGX Spark через vLLM: от одного узла до пары
Порядок развёртывания, обходящий тихие зависания, которые мы поймали на собственной паре GB10: запиненные веса и образ, head раньше peer, готовность по эндпоинту, а не по ощущению, и проверка выбора MoE-ядра, отделяющая быструю конфигурацию от той, которую гоняет большинство.
- Платформа:
- DGX Spark (GB10)
- Время на прохождение:
- 2-3 ч
- Обновлено:
- 01.09.2026
Это версия-туториал нашего серверного рецепта — те же шаги, выстроенные для того, кто делает это впервые, с ловушками, за которые мы заплатили, размеченными до того, как вы до них дойдёте. Написана на настоящей паре юнитов GB10, обслуживающей MoE на 284B параметров; одиночный Spark идёт тем же путём минус раздел про фабрику.
Понадобятся: один или два DGX Spark на актуальной прошивке, Docker с NVIDIA runtime и много диска — веса фронтирного класса измеряются сотнями гигабайт на узел.
Шаг 1 — запините всё до того, как что-нибудь скачивать
Три идентичности решают, можно ли будет потом отладить ваше
развёртывание: ревизия модели, digest контейнера и версия прошивки.
Сначала запишите все три. main переезжает, теги переезжают, а обновления
прошивки Spark
исторически меняли поведение достаточно,
чтобы развернуть отношение сообщества к устройству в целом. Развёртывание, которое вы не можете точно назвать, никто не поможет вам отладить.
# запишите эти три строки куда-нибудь насовсем:
# model: <repo> @ <revision>
# image: vllm/vllm-openai@sha256:<digest>
# firmware: (из информации о вашей системе)
Шаг 2 — веса на каждый узел
Для пары: полные веса кладутся на ОБА узла, идентичная ревизия. Это надолго: заложите время честно, а по завершении сверьте, что размеры совпадают. Для одиночного узла выберите модель, которая действительно влезает в одно устройство, — фронтирный класс не влезает, поэтому пара и существует.
Шаг 3 — сначала один узел, даже если у вас два
Поднимите один узел в одиночку, прежде чем трогать тензорный параллелизм. Сначала изучите поведение контейнера — время старта, паттерн памяти, форму логов — без фабрики как второй переменной:
docker run -d --name vllm --gpus all \
-v /var/lib/llm/models:/models -p 8000:8000 \
vllm/vllm-openai@sha256:YOUR_DIGEST \
--model /models/YOUR-MODEL --max-model-len 32768
Готовность — это эндпоинт, а не ощущение: сервер поднялся, когда отвечает
curl localhost:8000/v1/models. Загрузка весов у модели этого класса
занимает минуты — смотрите docker logs -f vllm и не перезапускайте
контейнер на полпути из нетерпения.
Шаг 4 — для пары: сначала head, потом peer, именно в этом порядке
Узел rank 0 держит координационный стор. Peer, стартовавший до того, как
head начал слушать, умирает на broken pipe без внятной ошибки —
на бумаге этот баг порядка запуска очевиден, но
стоил нам живых часов.
Рабочая последовательность: запустите head, дождитесь, пока порт стора
появится в ss -tln, и только потом запускайте peer. Настройкам фабрики
(IP head и peer, HCA, GID index) место в переменных окружения в шапке
вашего скрипта запуска, а не россыпью по нему.
Шаг 5 — убедитесь, что выбор ядра сработал
Для MoE-моделей автоматический выбор бэкенда в vLLM может сознательно пропустить ядро, собранное ровно под квантизацию вашей модели. Грепните логи по строке MoE-бэкенда и убедитесь, какой именно загрузился, — разница не косметическая. Если у семейства вашей модели есть специализированный бэкенд, задайте его явно и проверьте лог ещё раз. Одна эта проверка чаще всего и отделяет опубликованную цифру Spark от разочарованного поста на форуме.
Шаг 6 — smoke-тест
Та же дисциплина, что и на любой коробке:
отправьте настоящий chat completion, убедитесь, что content не пуст и
finish_reason — это stop, а токены считайте из
usage.completion_tokens — при спекулятивном декодировании счёт событий
стрима врёт.
Шаг 7 — мониторинг, пока он не понадобился
Штатная наблюдаемость GPU на unified memory GB10 работает наполовину: dcgm-exporter не работает вовсе, а NVML отвечает N/A на большую часть того, по чему вы хотели бы алертить. Настройте обход через textfile-коллектор сейчас — обслуживающая коробка, за которой нельзя наблюдать, — это коробка, которую нельзя эксплуатировать, и лучше не обнаруживать этот пробел посреди первого инцидента.
Куда дальше
- Чего от него ждать: измеренный ответ покупателю, кривая контекста и история конкурентности — в отчётах про Spark.
- Контексты 256K и дальше: охота за конфигурацией и предупреждения о сломанных путях — отдельная история.
- Проверьте своё развёртывание: харнесс открыт; цифры для сверки живут в репозитории бенчмарков.