Для чистого Markdown-содержимого этой страницы добавьте
.mdк этому URL. Полный индекс документации см. по адресу https://docs.nvidia.com/dynamo/llms.txt. Полное содержимое, включая справочник API и примеры SDK, доступно по адресу https://docs.nvidia.com/dynamo/llms-full.txt.
vLLM-Omni
Dynamo поддерживает мультимодальную генерацию через бэкенд vLLM-Omni. Эта интеграция предоставляет возможности text-to-image, text-to-video, image-to-video и text-to-audio (TTS) через OpenAI-совместимые API-эндпоинты.
Требования
Предполагается, что вы знакомы с развертыванием Dynamo с vLLM, как описано в руководстве по бэкенду vLLM.
Установка
Образы контейнеров Dynamo включают vLLM-Omni, установленный заранее. Если вы используете pip install ai-dynamo[vllm], vLLM-Omni не включается автоматически, потому что соответствующий релиз еще не доступен на PyPI. Установите его отдельно из исходников, зафиксировав релиз vLLM-Omni, который соответствует установленной версии vLLM (см. страницу релизов vLLM-Omni):
pip install git+https://github.com/vllm-project/vllm-omni.git@<version>
ARM64 не поддерживается: vLLM-Omni сейчас устанавливается только в сборках
amd64. Наarm64установка пропускается на этапе сборки контейнера, и возможности vLLM-Omni недоступны.
Поддерживаемые модальности
| Модальность | Эндпоинт(ы) | --output-modalities |
|---|---|---|
| Text-to-Image | /v1/chat/completions, /v1/images/generations | image |
| Text-to-Video | /v1/videos | video |
| Image-to-Video | /v1/videos | video |
| Text-to-Audio (TTS) | /v1/audio/speech | audio |
Флаг --output-modalities определяет, какие эндпоинты регистрирует worker. Если задано image, доступны и /v1/chat/completions (возвращает встроенные изображения в base64), и /v1/images/generations. Если задано video, worker обслуживает /v1/videos. Если задано audio, worker обслуживает /v1/audio/speech.
Проверенные модели
| Модальность | Модели |
|---|---|
| Text-to-Image | Qwen/Qwen-Image, AIDC-AI/Ovis-Image-7B, zai-org/GLM-Image (disagg) |
| Text-to-Video | Wan-AI/Wan2.1-T2V-1.3B-Diffusers, Wan-AI/Wan2.2-T2V-A14B-Diffusers |
| Image-to-Video | Wan-AI/Wan2.2-TI2V-5B-Diffusers, Wan-AI/Wan2.2-I2V-A14B-Diffusers |
| Text-to-Audio (TTS) | Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice, Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign |
Чтобы запустить модель, отличную от значения по умолчанию, передайте --model в любой скрипт запуска:
bash examples/backends/vllm/launch/agg_omni_image.sh --model AIDC-AI/Ovis-Image-7B
bash examples/backends/vllm/launch/agg_omni_video.sh --model Wan-AI/Wan2.2-T2V-A14B-Diffusers
Text-to-Image
Запустите с помощью предоставленного скрипта с Qwen/Qwen-Image:
bash examples/backends/vllm/launch/agg_omni_image.sh
Через /v1/chat/completions
curl -s http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen-Image",
"messages": [{"role": "user", "content": "A cat sitting on a windowsill"}],
"stream": false
}'
Ответ включает встроенные изображения в base64:
{
"choices": [{
"delta": {
"content": [
{"type": "image_url", "image_url": {"url": "data:image/png;base64,..."}}
]
}
}]
}
Через /v1/images/generations
curl -s http://localhost:8000/v1/images/generations \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen-Image",
"prompt": "A cat sitting on a windowsill",
"size": "1024x1024",
"response_format": "url"
}'
Text-to-Video
Запустите с помощью предоставленного скрипта с Wan-AI/Wan2.1-T2V-1.3B-Diffusers:
bash examples/backends/vllm/launch/agg_omni_video.sh
Сгенерируйте видео через /v1/videos:
curl -s http://localhost:8000/v1/videos \
-H "Content-Type: application/json" \
-d '{
"model": "Wan-AI/Wan2.1-T2V-1.3B-Diffusers",
"prompt": "A drone flyover of a mountain landscape",
"seconds": 2,
"size": "832x480",
"response_format": "url"
}'
В зависимости от response_format ответ возвращает URL на видео или данные base64:
{
"id": "...",
"object": "video",
"model": "Wan-AI/Wan2.1-T2V-1.3B-Diffusers",
"status": "completed",
"data": [{"url": "file:///tmp/dynamo_media/videos/req-abc123.mp4"}]
}
Эндпоинт /v1/videos также принимает расширения NVIDIA через поле nvext для точной настройки:
| Поле | Описание | Значение по умолчанию |
|---|---|---|
nvext.fps | Frames per second | 24 |
nvext.num_frames | Number of frames (overrides fps * seconds) | -- |
nvext.negative_prompt | Negative prompt for guidance | -- |
nvext.num_inference_steps | Number of denoising steps | 50 |
nvext.guidance_scale | CFG guidance scale | 5.0 |
nvext.seed | Random seed for reproducibility | -- |
nvext.boundary_ratio | MoE expert switching boundary (I2V) | 0.875 |
nvext.guidance_scale_2 | CFG scale for low-noise expert (I2V) | 1.0 |
Image-to-Video
Image-to-video (I2V) использует тот же эндпоинт /v1/videos, что и text-to-video, но с дополнительным полем input_reference, которое задает исходное изображение. Изображение может быть HTTP URL, base64 data URI или локальным путем к файлу.
Запустите с помощью предоставленного скрипта, используя Wan-AI/Wan2.2-TI2V-5B-Diffusers:
bash examples/backends/vllm/launch/agg_omni_i2v.sh
Сгенерируйте видео по изображению:
curl -s http://localhost:8000/v1/videos \
-H "Content-Type: application/json" \
-d '{
"model": "Wan-AI/Wan2.2-TI2V-5B-Diffusers",
"prompt": "A bear playing with yarn, smooth motion",
"input_reference": "https://example.com/bear.png",
"size": "832x480",
"response_format": "url",
"nvext": {
"num_inference_steps": 40,
"num_frames": 33,
"guidance_scale": 1.0,
"boundary_ratio": 0.875,
"guidance_scale_2": 1.0,
"seed": 42
}
}'
Поле input_reference принимает:
- HTTP/HTTPS URL:
"https://example.com/image.png" - Base64 data URI:
"data:image/png;base64,iVBORw0KGgo..." - Локальный путь к файлу:
"/path/to/image.png"или"file:///path/to/image.png"
Поля nvext, специфичные для I2V (boundary_ratio, guidance_scale_2), управляют схемой двухэкспертного MoE-денойзинга в моделях Wan2.x. Подробности см. в карточке модели Wan2.2-I2V.
Text-to-Audio (TTS)
Запустите с помощью предоставленного скрипта с Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice:
bash examples/backends/vllm/launch/agg_omni_audio.sh
CustomVoice (предопределенные дикторы)
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "Hello, how are you?",
"voice": "vivian",
"language": "English"
}' --output output.wav
CustomVoice с инструкциями по стилю
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "I am so excited!",
"voice": "vivian",
"instructions": "Speak with great enthusiasm"
}' --output excited.wav
VoiceDesign (описание голоса)
bash examples/backends/vllm/launch/agg_omni_audio.sh --model Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign
curl -X POST http://localhost:8000/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"input": "Hello world",
"task_type": "VoiceDesign",
"instructions": "A warm, friendly female voice with a gentle tone"
}' --output voicedesign.wav
Параметры
Эндпоинт /v1/audio/speech следует формату API vLLM-Omni. Все параметры, специфичные для TTS, задаются на верхнем уровне:
| Поле | Описание | Значение по умолчанию |
|---|---|---|
input | Текст для синтеза (обязательно) | -- |
model | Имя TTS-модели | определяется автоматически |
voice | Имя диктора (например, vivian, ryan). Проверяется по конфигурации модели. | Vivian |
response_format | Формат аудио: wav, mp3, pcm, flac, aac, opus | wav |
speed | Коэффициент скорости (0.25-4.0) | 1.0 |
task_type | CustomVoice, VoiceDesign или Base (Qwen3-TTS) | CustomVoice |
language | Код языка. Проверяется по конфигурации модели. | Auto |
instructions | Описание стиля/эмоции голоса. Обязательно для VoiceDesign. | -- |
ref_audio | URL или base64 data URI с эталонным аудио. Обязательно для Base. | -- |
ref_text | Транскрипт эталонного аудио (задача Base) | -- |
max_new_tokens | Максимальное число токенов для генерации (1-4096) | 2048 |
Доступные голоса и языки загружаются динамически из config.json модели при запуске. Аудиомодели, отличные от Qwen3-TTS, например MiMo-Audio, используют универсальный текстовый prompt и игнорируют параметры, специфичные для TTS.
Справка по CLI
Omni backend использует отдельную точку входа: python -m dynamo.vllm.omni.
| Флаг | Описание |
|---|---|
--omni | Включить orchestrator vLLM-Omni (обязательно для всех omni workloads) |
--output-modalities <modality> | Выходная модальность: text, image, video или audio |
--stage-configs-path <path> | Путь к YAML-конфигу стадий (необязательно; если не указан, vLLM-Omni использует значения по умолчанию модели) |
--boundary-ratio <float> | Граница переключения экспертов MoE (по умолчанию: 0.875) |
--flow-shift <float> | flow_shift планировщика (5.0 для 720p, 12.0 для 480p) |
--vae-use-slicing | Включить slicing для VAE в целях экономии памяти |
--vae-use-tiling | Включить tiling для VAE в целях экономии памяти |
--default-video-fps <int> | Частота кадров по умолчанию для сгенерированных видео (по умолчанию: 16) |
--enable-layerwise-offload | Включить послойный offloading на модулях DiT, чтобы снизить расход GPU-памяти |
--layerwise-num-gpu-layers <int> | Количество готовых слоев, которые нужно держать на GPU во время генерации (по умолчанию: 1) |
--cache-backend <backend> | Diffusion cache: cache_dit или tea_cache |
--cache-config <json> | Конфигурация кэша в виде JSON-строки (переопределяет значения по умолчанию) |
--enable-cache-dit-summary | Включить логирование summary для cache-dit после прямых проходов diffusion |
--enforce-eager | Отключить torch.compile для diffusion-моделей |
--enable-cpu-offload | Включить CPU offloading для diffusion-моделей |
--ulysses-degree <int> | GPU для Ulysses sequence parallelism в diffusion (по умолчанию: 1) |
--ring-degree <int> | GPU для ring sequence parallelism в diffusion (по умолчанию: 1) |
--cfg-parallel-size <int> | GPU для параллелизма classifier-free guidance (1 или 2, по умолчанию: 1) |
--media-output-fs-url <url> | URL файловой системы для хранения сгенерированных медиа (по умолчанию: file:///tmp/dynamo_media) |
--media-output-http-url <url> | Базовый URL для переписывания путей к медиа в ответах (необязательно) |
Конфигурация хранилища
Сгенерированные изображения, видео и аудиофайлы сохраняются через fsspec, который поддерживает локальные файловые системы, S3, GCS и Azure Blob.
По умолчанию медиа записывается в локальную файловую систему по пути file:///tmp/dynamo_media. Чтобы использовать облачное хранилище:
bash examples/backends/vllm/launch/agg_omni_video.sh \
--media-output-fs-url s3://my-bucket/media \
--media-output-http-url https://cdn.example.com/media
Если задан --media-output-http-url, URL в ответах переписываются в вид {base-url}/{storage-path} (например, https://cdn.example.com/media/videos/req-id.mp4). Если параметр не задан, возвращается исходный путь в файловой системе.
Для настройки учетных данных S3 задайте стандартные переменные окружения AWS (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) или используйте IAM roles. Подробности см. в документации fsspec по S3.
Конфигурация стадий
Omni pipelines настраиваются через YAML-конфиги стадий. По умолчанию vLLM-Omni поставляется со встроенными stage configs для поддерживаемых моделей, поэтому --stage-configs-path не нужен, если вы не хотите переопределить значения по умолчанию. Полную документацию по формату stage config и многостадийным pipeline см. в документации vLLM-Omni Stage Configs.
Раздельное многостадийное обслуживание
Для моделей с несколькими стадиями pipeline, например AR + Diffusion, Dynamo поддерживает disaggregated serving, при котором каждая стадия запускается как независимый процесс на собственной GPU. Это дает независимое масштабирование, изоляцию GPU и несколько worker replicas на каждую стадию.
Архитектура
Каждая стадия запускается как независимый процесс на собственной GPU. Легковесный router координирует их, работая как чистый message broker — он никогда не просматривает и не преобразует данные между стадиями.
flowchart LR
client(Client) --> frontend(Frontend)
frontend --> router(Router)
router -->|request| s0(Stage 0)
s0 -->|ref| router
router -->|ref| s1(Stage 1)
s1 -->|result| router
router --> frontend --> client
s0 <-->|bulk data| conn[(Connector)]
conn <--> s1
Как это работает:
- Router отправляет исходный запрос на Stage 0 и получает обратно легковесную ссылку connector (указатель на выход в shared memory).
- Router пересылает эту ссылку в Stage 1 без изменений. Он никогда не читает bulk data.
- Каждая стадия получает входные данные из connector, запускает любой специфичный для модели processor, например
ar2diffusionилиthinker2talker, а затем запускает свой engine. - Результат последней стадии возвращается в router для форматирования ответа.
- Ссылки connector накапливаются по мере продвижения pipeline, поэтому любая стадия может получить доступ к результатам всех предыдущих стадий.
Поток данных
sequenceDiagram
participant C as Client
participant R as Router
participant S0 as Stage 0 (AR)
participant SHM as Connector
participant S1 as Stage 1 (DiT)
C->>R: POST /v1/images/generations
R->>S0: request + prompt
S0->>SHM: store output
S0-->>R: connector ref
R->>S1: connector ref (opaque)
S1->>SHM: fetch output
S1->>S1: processor → engine
S1-->>R: result
R-->>C: {"data": [...]}
Быстрый старт: GLM-Image (2 стадии, 2 GPU)
GLM-Image — это двухстадийная модель text-to-image со стадией AR (генерирует идентификаторы предыдущих токенов) и стадией DiT (diffusion denoising + VAE decode). Встроенный stage config vLLM-Omni уже назначает каждую стадию на отдельную GPU.
Экспериментально: поддержка GLM-Image находится в экспериментальном состоянии; генерация может завершиться неудачей или вернуть некорректные/искаженные результаты для некоторых prompt и размеров.
bash examples/backends/vllm/launch/disagg_omni_glm_image.sh
Проверка:
curl -s http://localhost:8000/v1/images/generations \
-H "Content-Type: application/json" \
-d '{
"model": "zai-org/GLM-Image",
"prompt": "A red apple on a white table",
"size": "1024x1024",
"response_format": "url"
}' | jq
Масштабирование реплик стадий
Каждая стадия регистрируется независимо в service discovery Dynamo. Чтобы масштабировать узкое место, запустите дополнительные worker с тем же --stage-id на других GPU — router автоматически распределяет нагрузку между всеми репликами этой стадии. Остальные стадии не затрагиваются.
Проверенные модели
| Модель | Стадии | Выход | Stage Config |
|---|---|---|---|
GLM-Image (zai-org/GLM-Image) | AR -> DiT | Image | glm_image.yaml (built-in) |
Флаги CLI (режим Disaggregated)
| Флаг | Описание |
|---|---|
--stage-id <int> | Запустить как одностадийный worker для заданного ID стадии. Требует --stage-configs-path. |
--omni-router | Запустить как router стадий. Требует --stage-configs-path. Взаимоисключающий с --stage-id. |
--stage-configs-path <path> | Путь к YAML-конфигурации стадий vLLM-Omni. |
Текущие ограничения
- Входное изображение поддерживается только для I2V через
input_referenceв/v1/videos. Другие эндпоинты принимают только текстовые prompt. - События KV cache не публикуются для omni worker.
- Каждый worker за раз поддерживает только одну выходную модальность.
- Audio: streaming (
stream: true) пока не поддерживается. - Audio: задача Base (voice cloning) пока не поддерживается.
- Режим Disaggregated:
async_chunk=true(streaming между стадиями) пока не поддерживается.