Мануал по развёртыванию

Развернуть большой 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-коллектор сейчас — обслуживающая коробка, за которой нельзя наблюдать, — это коробка, которую нельзя эксплуатировать, и лучше не обнаруживать этот пробел посреди первого инцидента.

Куда дальше

← Все мануалы