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

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.

Адаптеры LoRA

LoRA (Low-Rank Adaptation) позволяет эффективно дообучать и обслуживать специализированные варианты моделей без дублирования полных весов модели. Dynamo имеет встроенную поддержку динамической загрузки адаптеров LoRA, кэширования и маршрутизации инференса.

Поддержка backend'ов

BackendСтатусПримечания
vLLMПолная поддержка, включая маршрутизацию с учетом KV
SGLang🚧В процессе
TensorRT-LLMПока не поддерживается

Полные сведения о совместимости см. в Feature Matrix.

Обзор

Реализация LoRA в Dynamo обеспечивает:

  • Динамическую загрузку: загружать и выгружать адаптеры LoRA во время работы, без перезапуска worker'ов
  • Несколько источников: загрузка из локальной файловой системы (file://), S3-совместимого хранилища (s3://) или Hugging Face Hub (hf://)
  • Автоматическое кэширование: загруженные адаптеры кэшируются локально, чтобы избежать повторных загрузок
  • Интеграцию с discovery: загруженные LoRA автоматически регистрируются и доступны через /v1/models
  • Маршрутизацию с учетом KV: запросы направляются к worker'ам, на которых загружен нужный адаптер LoRA
  • Нативную поддержку Kubernetes: декларативное управление LoRA через CRD DynamoModel

Architecture

flowchart TD
Frontend["Frontend"] --> Router["Router<br/>(LoRA-aware)"]
Router --> Workers["Workers<br/>(LoRA-loaded)"]
Workers --> ManagerNode["LoRA Manager"]

subgraph ManagerGroup["LoRA Manager"]
Downloader
Cache
end

ManagerNode --> Local["file://<br/>Local"]
ManagerNode --> S3["s3://<br/>S3/MinIO"]
ManagerNode --> HF["hf://<br/>(custom)"]

Система LoRA состоит из:

  • Rust Core (lib/llm/src/lora/): высокопроизводительная загрузка, кэширование и валидация
  • Python Manager (components/src/dynamo/common/lora/): расширяемая обертка с поддержкой пользовательских источников
  • Worker Handlers (components/src/dynamo/vllm/handlers.py): API загрузки/выгрузки и интеграция с инференсом

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

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

  • Dynamo установлен с поддержкой vLLM
  • Для источников S3: настроены AWS credentials
  • Адаптер LoRA, совместимый с вашей базовой моделью

Локальная разработка

1. Запустите Dynamo с поддержкой LoRA:

# Запустить worker vLLM с флагами LoRA
DYN_SYSTEM_ENABLED=true DYN_SYSTEM_PORT=8081 \
python -m dynamo.vllm --model Qwen/Qwen3-0.6B --enforce-eager \
--enable-lora \
--max-lora-rank 64

2. Загрузите адаптер LoRA:

curl -X POST http://localhost:8081/v1/loras \
-H "Content-Type: application/json" \
-d '{
"lora_name": "my-lora",
"source": {
"uri": "file:///path/to/my-lora"
}
}'

3. Выполните инференс с LoRA:

curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "my-lora",
"messages": [{"role": "user", "content": "Hello!"}],
"max_tokens": 100
}'

S3-совместимое хранилище

Для промышленного развертывания храните адаптеры LoRA в S3-совместимом хранилище:

# Настроить S3 credentials
export AWS_ACCESS_KEY_ID=your-access-key
export AWS_SECRET_ACCESS_KEY=your-secret-key
export AWS_ENDPOINT=http://minio:9000 # For MinIO
export AWS_REGION=us-east-1

# Загрузить LoRA из S3
curl -X POST http://localhost:8081/v1/loras \
-H "Content-Type: application/json" \
-d '{
"lora_name": "customer-support-lora",
"source": {
"uri": "s3://my-loras/customer-support-v1"
}
}'

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

Переменные окружения

