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

Для чистой Markdown-версии этой страницы добавьте .md к этому URL. Полный индекс документации см. в https://docs.nvidia.com/dynamo/llms.txt. Полное содержимое, включая справочник API и примеры SDK, см. в https://docs.nvidia.com/dynamo/llms-full.txt.

Руководство по установке

Это руководство проведет вас через установку всего необходимого для развертывания моделей с Dynamo в Kubernetes. Выполняйте шаги по порядку — каждый опирается на предыдущий.

Предварительные требования

Перед началом убедитесь, что у вас есть:

GPU-драйверы облачного провайдера: GPU Operator (Шаг 1) сам установит GPU-драйверы. При создании GPU node pools в кластере не включайте установку GPU-драйверов, управляемую провайдером (например, пропустите установку AKS GPU driver, не используйте в GKE --accelerator gpu-driver-version=latest). Если на узлах уже есть драйверы, управляемые провайдером, см. шаг GPU Operator, как это обработать.

Проверьте инструменты:

kubectl version --client # Должно показать v1.24+
helm version # Должно показать v3.0+

Обзор

Каждое развертывание Dynamo требует двух Helm chart: GPU Operator (Шаг 1) и Dynamo Platform (Шаг 2). Все остальное — необязательно. Заранее определите, какие необязательные компоненты вам нужны, чтобы установить их на Шаге 3.

Необязательный компонентКогда нуженТребуется для
Grove + KAI SchedulerМногоузловой или disaggregated inferenceМногоузловые развертывания (operator выдаст ошибку без Grove или LWS)
Network Operator / RDMADisaggregated inference в productionПриемлемая производительность передачи KV cache (fallback на TCP ухудшает ее примерно в 200-500 раз)
kube-prometheus-stackАвтомасштабирование, дашборды метрик или PlannerРежим Planner sla, автомасштабирование KEDA/HPA
Shared storage (кэш модели)Большие модели (>70B) или много репликИзбежание загрузки на каждый pod и лимитов HuggingFace

Grove + KAI Scheduler — Grove является стандартным оркестратором для многоузловых сценариев. Operator возвращает жесткую ошибку в многоузловых развертываниях, если недоступны ни Grove, ни LeaderWorkerSet (LWS). KAI Scheduler необязателен, но рекомендуется вместе с Grove для GPU-aware планирования. Подробности см. в Grove.

Network Operator / RDMA — Без RDMA disaggregated inference автоматически переходит на TCP, но с сильным падением производительности (~98 с TTFT против ~200-500 мс с RDMA). Требуется для любого production disaggregated-развертывания. Настройка зависит от облачного провайдера — см. Disaggregated Communication Guide и руководство вашего провайдера.

kube-prometheus-stack — Требуется для режима оптимизации Planner sla (он читает живые метрики TTFT/ITL из Prometheus). Также требуется для автомасштабирования на базе KEDA/HPA. Режим throughput у Planner может работать без него, используя внутренние сигналы глубины очереди, но функции на основе метрик не будут работать. Подробности см. в Metrics.

Shared storage — Не дает каждому pod загружать веса модели отдельно. Без него загрузка больших моделей (>70B) на каждый pod занимает часы, а большое число реплик упрется в лимиты HuggingFace. Это не навязывается operator'ом — это операционный вопрос. Полное описание см. в Model Caching.

Шаг 1: Установите GPU Operator

NVIDIA GPU Operator автоматизирует развертывание всех компонентов NVIDIA, необходимых для предоставления GPU: драйверов, container toolkit, device plugin и мониторинга.

helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update
helm install gpu-operator nvidia/gpu-operator \
--namespace gpu-operator --create-namespace
# Раскомментируйте, если на узлах уже установлены GPU-драйверы, управляемые провайдером:
# --set driver.enabled=false

Если на GPU-узлах уже установлены драйверы, управляемые провайдером (например, вы использовали в GKE --accelerator gpu-driver-version=latest), раскомментируйте строку driver.enabled=false выше, чтобы operator не конфликтовал с существующими драйверами.

Некоторым облачным провайдерам требуется дополнительная настройка GPU Operator. Подробности см. в руководстве вашего провайдера:

Проверьте, что GPU Operator запущен:

kubectl get pods -n gpu-operator
# Ожидается: gpu-operator, nvidia-driver-daemonset, nvidia-device-plugin-daemonset и т. д. все в Running

Шаг 2: Установите Dynamo Platform

Задайте переменные окружения:

