NVIDIA Dynamo: дирижёр для инференса на целый дата-центр 🎻🖥️
Ну чё, малютки, vLLM и SGLang вы уже щупали — они шикарно гоняют модель на одной-двух видяхах. А теперь вопрос на засыпку: у тебя 64 GPU на восьми нодах, тысячи запросов в секунду, и надо чтобы всё это работало как единый организм, а не как восемь отдельных серверов, дерущихся за память. Кто этим дирижирует?
Вот тут и выходит NVIDIA Dynamo — открытый оркестратор инференса дата-центрового масштаба. Важный момент: он не заменяет vLLM, TensorRT-LLM или SGLang, а превращает их в единую скоординированную систему на много нод.
Dynamo — это слой над движками инференса. Сами движки оптимизируют одну ноду, а Dynamo раскидывает запросы по кластеру: маршрутизирует с учётом KV-кэша, разносит фазы prefill и decode по разным пулам GPU, гоняет KV-кэш между GPU/CPU/SSD и авто-масштабирует под SLA. Ядро на Rust, обвязка на Python, лицензия Apache 2.0.
Полностью открыто, без вендор-лока. Бэкенды — vLLM, TensorRT-LLM, SGLang.
Ядро на Rust ради скорости (~52% кода), Python для расширяемости. Немного Go для Kubernetes.
NVIDIA заявляет до 7× пропускной способности на GPU (DeepSeek R1) и 2× быстрее TTFT за счёт KV-aware роутинга.
Зачем он нужен
Движок инференса (vLLM и ко.) живёт в рамках одной ноды. Как только тебе нужен кластер — вылезают проблемы, которые движок в одиночку не решает:
Dynamo берёт эти задачи на себя. Один движок — это музыкант; Dynamo — дирижёр, который заставляет весь оркестр играть в такт.
Как устроен: архитектура
Dynamo — это набор слабосвязанных компонентов. Вот основной поток:
Ключевые детали по компонентам:
Как обрабатывается запрос
Самое интересное — disaggregated serving. В обычном движке одна группа GPU делает и prefill (обработать промпт, набить KV-кэш), и decode (генерить токены). Dynamo разносит это на два пула, а KV-кэш между ними передаёт по NIXL:
Зачем так? Потому что prefill compute-bound, а decode memory-bound (подробно — в моей статье про KV-кэш). Когда они на одних GPU, то мешают друг другу. Разнеси их — и каждый пул масштабируется под свою нагрузку. Хочешь больше длинных промптов — добавь prefill-воркеров, не трогая decode.
KV-aware роутинг: главная фишка
Router не раскидывает запросы вслепую. Если несколько запросов делят общий префикс (один системный промпт, один документ в RAG), то KV-кэш для него уже посчитан на каком-то воркере. KV-aware роутер шлёт запрос именно туда — и prefill для общей части пропускается.
Покрути — сравни round-robin и KV-aware на одном потоке запросов:
Видишь разницу в проценте попаданий? Каждое попадание — это пропущенный prefill, то есть меньше задержка до первого токена. Отсюда заявленные 2× быстрее TTFT.
Куда девается KV-кэш: KVBM
KV-кэш на длинном контексте не влезает в дорогую GPU-память (HBM). KVBM делает то же, что ОС с виртуальной памятью — раскладывает кэш по уровням, от быстрого к ёмкому:
Так на одни и те же GPU влезает больше параллельных запросов и более длинные контексты — кэш не выбрасывается, а откладывается «пониже» и подтягивается обратно при необходимости.
Остальные компоненты
Как запустить
Минимальный старт — через готовый контейнер с SGLang-бэкендом:
docker run --gpus all --network host --rm -it \
nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.2.1
# внутри контейнера: фронтенд + воркер
python3 -m dynamo.frontend --http-port 8000 --discovery-backend file &
python3 -m dynamo.sglang --model-path Qwen/Qwen3-0.6B \
--discovery-backend file &
# проверка
curl -s localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"Qwen/Qwen3-0.6B","messages":[{"role":"user","content":"Hello!"}]}'
Или поставить из PyPI (выбрав бэкенд):
uv pip install --prerelease=allow "ai-dynamo[sglang]"
Если у тебя одна GPU — Dynamo не нужен, бери чистый vLLM/SGLang. Dynamo начинает окупаться на кластере: когда запросов много, контексты длинные, надо разносить prefill/decode и держать SLA при минимуме железа. Для прода на десятках GPU — мастхэв; для домашней RTX — оверкилл.
Где это в стеке
Чтобы уложить в голове: движок (vLLM/TRT-LLM/SGLang) гоняет модель на ноде, а Dynamo сидит над ними и дирижирует кластером.
Если хочешь понять сами движки — у меня есть большой гайд по движкам инференса, а про KV-кэш, вокруг которого вся эта оркестрация и пляшет, — отдельная статья.
TL;DR
Тренд очевиден: инференс перестаёт быть «запустил модель на сервере» и становится распределённой системой со своим дирижёром. Dynamo — открытый способ этого дирижёра потрогать. 🫡