ПеременнаяОписаниеЗначение по умолчанию
DYN_LORA_ENABLEDEnable LoRA adapter supportfalse
DYN_LORA_PATHLocal cache directory for downloaded LoRAs~/.cache/dynamo_loras
AWS_ACCESS_KEY_IDS3 access key (for s3:// URIs)-
AWS_SECRET_ACCESS_KEYS3 secret key (for s3:// URIs)-
AWS_ENDPOINTCustom S3 endpoint (for MinIO, etc.)-
AWS_REGIONAWS regionus-east-1
AWS_ALLOW_HTTPAllow HTTP (non-TLS) connectionsfalse

Аргументы vLLM

АргументОписание
--enable-loraEnable LoRA adapter support in vLLM
--max-lora-rankMaximum LoRA rank (must be >= your LoRA's rank)
--max-lorasMaximum number of LoRAs to load simultaneously

Справочник backend API

Загрузка LoRA

Загрузить адаптер LoRA из URI источника.

POST /v1/loras

Запрос:

{
"lora_name": "string",
"source": {
"uri": "string"
}
}

Ответ:

{
"status": "success",
"message": "LoRA adapter 'my-lora' loaded successfully",
"lora_name": "my-lora",
"lora_id": 1207343256
}

Список LoRA

Список всех загруженных адаптеров LoRA.

GET /v1/loras

Response:

{
"status": "success",
"loras": {
"my-lora": 1207343256,
"another-lora": 987654321
},
"count": 2
}

Выгрузка LoRA

Выгрузить адаптер LoRA из worker'а.

DELETE /v1/loras/{lora_name}

Response:

{
"status": "success",
"message": "LoRA adapter 'my-lora' unloaded successfully",
"lora_name": "my-lora",
"lora_id": 1207343256
}

Развертывание в Kubernetes

Для развертываний в Kubernetes используйте пользовательский ресурс DynamoModel для декларативного управления адаптерами LoRA.

CRD DynamoModel

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

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

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

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

Проверка развертывания

# Проверить статус LoRA
kubectl get dynamomodel customer-support-lora

# Ожидаемый вывод:
# NAME TOTAL READY AGE
# customer-support-lora 2 2 30s

Полные сведения о развертывании в Kubernetes см.:

Примеры

ПримерОписание
Local LoRA with MinIOLocal development with S3-compatible storage
Kubernetes LoRA DeploymentProduction deployment with DynamoModel CRD

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

LoRA не загружается

Проверьте доступность S3:

# Verify LoRA exists in S3
aws --endpoint-url=$AWS_ENDPOINT s3 ls s3://my-loras/ --recursive

Проверьте каталог кэша:

ls -la ~/.cache/dynamo_loras/

Проверьте журналы worker'ов:

# Look for LoRA-related messages
kubectl logs deployment/my-worker | grep -i lora

Модель не найдена после загрузки

  • Убедитесь, что имя LoRA совпадает точно, с учетом регистра
  • Проверьте, что LoRA присутствует в списке: curl http://localhost:8081/v1/loras
  • Убедитесь, что регистрация discovery прошла успешно (проверьте журналы worker'ов)

Инференс возвращает ответ базовой модели

  • Убедитесь, что поле model в вашем запросе совпадает с lora_name
  • Проверьте, что LoRA загружена на worker, обрабатывающий ваш запрос
  • Для разнесенного serving убедитесь, что LoRA есть и у prefill-, и у decode-worker'ов

Маршрутизация LoRA с учетом KV-кэша

Когда включена маршрутизация с учетом KV, маршрутизатор автоматически учитывает идентичность адаптера LoRA при вычислении хэшей блоков. Это означает:

  • Отдельные пространства хэшей для каждого адаптера: блоки, закэшированные под адаптером A, никогда не будут перепутаны с блоками под адаптером B или базовой моделью, даже если последовательности токенов одинаковы. Имя адаптера подмешивается в вычисление LocalBlockHash.
  • Автоматическое совместное использование префиксов внутри одного адаптера: запросы к одному и тому же адаптеру LoRA получают выгоду от сопоставления префиксов в KV-кэше так же, как и запросы к базовой модели.
  • Никакой настройки не требуется: имя LoRA автоматически передается через KV-события (BlockStored) от engine к маршрутизатору. Маршрутизатор использует поле lora_name в событиях, чтобы направлять запросы LoRA к worker'ам с совпадающими закэшированными блоками.

Это работает end-to-end во всей цепочке: publisher pipeline, KV consolidator (для дедупликации) и путь routing query.

См. также