Перейти к основному содержимому

For clean Markdown content of this page, append .md to this URL. For the complete documentation index, see https://docs.nvidia.com/dynamo/llms.txt. For full content including API reference and SDK examples, see https://docs.nvidia.com/dynamo/llms-full.txt.

Многоузловые развертывания

В этом руководстве объясняется, как развертывать нагрузки Dynamo на нескольких узлах. Многоузловые развертывания позволяют масштабировать ресурсоемкие LLM-нагрузки между несколькими физическими машинами, максимизируя использование GPU и поддерживая более крупные модели.

Обзор

Dynamo поддерживает многоузловые развертывания через секцию multinode в спецификациях ресурсов. Это позволяет:

  • распределять нагрузки по нескольким физическим узлам
  • масштабировать GPU-ресурсы за пределы одной машины
  • поддерживать большие модели, которым требуется широкая tensor parallelism
  • достигать высокой доступности и устойчивости к сбоям

Базовые требования

  • Кластер Kubernetes: версия 1.24 или новее
  • GPU-узлы: несколько узлов с GPU NVIDIA
  • Высокоскоростная сеть: InfiniBand, RoCE или Ethernet с высокой пропускной способностью (рекомендуется для оптимальной производительности)

Продвинутая оркестрация многоузловых развертываний

Использование Grove (по умолчанию)

Для сложных многоузловых развертываний Dynamo интегрируется с продвинутыми системами оркестрации Kubernetes:

  • Grove: gang scheduling с учетом топологии сети и авто-масштабирование для AI-нагрузок
  • KAI-Scheduler: нативный для Kubernetes scheduler, оптимизированный для AI-нагрузок в масштабе

Эти системы предоставляют расширенные возможности планирования, включая размещение с учетом топологии, gang scheduling и согласованное авто-масштабирование на нескольких узлах.

Возможности, доступные с Grove:

  • декларативная композиция AI-нагрузок
  • многоуровневое горизонтальное авто-масштабирование
  • настраиваемый порядок запуска компонентов
  • rolling updates с учетом ресурсов
  • Topology Aware Scheduling — размещение подов внутри стойки, блока или другого домена топологии для меньшей задержки

KAI-Scheduler — это нативный для Kubernetes scheduler, оптимизированный для AI-нагрузок в большом масштабе.

Возможности, доступные с KAI-Scheduler:

  • gang scheduling
  • размещение подов с учетом топологии сети
  • алгоритмы планирования, оптимизированные для AI-нагрузок
  • учет и распределение GPU-ресурсов
  • поддержка сложных ограничений планирования
  • интеграция с Grove для расширенных возможностей
  • оптимизации производительности для крупных развертываний
Предварительные требования
  • установленный на кластере Grove
  • (Необязательно) установленный на кластере KAI-Scheduler с созданной очередью по умолчанию dynamo. Если в ресурсе DGD не задана аннотация очереди, operator по умолчанию использует очередь dynamo. Пользовательские имена очередей можно задать через аннотацию nvidia.com/kai-scheduler-queue, но очередь должна существовать в кластере до развертывания.

KAI-Scheduler необязателен, но рекомендуется для расширенных возможностей планирования.

Использование LWS и Volcano

LWS — это простой механизм многоузлового развертывания, который позволяет развернуть нагрузку на нескольких узлах.

Volcano — нативный для Kubernetes scheduler, оптимизированный для AI-нагрузок в масштабе. Он используется вместе с LWS, чтобы обеспечить поддержку gang scheduling.

Основные понятия

Алгоритм выбора orchestrator

Dynamo автоматически выбирает лучший доступный orchestrator для многоузловых развертываний по следующей логике:

Когда доступны и Grove, и LWS:

  • По умолчанию выбирается Grove (рекомендуется для продвинутых AI-нагрузок)
  • LWS выбирается, если вы явно задали аннотацию nvidia.com/enable-grove: "false" в ресурсе DGD

Когда доступен только один orchestrator:

  • автоматически выбирается установленный orchestrator (Grove или LWS)

Интеграция scheduler:

  • С Grove: автоматически интегрируется с KAI-Scheduler, когда он доступен, и предоставляет:
    • расширенное управление очередями через аннотацию nvidia.com/kai-scheduler-queue
    • политики планирования, оптимизированные для AI
    • размещение нагрузки с учетом ресурсов
  • С LWS: использует scheduler Volcano для gang scheduling и координации ресурсов

Примеры конфигурации:

По умолчанию (Grove с KAI-Scheduler):

apiVersion: nvidia.com/v1alpha1
kind: DynamoGraphDeployment
metadata:
name: my-multinode-deployment
annotations:
nvidia.com/kai-scheduler-queue: "dynamo"
spec:
# ... your deployment spec

