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

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.

Управление моделями с помощью DynamoModel

Обзор

DynamoModel — это пользовательский ресурс Kubernetes, который представляет модель машинного обучения, развернутую в Dynamo. Он позволяет:

  • Развертывать адаптеры LoRA поверх работающих базовых моделей
  • Отслеживать конечные точки модели и их готовность во всем кластере
  • Декларативно управлять жизненным циклом модели с помощью Kubernetes

DynamoModel работает совместно с ресурсами DynamoGraphDeployment (DGD) или DynamoComponentDeployment (DCD). Если DGD/DCD разворачивают инфраструктуру инференса (pod'ы, сервисы), то DynamoModel отвечает за операции, специфичные для модели, например загрузку адаптеров LoRA.

Быстрый старт

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

Перед созданием DynamoModel вам нужны:

  1. Запущенный DynamoGraphDeployment или DynamoComponentDeployment
  2. Компоненты, настроенные с modelRef, указывающим на базовую модель
  3. Pod'ы, готовые и обслуживающие базовую модель

Полную настройку, включая конфигурацию DGD, см. в разделе Интеграция с DynamoGraphDeployment.

Развертывание адаптера LoRA

1. Создайте DynamoModel:

apiVersion: nvidia.com/v1alpha1
kind: DynamoModel
metadata:
name: my-lora
namespace: dynamo-system
spec:
modelName: my-custom-lora
baseModelName: Qwen/Qwen3-0.6B # Must match modelRef.name in your DGD
modelType: lora
source:
uri: s3://my-bucket/loras/my-lora

2. Примените и проверьте:

# Apply the DynamoModel
kubectl apply -f my-lora.yaml

# Check status
kubectl get dynamomodel my-lora

Ожидаемый вывод:

NAME TOTAL READY AGE
my-lora 2 2 30s

Вот и все. Оператор автоматически обнаруживает конечные точки и загружает LoRA.

Для подробного мониторинга состояния см. Мониторинг и операции.

Как устроен DynamoModel

Типы моделей

DynamoModel поддерживает три типа моделей:

ТипОписаниеСценарий использования
baseСсылка на существующую базовую модельОтслеживание конечных точек базовой модели (по умолчанию)
loraАдаптер LoRA, расширяющий базовую модельРазвертывание дообученных адаптеров поверх существующих моделей
adapterУниверсальный адаптер моделиБудущая расширяемость для других типов адаптеров

Большинство пользователей будут использовать lora, чтобы разворачивать дообученные модели поверх своих базовых развертываний.

Как это работает

Когда вы создаете DynamoModel, оператор:

  1. Обнаруживает конечные точки: находит все pod'ы, в которых запущен baseModelName (сопоставляя modelRef.name в DGD/DCD)
  2. Создает сервис: автоматически создает Kubernetes Service для отслеживания этих pod'ов
  3. Загружает LoRA: вызывает API загрузки LoRA на каждой конечной точке (для типа lora)
  4. Обновляет статус: сообщает, какие конечные точки готовы

Key linkage:

# DGD modelRef.name ↔ DynamoModel baseModelName must match
Worker:
modelRef:
name: Qwen/Qwen3-0.6B
---
spec:
baseModelName: Qwen/Qwen3-0.6B

Обзор конфигурации

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

ПолеОбязательноНазначениеПример
modelNameДаИдентификатор моделиmy-custom-lora
baseModelNameДаСвязь с modelRef в DGDQwen/Qwen3-0.6B
modelTypeНетТип: base/lora/adapterlora (по умолчанию: base)
source.uriДля LoRAРасположение моделиs3://bucket/path или hf://org/model

Пример минимальной конфигурации LoRA:

apiVersion: nvidia.com/v1alpha1
kind: DynamoModel
metadata:
name: my-lora
spec:
modelName: my-custom-lora
baseModelName: Qwen/Qwen3-0.6B
modelType: lora
source:
uri: s3://my-bucket/my-lora

Полные спецификации полей, правила проверки и все параметры см.: 📖 DynamoModel API Reference

Сводка статуса

Статус показывает обнаруженные конечные точки и их готовность:

kubectl get dynamomodel my-lora

Ключевые поля статуса:

  • totalEndpoints / readyEndpoints: количество обнаруженных и готовых конечных точек
  • endpoints[]: список адресов, имен pod'ов и статуса готовности
  • conditions: стандартные условия Kubernetes (EndpointsReady, ServicesFound)

Подробное использование статуса см. в разделе Мониторинг и операции ниже

Типовые сценарии

Сценарий 1: LoRA-адаптер, размещенный в S3

Разверните адаптер LoRA, хранящийся в корзине S3.

apiVersion: nvidia.com/v1alpha1
kind: DynamoModel
metadata:
name: customer-support-lora
namespace: production
spec:
modelName: customer-support-adapter-v1
baseModelName: meta-llama/Llama-3.3-70B-Instruct
modelType: lora
source:
uri: s3://my-models-bucket/loras/customer-support/v1

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

  • S3-корзина доступна из ваших pod'ов (IAM-роль или учетные данные)
  • Базовая модель meta-llama/Llama-3.3-70B-Instruct запущена через DGD/DCD

Проверка:

# Проверить, что LoRA загружена
kubectl get dynamomodel customer-support-lora -o jsonpath='{.status.readyEndpoints}'
# Should output: 2 (or your number of replicas)

# Посмотреть, какие pod'ы обслуживают модель
kubectl get dynamomodel customer-support-lora -o jsonpath='{.status.endpoints[*].podName}'

Сценарий 2: LoRA, размещенная в HuggingFace

Разверните адаптер LoRA из HuggingFace Hub.

apiVersion: nvidia.com/v1alpha1
kind: DynamoModel
metadata:
name: multilingual-lora
namespace: dynamo-system
spec:
modelName: multilingual-adapter
baseModelName: Qwen/Qwen3-0.6B
modelType: lora
source:
uri: hf://myorg/qwen-multilingual-lora@v1.0.0 # Optional: @revision

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

  • HuggingFace Hub доступен из ваших pod'ов
  • Если репозиторий приватный: токен HF настроен как secret и смонтирован в pod'ах
  • Базовая модель Qwen/Qwen3-0.6B запущена через DGD/DCD

С токеном HuggingFace:

# В вашем DGD/DCD
spec:
services:
worker:
envFromSecret: hf-token-secret # Provides HF_TOKEN env var
modelRef:
name: Qwen/Qwen3-0.6B
# ... rest of config

Сценарий 3: Несколько LoRA на одной базовой модели

Разверните несколько адаптеров LoRA поверх одного развертывания базовой модели.

---
# LoRA для поддержки клиентов
apiVersion: nvidia.com/v1alpha1
kind: DynamoModel
metadata:
name: support-lora
spec:
modelName: support-adapter
baseModelName: Qwen/Qwen3-0.6B
modelType: lora
source:
uri: s3://models/support-lora

---
# LoRA для генерации кода
apiVersion: nvidia.com/v1alpha1
kind: DynamoModel
metadata:
name: code-lora
spec:
modelName: code-adapter
baseModelName: Qwen/Qwen3-0.6B # Same base model
modelType: lora
source:
uri: s3://models/code-lora

Обе LoRA будут загружены во все pod'ы, обслуживающие Qwen/Qwen3-0.6B. Затем ваше приложение сможет направлять запросы к нужному адаптеру.

Мониторинг и операции

Проверка статуса

Quick status check:

kubectl get dynamomodel

Example output:

NAME TOTAL READY AGE
my-lora 2 2 5m
customer-lora 4 3 2h

Detailed status:

kubectl describe dynamomodel my-lora

Example output:

Name: my-lora
Namespace: dynamo-system
Spec:
Model Name: my-custom-lora
Base Model Name: Qwen/Qwen3-0.6B
Model Type: lora
Source:
Uri: s3://my-bucket/my-lora
Status:
Ready Endpoints: 2
Total Endpoints: 2
Endpoints:
Address: http://10.0.1.5:9090
Pod Name: worker-0
Ready: true
Address: http://10.0.1.6:9090
Pod Name: worker-1
Ready: true
Conditions:
Type: EndpointsReady
Status: True
Reason: EndpointsDiscovered
Events:
Type Reason Message
---- ------ -------
Normal EndpointsReady Discovered 2 ready endpoints for base model Qwen/Qwen3-0.6B

Понимание готовности

Конечная точка считается готовой, когда:

  1. Pod запущен и исправен
  2. Вызов API загрузки LoRA завершился успешно

Состояния условий:

  • EndpointsReady=True: все конечные точки готовы (полная доступность)
  • EndpointsReady=False, Reason=NotReady: готовы не все конечные точки (проверьте счетчики в сообщении)
  • EndpointsReady=False, Reason=NoEndpoints: конечные точки не найдены

Когда readyEndpoints < totalEndpoints, оператор автоматически повторяет попытку загрузки каждые 30 секунд.

Просмотр конечных точек

Получить адреса конечных точек:

kubectl get dynamomodel my-lora -o jsonpath='{.status.endpoints[*].address}' | tr ' ' '\n'

Вывод:

http://10.0.1.5:9090
http://10.0.1.6:9090

Получить имена pod'ов конечных точек:

kubectl get dynamomodel my-lora -o jsonpath='{.status.endpoints[*].podName}' | tr ' ' '\n'

Проверить готовность каждой конечной точки:

kubectl get dynamomodel my-lora -o json | jq '.status.endpoints[] | {podName, ready}'

Вывод:

{
"podName": "worker-0",
"ready": true
}
{
"podName": "worker-1",
"ready": true
}

Обновление модели

Чтобы обновить LoRA (например, развернуть новую версию):

# Edit the source URI
kubectl edit dynamomodel my-lora

# Or apply an updated YAML
kubectl apply -f my-lora-v2.yaml

Оператор обнаружит изменение и перезагрузит LoRA на всех конечных точках.

Удаление модели

kubectl delete dynamomodel my-lora

Для моделей LoRA оператор:

  1. Выгрузит LoRA из всех конечных точек
  2. Очистит связанные ресурсы
  3. Удалит ресурс DynamoModel

Развертывание базовой модели (DGD/DCD) продолжит работать в обычном режиме.

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

Конечные точки не найдены

Симптом:

status:
totalEndpoints: 0
readyEndpoints: 0
conditions:
- type: EndpointsReady
status: "False"
reason: NoEndpoints
message: "No endpoint slices found for base model Qwen/Qwen3-0.6B"

Распространенные причины:

  1. Развертывание базовой модели не запущено

    # Проверить, существуют ли pod'ы
    kubectl get pods -l nvidia.com/dynamo-component-type=worker

    Решение: Сначала разверните DGD/DCD и дождитесь готовности pod'ов.

  2. Несоответствие baseModelName

    # Проверить modelRef в вашем DGD
    kubectl get dynamographdeployment my-deployment -o yaml | grep -A2 modelRef

    Решение: Убедитесь, что baseModelName в DynamoModel точно совпадает с modelRef.name в DGD.

  3. Pod'ы не готовы

    # Проверить статус pod'ов
    kubectl get pods -l nvidia.com/dynamo-component-type=worker

    Решение: Дождитесь, пока pod'ы достигнут состояний Running и Ready.

  4. Неверный namespace Решение: Убедитесь, что DynamoModel находится в том же namespace, что и ваш DGD/DCD.

Ошибки загрузки LoRA

Symptom:

status:
totalEndpoints: 2
readyEndpoints: 0 # ← No endpoints ready despite pods existing
conditions:
- type: EndpointsReady
status: "False"
reason: NoReadyEndpoints

Распространенные причины:

  1. Источник URI недоступен

    # Проверить журналы оператора
    kubectl logs -n dynamo-system deployment/dynamo-operator-controller-manager -f | grep "Failed to load"

    Решение:

    • Для S3: проверьте права на корзину, IAM-роль и учетные данные
    • Для HuggingFace: проверьте, что токен действителен, репозиторий существует и доступен
  2. Неверный формат LoRA Решение: Убедитесь, что веса LoRA имеют формат, ожидаемый вашим backend-фреймворком (SGLang, vLLM и т. д.)

  3. Ошибки API конечной точки

    # Проверить журналы оператора на HTTP-ошибки
    kubectl logs -n dynamo-system deployment/dynamo-operator-controller-manager | grep "error"

    Решение: Проверьте журналы backend-фреймворка в worker pod'ах:

    kubectl logs worker-0
  4. Нехватка памяти Решение: Адаптерам LoRA требуется дополнительная память. Увеличьте лимиты памяти в DGD:

    resources:
    limits:
    memory: "32Gi" # Increase if needed

Статус показывает Not Ready

Symptom: Некоторые конечные точки остаются неготовыми длительное время.

Диагностика:

# Проверить, какие конечные точки не готовы
kubectl get dynamomodel my-lora -o json | jq '.status.endpoints[] | select(.ready == false)'

# Просмотреть журналы оператора для этого pod'а
kubectl logs -n dynamo-system deployment/dynamo-operator-controller-manager | grep "worker-0"

# Проверить журналы worker pod'а
kubectl logs worker-0 | tail -50

Распространенные причины:

  1. Проблемы сети: pod не может достучаться до S3/HuggingFace
  2. Ограничения ресурсов: pod уходит в OOM или подвергается throttling
  3. API конечной точки не отвечает: backend-фреймворк не обслуживает API LoRA

Когда ждать, а когда разбираться:

  • Ждать: если readyEndpoints со временем растет (LoRA загружаются постепенно)
  • Разбираться: если значение readyEndpoints не меняется более 5 минут

Просмотр событий и журналов

Проверить события:

kubectl describe dynamomodel my-lora | tail -20

Просмотреть журналы оператора:

# Следить за журналами
kubectl logs -n dynamo-system deployment/dynamo-operator-controller-manager -f

# Отфильтровать по конкретной модели
kubectl logs -n dynamo-system deployment/dynamo-operator-controller-manager | grep "my-lora"

Типовые события и сообщения:

Событие/сообщениеЗначениеДействие
EndpointsReadyВсе конечные точки готовы✅ Хорошо: полная доступность сервиса
NotReadyНе все конечные точки готовы⚠️ Проверьте число readyEndpoints - оператор повторит попытку
PartialEndpointFailureНе удалось загрузить часть конечных точекПроверьте журналы на наличие ошибок
NoEndpointsFoundPod'ы не обнаруженыУбедитесь, что DGD запущен и modelRef совпадает
EndpointDiscoveryFailedНевозможно запросить конечные точкиПроверьте RBAC-права оператора
Successfully reconciledСогласование завершено✅ Хорошо

Интеграция с DynamoGraphDeployment

В этом разделе показан полный end-to-end рабочий процесс совместного развертывания базовых моделей и адаптеров LoRA.

DynamoModel и DynamoGraphDeployment вместе обеспечивают полное развертывание модели:

  • DGD: разворачивает инфраструктуру (pod'ы, сервисы, ресурсы)
  • DynamoModel: управляет операциями, специфичными для модели (загрузка LoRA)

Связывание моделей с компонентами

Связь устанавливается через поле modelRef в вашем DGD:

Полный пример:

---
# 1. Развернуть инфраструктуру базовой модели
apiVersion: nvidia.com/v1alpha1
kind: DynamoGraphDeployment
metadata:
name: my-deployment
spec:
backendFramework: vllm
services:
Frontend:
componentType: frontend
replicas: 1
extraPodSpec:
mainContainer:
image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:latest

Worker:
# Этот modelRef создает связь с DynamoModel
modelRef:
name: Qwen/Qwen3-0.6B # ← Ключевое поле связи

componentType: worker
replicas: 2
resources:
limits:
gpu: "1"
extraPodSpec:
mainContainer:
image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:latest
args:
- --model
- Qwen/Qwen3-0.6B
- --tensor-parallel-size
- "1"

---
# 2. Развернуть адаптеры LoRA поверх
apiVersion: nvidia.com/v1alpha1
kind: DynamoModel
metadata:
name: my-lora
spec:
modelName: my-custom-lora
baseModelName: Qwen/Qwen3-0.6B # ← Должно совпадать с `modelRef.name` выше
modelType: lora
source:
uri: s3://my-bucket/loras/my-lora

Рабочий процесс развертывания

Рекомендуемый порядок:

# 1. Развернуть инфраструктуру базовой модели
kubectl apply -f my-deployment.yaml

# 2. Дождаться готовности pod'ов
kubectl wait --for=condition=ready pod -l nvidia.com/dynamo-component-type=worker --timeout=5m

# 3. Развернуть адаптеры LoRA
kubectl apply -f my-lora.yaml

# 4. Проверить, что LoRA загружена
kubectl get dynamomodel my-lora

Что происходит внутри:

ШагDGDDynamoModel
1Создает pod'ы с modelRef-
2Pod'ы переходят в состояние running и ready-
3-CR создан, обнаруживает конечные точки через автоматически созданный Service
4-Вызывает API загрузки LoRA на каждой конечной точке
5-Все конечные точки готовы ✓

Оператор автоматически выполняет все операции discovery - вручную настраивать сервисы, метки или селекторы не нужно.

API Reference

Полные спецификации полей, правила проверки и подробные определения типов см.:

📖 Dynamo CRD API Reference

Итог

DynamoModel предоставляет декларативное управление моделями для развертываний Dynamo:

Просто: развертывание LoRA в 2 шага ✅ Автоматически: обнаружение конечных точек и загрузку берет на себя оператор ✅ Наблюдаемость: подробные статусы и условия ✅ Интеграция: бесшовная работа с DynamoGraphDeployment

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