export NAMESPACE=dynamo-system
export RELEASE_VERSION=1.0.2 # должен соответствовать версии из https://github.com/ai-dynamo/dynamo/releases
helm fetch https://helm.ngc.nvidia.com/nvidia/ai-dynamo/charts/dynamo-platform-$RELEASE_VERSION.tgz
helm install dynamo-platform dynamo-platform-$RELEASE_VERSION.tgz \
--namespace $NAMESPACE \
--create-namespace
# Примечание: добавьте \ к --create-namespace выше, когда раскомментируете любые необязательные флаги ниже
#
# Grove + KAI Scheduler — раскомментируйте, если используете multinode или disaggregated inference.
# Option A (install=true): Dynamo устанавливает и управляет Grove/KAI как bundled subcharts (dev/testing):
# --set "global.grove.install=true" \
# --set "global.kai-scheduler.install=true" \
# Option B (enabled=true): Grove/KAI уже установлены и управляются извне (production):
# --set "global.grove.enabled=true" \
# --set "global.kai-scheduler.enabled=true" \
#
# kube-prometheus-stack — раскомментируйте, если Prometheus уже установлен (требуется для Planner sla mode и autoscaling):
# --set "dynamo-operator.dynamo.metrics.prometheusEndpoint=http://prometheus-kube-prometheus-prometheus.monitoring.svc.cluster.local:9090"

Все команды helm install можно настроить через собственный values-файл: helm install ... -f your-values.yaml

Shared/Multi-Tenant кластеры: Если уже запущен cluster-wide Dynamo operator, не устанавливайте еще один. Проверьте так:

kubectl get clusterrolebinding -o json | \
jq -r '.items[] | select(.metadata.name | contains("dynamo-operator-manager")) |
"Cluster-wide operator found in namespace: \(.subjects[0].namespace)"'

Namespace-restricted mode (namespaceRestriction.enabled=true) устарел и будет удален в будущем релизе. Для всех новых развертываний используйте режим cluster-wide по умолчанию.

Проверьте, что Dynamo Platform запущена:

# Проверьте CRD
kubectl get crd | grep dynamo
# Expected: dynamographdeployments, dynamocomponentdeployments, dynamographdeploymentrequests, etc.

# Проверьте pods operator и platform
kubectl get pods -n $NAMESPACE
# Expected: dynamo-operator-*, etcd-*, nats-* pods all Running

Шаг 3: Установите необязательные компоненты

Команда установки Dynamo выше содержит закомментированные флаги для каждого необязательного компонента. Сначала установите компонент, затем раскомментируйте соответствующий флаг перед запуском helm install на Шаге 2 (или выполните helm upgrade --reuse-values с этим флагом, если Dynamo уже установлен).

Многоузловые сценарии:

Многоузловые развертывания требуют либо Grove + KAI Scheduler, либо альтернативной настройки оркестратора (LeaderWorkerSet + Volcano), чтобы включить gang scheduling для workload, распределенных по нескольким узлам. Подробности о выборе и настройке оркестратора см. в Multinode Deployment Guide.

Grove + KAI Scheduler

Есть два способа включить Grove и KAI Scheduler, которые зависят от того, какие флаги вы раскомментируете в команде установки Dynamo:

  • install=true — Dynamo устанавливает и управляет Grove/KAI как bundled subcharts. Самый простой путь; рекомендуется для dev/testing.
  • enabled=true — Сообщает Dynamo, что Grove/KAI уже установлены и управляются извне. Используйте это, если устанавливаете Grove/KAI отдельно (например, чтобы управлять их жизненным циклом независимо или делить их между namespace). Рекомендуется для production.

Для варианта enabled=true сначала установите Grove и KAI Scheduler отдельно. Инструкции см. в руководстве по установке Grove и руководстве по развертыванию KAI Scheduler.

Матрица совместимости:

dynamo-platformkai-schedulerGrove
1.0.x>= v0.13.0>= v0.1.0-alpha.6
1.1.x>= v0.13.4>= v0.1.0-alpha.8

LWS + Volcano

Если для многоузлового сценария вы не используете Grove, можно использовать LeaderWorkerSet (LWS) (>= v0.7.0) с Volcano для gang scheduling. Оба компонента должны быть установлены до развертывания многоузловых workload.

  1. Установите Volcano:
helm repo add volcano-sh https://volcano-sh.github.io/helm-charts
helm repo update
helm install volcano volcano-sh/volcano -n volcano-system --create-namespace
  1. Установите LWS (>= v0.7.0) с включенным Volcano gang scheduling:
export LWS_VERSION=0.8.0
helm install lws oci://registry.k8s.io/lws/charts/lws \
--version=$LWS_VERSION \
--namespace lws-system \
--create-namespace \
--set gangSchedulingManagement.schedulerProvider=volcano \
--wait --timeout 300s

См. документацию LWS и документацию Volcano для параметров настройки, а также Multinode Deployment Guide для выбора orchestrator.

Network Operator / RDMA

Настройка RDMA зависит от облачного провайдера. См. Disaggregated Communication Guide для вариантов транспорта, конфигурации UCX и ожидаемой производительности, а также руководство вашего провайдера для инструкций по настройке:

kube-prometheus-stack

Установите Prometheus до запуска команды установки Dynamo, чтобы задать endpoint за один проход:

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring --create-namespace \
--set prometheus.prometheusSpec.podMonitorSelectorNilUsesHelmValues=false \
--set-json 'prometheus.prometheusSpec.podMonitorNamespaceSelector={}' \
--set-json 'prometheus.prometheusSpec.probeNamespaceSelector={}'

Затем раскомментируйте строку prometheusEndpoint в команде установки Dynamo. Dynamo operator автоматически создает PodMonitors для своих компонентов. См. Metrics для настройки дашборда и доступных метрик, а Logging — для стека логирования Grafana Loki + Alloy.

Shared Storage для кэширования моделей

Настройте ReadWriteMany PVC, чтобы все pod использовали общие загруженные веса модели вместо независимой загрузки каждым pod. Флаги Helm chart Dynamo не нужны — storage настраивается в спецификации развертывания. Настройка зависит от облачного провайдера:

Для крупных кластеров с частыми обновлениями моделей рассмотрите ModelExpress для P2P распределения моделей и ModelStreamer для прямой потоковой передачи из object storage. Полное описание, включая download Job, настройку mount и ModelExpress, см. в Model Caching.

Шаг 4: Проверка перед развертыванием

Запустите скрипт проверки перед развертыванием, чтобы убедиться, что кластер готов к deployment:

./deploy/pre-deployment/pre-deployment-check.sh

Он проверяет доступность kubectl, конфигурацию StorageClass по умолчанию, наличие GPU-узлов и статус GPU Operator. Подробности см. в Pre-Deployment Checks.

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

Ваш кластер готов. Следуйте Руководству по развертыванию моделей, чтобы развернуть модель с помощью DGDR.

Устранение неполадок

"VALIDATION ERROR: Cannot install cluster-wide Dynamo operator"

VALIDATION ERROR: Cannot install cluster-wide Dynamo operator.
Found existing namespace-restricted Dynamo operators in namespaces: ...

Причина: Попытка cluster-wide установки на общем кластере, где уже существуют namespace-restricted operator.

Решение: Переведите существующие namespace-restricted operator в cluster-wide mode. Namespace-restricted mode устарел.

CRD уже существуют

Причина: Установка CRD в кластере, где они уже есть (обычно на общих кластерах).

Решение: CRD устанавливаются автоматически через Helm chart. Если возникают конфликты, проверьте существующие CRD командой kubectl get crd | grep dynamo.

Pods не запускаются?

kubectl describe pod <pod-name> -n $NAMESPACE
kubectl logs <pod-name> -n $NAMESPACE

Bitnami etcd "unrecognized" image?

ERROR: Original containers have been substituted for unrecognized ones.

Добавьте в команду helm install:

--set "etcd.image.repository=bitnamilegacy/etcd" --set "etcd.global.security.allowInsecureImages=true"

Чистое удаление?

# Удалите platform
helm uninstall dynamo-platform --namespace $NAMESPACE

# Список CRD Dynamo
kubectl get crd | grep "dynamo.*nvidia.com"

# Удалите каждый CRD
kubectl delete crd <crd-name>

Дополнительно: сборка из исходников

Если вам нужно внести вклад в Dynamo или использовать последние unreleased-функции из main branch:

# 1. Задайте переменные registry
export DOCKER_SERVER=nvcr.io/nvidia/ai-dynamo/ # или ваш registry
export DOCKER_USERNAME='$oauthtoken'
export DOCKER_PASSWORD=<YOUR_NGC_CLI_API_KEY>
export IMAGE_TAG=$RELEASE_VERSION

# 2. Соберите и отправьте образ operator
cd deploy/operator
docker build -t $DOCKER_SERVER/kubernetes-operator:$IMAGE_TAG . && docker push $DOCKER_SERVER/kubernetes-operator:$IMAGE_TAG
cd -

# 3. Создайте namespace и image pull secret (только если используете private registry)
kubectl create namespace $NAMESPACE
kubectl create secret docker-registry docker-imagepullsecret \
--docker-server=$DOCKER_SERVER \
--docker-username=$DOCKER_USERNAME \
--docker-password=$DOCKER_PASSWORD \
--namespace=$NAMESPACE

# 4. Установите из локального chart
cd deploy/helm/charts
helm dep build ./platform/
helm install dynamo-platform ./platform/ \
--namespace "$NAMESPACE" \
--set "dynamo-operator.controllerManager.manager.image.repository=$DOCKER_SERVER/kubernetes-operator" \
--set "dynamo-operator.controllerManager.manager.image.tag=$IMAGE_TAG" \
--set "dynamo-operator.imagePullSecrets[0].name=docker-imagepullsecret"

Справочные материалы