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

Для чистого 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/generationsimage
Text-to-Video/v1/videosvideo
Image-to-Video/v1/videosvideo
Text-to-Audio (TTS)/v1/audio/speechaudio

Флаг --output-modalities определяет, какие эндпоинты регистрирует worker. Если задано image, доступны и /v1/chat/completions (возвращает встроенные изображения в base64), и /v1/images/generations. Если задано video, worker обслуживает /v1/videos. Если задано audio, worker обслуживает /v1/audio/speech.

Проверенные модели

МодальностьМодели
Text-to-ImageQwen/Qwen-Image, AIDC-AI/Ovis-Image-7B, zai-org/GLM-Image (disagg)
Text-to-VideoWan-AI/Wan2.1-T2V-1.3B-Diffusers, Wan-AI/Wan2.2-T2V-A14B-Diffusers
Image-to-VideoWan-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.fpsFrames per second24
nvext.num_framesNumber of frames (overrides fps * seconds)--
nvext.negative_promptNegative prompt for guidance--
nvext.num_inference_stepsNumber of denoising steps50
nvext.guidance_scaleCFG guidance scale5.0
nvext.seedRandom seed for reproducibility--
nvext.boundary_ratioMoE expert switching boundary (I2V)0.875
nvext.guidance_scale_2CFG 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, opuswav
speedКоэффициент скорости (0.25-4.0)1.0
task_typeCustomVoice, VoiceDesign или Base (Qwen3-TTS)CustomVoice
languageКод языка. Проверяется по конфигурации модели.Auto
instructionsОписание стиля/эмоции голоса. Обязательно для VoiceDesign.--
ref_audioURL или 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 -> DiTImageglm_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 между стадиями) пока не поддерживается.