Примечание: Аннотация nvidia.com/kai-scheduler-queue по умолчанию имеет значение "dynamo". Если вы укажете собственное имя очереди, убедитесь, что эта очередь существует в кластере до развертывания. Доступные очереди можно проверить командой kubectl get queues.

Принудительное использование LWS:

apiVersion: nvidia.com/v1alpha1
kind: DynamoGraphDeployment
metadata:
name: my-multinode-deployment
annotations:
nvidia.com/enable-grove: "false"
spec:
# ... your deployment spec

Секция multinode

Секция multinode в спецификации ресурса определяет, на скольких физических узлах должна размещаться нагрузка:

apiVersion: nvidia.com/v1alpha1
kind: DynamoGraphDeployment
metadata:
name: my-multinode-deployment
spec:
# ... your deployment spec
services:
my-service:
...
multinode:
nodeCount: 2
resources:
limits:
gpu: "2" # 2 GPUs per node

Распределение GPU

Связь между multinode.nodeCount и gpu является мультипликативной:

  • multinode.nodeCount: количество физических узлов
  • gpu: количество GPU на узел
  • Всего GPU: multinode.nodeCount × gpu

Пример:

  • multinode.nodeCount: "2" + gpu: "4" = 8 GPU всего (4 GPU на узел на 2 узлах)
  • multinode.nodeCount: "4" + gpu: "8" = 32 GPU всего (8 GPU на узел на 4 узлах)

Согласование Tensor Parallelism

Tensor parallelism (tp-size или --tp) в вашей команде/аргументах должен совпадать с общим количеством GPU:

# Example: 2 multinode.nodeCount × 4 GPUs = 8 total GPUs
apiVersion: nvidia.com/v1alpha1
kind: DynamoGraphDeployment
metadata:
name: my-multinode-deployment
spec:
# ... your deployment spec
services:
my-service:
...
multinode:
nodeCount: 2
resources:
limits:
gpu: "4"
extraPodSpec:
mainContainer:
...
args:
# Command args must use tp-size=8
- "--tp-size"
- "8" # Must equal multinode.nodeCount × gpu

Поведение Operator для конкретных backend

Когда вы развертываете многоузловую нагрузку, Dynamo operator автоматически применяет конфигурации, специфичные для backend, чтобы включить распределенное выполнение. Понимание этих автоматических изменений помогает устранять неполадки и оптимизировать развертывания.

Backend vLLM

Для многоузловых развертываний vLLM operator автоматически выбирает и настраивает подходящий режим распределенного выполнения на основе ваших настроек parallelism:

Режимы развертывания

Operator автоматически определяет режим развертывания на основе конфигурации parallelism:

1. Режим Tensor/Pipeline Parallelism (одна модель на нескольких узлах)

  • Когда используется: когда world_size > GPUs_per_node, где world_size = tensor_parallel_size × pipeline_parallel_size
  • Сценарий: распределение одного экземпляра модели по нескольким узлам с помощью tensor или pipeline parallelism

Operator использует Ray для многоузловых развертываний tensor/pipeline parallel. Ray обеспечивает автоматическое управление placement group и запуск worker-ов на разных узлах.

Ведущий узел:

  • Команда: ray start --head --port=6379 && <original-vllm-command> --distributed-executor-backend ray
  • Поведение: запускает Ray head node, затем выполняет vLLM, который создает placement group, охватывающую всех Ray worker-ов
  • Проверки: все health probes остаются активными (liveness, readiness, startup)

Узлы-воркеры:

  • Команда: ray start --address=<leader-hostname>:6379 --block
  • Поведение: присоединяется к Ray cluster и блокируется; vLLM на leader создает Ray actors на этих worker-ах
  • Проверки: все probes (liveness, readiness, startup) автоматически удаляются

Ray executor vLLM автоматически создает placement group и запускает worker-ов по всему кластеру. Флаг --nnodes НЕ используется с Ray — он совместим только с backend mp.

2. Режим Data Parallel (несколько экземпляров модели на разных узлах)

  • Когда используется: когда world_size × data_parallel_size > GPUs_per_node
  • Сценарий: запуск нескольких независимых экземпляров модели на узлах с data parallelism (например, MoE-модели с expert parallelism)

Все узлы (Leader и Worker):

  • Вставляемые флаги:
    • --data-parallel-address <leader-hostname> - адрес сервера координации
    • --data-parallel-size-local <value> - количество data parallel worker-ов на узел
    • --data-parallel-rpc-port 13445 - RPC-порт для координации data parallel
    • --data-parallel-start-rank <value> - стартовый rank для этого узла (вычисляется автоматически)
  • Проверки: worker probes удаляются; leader probes остаются активными

Примечание: operator интеллектуально вставляет эти флаги в вашу команду независимо от ее структуры (прямые Python-команды или shell-обертки)

Почему Ray для многоузлового TP/PP?

vLLM поддерживает два backend для распределенного выполнения: ray и mp. Для многоузловых развертываний:

  • Ray executor: vLLM создает placement group и запускает Ray actors по всему кластеру. Worker-ы не запускают vLLM напрямую - процесс vLLM на leader управляет всем.
  • mp executor: каждый узел должен запускать собственный процесс vLLM с --nnodes, --node-rank, --master-addr, --master-port. Такой подход сложнее оркестрировать.

Дynamo operator использует Ray, потому что:

  1. Это соответствует официальной multi-node документации vLLM (см. multi-node-serving.sh)
  2. Оркестрация проще: только leader запускает vLLM, а worker-ам нужны лишь Ray agents
  3. vLLM автоматически управляет созданием placement group и worker-ами

Поддержка Compilation Cache

Когда для volume mount задано useAsCompilationCache: true, operator автоматически устанавливает:

  • VLLM_CACHE_ROOT: переменную окружения, указывающую на точку монтирования cache

Backend SGLang

Для многоузловых развертываний SGLang operator вставляет параметры distributed training:

Ведущий узел

  • Вставляемые флаги: вставляет --dist-init-addr <leader-hostname>:29500 --nnodes <count> --node-rank 0
  • Проверки: все health probes остаются активными

Узлы-воркеры

  • Вставляемые флаги: вставляет --dist-init-addr <leader-hostname>:29500 --nnodes <count> --node-rank <dynamic-rank>
    • node-rank автоматически определяется по stateful identity pod-а
  • Проверки: все probes (liveness, readiness, startup) автоматически удаляются

Примечание: operator интеллектуально вставляет эти флаги независимо от структуры вашей команды (прямые Python-команды или shell-обертки).

Backend TensorRT-LLM

Для многоузловых развертываний TensorRT-LLM operator настраивает коммуникацию на основе MPI:

Ведущий узел

  • SSH-конфигурация: автоматически настраивает SSH-ключи и конфигурацию из Kubernetes secret
  • MPI-команда: оборачивает вашу команду в mpirun с:
    • корректным списком хостов, включая все worker-узлы
    • SSH-конфигурацией для аутентификации без пароля на порту 2222
    • распространением переменных окружения на все узлы
    • активацией виртуального окружения Dynamo
  • Проверки: все health probes остаются активными

Узлы-воркеры

  • SSH daemon: заменяет вашу команду настройкой и запуском SSH daemon
    • генерирует host keys в доступных пользователю каталогах (без привилегий)
    • настраивает SSH daemon на прослушивание порта 2222
    • настраивает authorized keys для доступа leader
  • Проверки:
    • Проверки Liveness and Startup: удаляются (worker-узлы запускают SSH daemon, а не основное приложение)
    • Проверка Readiness: заменяется проверкой TCP socket на SSH-порту 2222
      • Initial Delay: 20 seconds
      • Period: 20 seconds
      • Timeout: 5 seconds
      • Failure Threshold: 10

Дополнительная конфигурация

  • Переменная окружения: OMPI_MCA_orte_keep_fqdn_hostnames=1 добавляется на все узлы
  • SSH volume: автоматически монтирует secret с парой SSH-ключей (обычно называется mpirun-ssh-key-<deployment-name>)
  • Автоматическая генерация SSH-ключей: operator автоматически генерирует secret с парой SSH-ключей, когда обнаруживает многоузловой DynamoGraphDeployment. Ручное создание secret не требуется.

Конфигурация Compilation Cache

Operator поддерживает тома compilation cache для оптимизации backend:

BackendУровень поддержкиПеременные окруженияТочка монтирования по умолчанию
vLLMПолная поддержкаVLLM_CACHE_ROOTЗадается пользователем
SGLangЧастичная поддержкаНет (ожидается upstream)Задается пользователем
TensorRT-LLMЧастичная поддержкаНет (ожидается upstream)Задается пользователем

Чтобы включить compilation cache, добавьте volume mount с useAsCompilationCache: true в спецификацию компонента. Для vLLM operator автоматически настроит необходимые переменные окружения. Для других backend будут созданы volume mount, но до появления поддержки upstream может потребоваться дополнительная настройка окружения.

Следующие шаги

Дополнительные примеры и поддержку см. в рабочих конфигурациях для многоузловых развертываний:

Эти примеры демонстрируют правильное использование секции multinode с соответствующими ограничениями gpu и корректной настройкой tp-size.