vLLM-Omni 深度研究:
使用方法完全指南
项目介绍、安装、核心 API、CLI、API 服务器、扩散模型、多阶段 LLM
2. 安装与入门
2.1 三种安装方式对比
| 方式 | 命令 | 适用场景 | 版本 | 来源验证 |
|---|---|---|---|---|
| pip 安装 (预编译 wheels) |
pip install vllm-omni |
快速部署、生产环境 | 稳定版 | A / C |
| 源码安装 | git clone && pip install -e . |
开发调试、尝鲜最新特性 | 最新 | A / B / C |
| Docker 部署 | docker pull vllm/vllm-omni |
容器化生产部署 | 稳定版 | C |
| 显式设备安装 | VLLM_OMNI_TARGET_DEVICE=rocm pip install vllm-omni |
AMD / NPU / CPU 等非 CUDA 设备 | 稳定版 | C |
推荐: 生产环境优先使用 pip install vllm-omni;开发调试使用源码安装。
2.2 系统要求
| 要求 | 说明 |
|---|---|
| 操作系统 | Linux(推荐,不支持原生 Windows) |
| Python | 3.10 – 3.13(推荐 3.12) |
| GPU (CUDA) | 计算能力 7.0+(V100, T4, RTX20xx, A100, L4, H100) |
| GPU (ROCm) | 已验证 gfx942 (MI300) |
| NPU | 华为 Ascend (CANN) |
2.3 快速入门三步走
步骤 1 — 安装
pip install vllm-omni
步骤 2 — Python API 调用(离线推理)
# 创建编排器并执行推理
from vllm_omni import Omni
omni = Omni(model="Qwen/Qwen3-Omni-30B-A3B-Instruct", omni=True)
outputs = omni.generate({"prompt": "你好,请介绍一下自己"})
print(outputs)
步骤 3 — 启动在线服务
# 通过 CLI 启动 OpenAI 兼容 API 服务
vllm serve Qwen/Qwen3-Omni-30B-A3B-Instruct --omni --port 8091
官方文档明确指出,Qwen2.5-Omni 需要使用特定的 vLLM 分支
qwen2_omni_public_v1,不能直接使用标准 vLLM-Omni。
本报告在 Web 搜索结果和源码分析中均未发现此限制,这是一个可能导致用户踩坑
的重要信息。如果计划使用 Qwen2.5-Omni,请务必确认已切换到正确分支。
3. 核心 API 使用(Omni / AsyncOmni)
3.1 架构层次
三源交叉验证确认的一致架构层次:
3.2 Omni(同步编排器)vs AsyncOmni(异步编排器)
| 对比维度 | Omni | AsyncOmni | 来源 |
|---|---|---|---|
| 主要用途 | 离线批处理、CLI 工具 | 在线 serving、FastAPI 集成 | A / B / C |
| 接口类型 | 同步 Generator | 异步 AsyncGenerator | B / C |
| 请求处理 | 批量(多个 prompts) | 单请求每次调用 | A / B |
| 输出模式 | 强制 FINAL_ONLY | 支持流式增量 | B |
| 请求取消 | 不支持 | abort() 方法 |
A / B |
| 暂停 / 恢复 | 不支持 | pause_generation() / resume_generation() |
B / C |
| 进度条 | use_tqdm 参数 |
无 | B |
| 引擎交互 | 轮询 try_get_output() |
异步通知 AsyncOmniEngine | B |
3.3 Omni.generate() 参数详解
# 函数签名 def generate( self, prompts: OmniPromptType | Sequence[OmniPromptType], # 输入类型 sampling_params_list: OmniSamplingParams | Sequence[OmniSamplingParams] | None = None, *, py_generator: bool = False, # True=流式, False=批量 use_tqdm: bool | Callable = True, # 进度条 ) -> Generator[OmniRequestOutput, None, None] | list[OmniRequestOutput]:
| 参数 | 类型 | 说明 |
|---|---|---|
prompts | OmniPromptType | Sequence[OmniPromptType] | 单个提示或批量提示。支持文本字符串或多模态字典。 |
sampling_params_list | OmniSamplingParams | Sequence[...] | None | 采样参数,可单组或按 prompt 分别指定。 |
py_generator | bool | True 时返回流式 Generator;False 时一次性返回列表。 |
use_tqdm | bool | Callable | 是否显示进度条(默认启用),亦可传入自定义回调。 |
3.4 AsyncOmni.generate() 参数详解
# 函数签名 async def generate( self, prompt: OmniPromptType | AsyncGenerator[StreamingInput, None] | list[OmniPromptType], sampling_params: Any = None, request_id: str = "", *, prompt_text: str | None = None, lora_request: Any = None, tokenization_kwargs: dict[str, Any] | None = None, sampling_params_list: Sequence[OmniSamplingParams] | None = None, output_modalities: list[str] | None = None, # 如 ["text", "audio"] trace_headers: Mapping[str, str] | None = None, priority: int = 0, data_parallel_rank: int | None = None, reasoning_ended: bool | None = None, ) -> AsyncGenerator[OmniRequestOutput, None]:
3.5 多模态输入格式
Prompt 字典结构,支持文本、图像、音频、视频的任意组合:
prompt = {
# 文本提示(含对话模板标记)
"prompt": "<|im_start|>system\n...<|im_end|>\n"
"<|im_start|>user\n...<|im_end|>\n"
"<|im_start|>assistant\n",
# 多模态数据
"multi_modal_data": {
"image": pil_image, # PIL.Image (RGB)
"audio": (audio_signal, sr), # Tuple[np.ndarray, int]
"video": video_frames, # np.ndarray
},
# 输出模态控制
"modalities": ["text", "audio"],
# 多模态处理器参数
"mm_processor_kwargs": {
"use_audio_in_video": True,
},
# 扩散模型专用:负提示词
"negative_prompt": "...",
# 每 prompt 模态数量限制
"limit_mm_per_prompt": {"image": 1, "audio": 1, "video": 1},
}
3.6 输出数据结构
OmniRequestOutput 包含 17 个核心字段:
@dataclass
class OmniRequestOutput:
request_id: str
finished: bool
stage_id: int | None
final_output_type: str # "text" | "image" | "audio" | "latents"
request_output: RequestOutput | None # 管道模式输出
images: list[Image.Image] # 扩散模式输出
prompt: OmniPromptType | None
latents: torch.Tensor | None
trajectory_latents: torch.Tensor | None
trajectory_timesteps: torch.Tensor | None
metrics: dict[str, Any]
stage_durations: dict[str, float]
peak_memory_mb: float
error: str | None
便利属性(由核心字段派生): multimodal_output、custom_output、num_images、is_diffusion_output、is_pipeline_output。
3.7 采样参数类型
| 阶段类型 | 参数类 | 来源 |
|---|---|---|
| LLM 阶段 | vllm.sampling_params.SamplingParams |
A / B / C |
| 扩散阶段 | vllm_omni.inputs.data.OmniDiffusionSamplingParams |
A / B |
OmniDiffusionSamplingParams 参数说明
| 参数 | 说明 |
|---|---|
height / width | 图像尺寸(像素) |
num_inference_steps | 去噪步数 |
guidance_scale | CFG 引导系数 |
true_cfg_scale | Qwen-Image 专用引导系数 |
generator | torch.Generator(随机种子控制) |
num_outputs_per_prompt | 每 prompt 输出数量 |
extra_args | 附加参数(timesteps_shift、lora_request 等) |
4. CLI 命令行详解
4.1 命令入口
CLI 入口位于 vllm_omni/entrypoints/cli/main.py,通过 --omni 标志触发 Omni 模式。当未检测到 --omni 时,拦截器将命令转发给标准 vLLM CLI。
vllm serve Qwen/Qwen3-Omni-30B-A3B-Instruct --omni
子命令:serve、benchmark。
4.2 参数分类速查
基础服务参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--omni | flag | false | 启用 Omni 模式(必选) |
--port | int | 8000 | HTTP 服务端口 |
--host | str | localhost | 监听地址 |
--task-type | str | None | TTS 类型: CustomVoice / VoiceDesign / Base |
阶段配置参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--stage-configs-path | str | None | [已废弃] 阶段配置 YAML 路径 |
--deploy-config | str | None | 新格式部署配置 YAML 路径 |
--stage-overrides | JSON | None | 逐阶段 JSON 覆盖 |
--async-chunk | bool | None | 覆盖部署 YAML 的 async_chunk |
--stage-id | int | None | 选择启动单个阶段(headless) |
--stage-init-timeout | int | 300 | 单阶段初始化超时(秒) |
--init-timeout | int | 600 | 总初始化超时(秒) |
分布式参数
| 参数 | 缩写 | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
--worker-backend | - | str | multi_process | multi_process / ray |
--ray-address | - | str | None | Ray 集群地址 |
--omni-master-address | -oma | str | None | 编排器主机名 |
--omni-master-port | -omp | int | None | 编排器端口 |
--shm-threshold-bytes | - | int | 65536 | 共享内存阈值 |
--headless | - | flag | - | 无头模式 |
扩散模型并行参数
| 参数 | 别名 | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
--num-gpus | - | int | None | 扩散 GPU 数量 |
--usp | --ulysses-degree | int | 1 | Ulysses 序列并行度 |
--ulysses-mode | - | str | strict | Ulysses 模式 |
--ring | --ring-degree | int | 1 | 环形序列并行度 |
--cfg-parallel-size | - | int | 1 | CFG 并行度(1 或 2) |
--tensor-parallel-size | - | int | 1 | 张量并行度 |
--vae-patch-parallel-size | - | int | 1 | VAE Patch 并行度 |
--use-hsdp | - | flag | false | 启用混合分片数据并行 |
--hsdp-shard-size | - | int | -1 | 分片 GPU 数(-1 = auto) |
--hsdp-replicate-size | - | int | 1 | 副本组数 |
缓存优化参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--cache-backend | str | none | tea_cache / cache_dit / none |
--cache-config | JSON | None | 缓存配置 JSON |
--enable-cache-dit-summary | flag | false | 启用 Cache-DiT 统计 |
--step-execution | flag | false | 逐步扩散执行 |
--enable-sleep-mode | flag | false | 睡眠模式 GPU 内存池 |
内存优化参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--vae-use-slicing | flag | false | VAE 切片(防 OOM) |
--vae-use-tiling | flag | false | VAE 平铺(防 OOM) |
--enable-cpu-offload | flag | false | CPU 卸载 |
--enable-layerwise-offload | flag | false | 逐层 DiT 卸载 |
视频模型参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--boundary-ratio | float | None | 视频高低 DiT 分割比 |
--flow-shift | float | None | 调度器 flow_shift |
4.3 常用 CLI 命令示例
# 1. 启动文本/多模态 LLM 服务
vllm serve Qwen/Qwen3-Omni-30B-A3B-Instruct --omni --port 8091
# 2. 启动文生图服务
vllm serve Qwen/Qwen-Image --omni --port 8091
# 3. 启动文生视频服务(Wan2.2)
vllm serve Wan-AI/Wan2.2-T2V-A14B-Diffusers --omni --port 8098 \
--boundary-ratio 0.875 --flow-shift 5.0
# 4. 启动 TTS 服务
vllm-omni serve Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice \
--deploy-config vllm_omni/deploy/qwen3_tts.yaml \
--host 0.0.0.0 --port 8091 --gpu-memory-utilization 0.9 \
--trust-remote-code --omni
# 5. 多 GPU 并行扩散模型
vllm serve Qwen/Qwen-Image --omni \
--num-gpus 4 \
--tensor-parallel-size 2 \
--ulysses-degree 2 \
--cfg-parallel-size 2 \
--use-hsdp
# 6. Headless 模式(运行单个阶段)
vllm serve Qwen/Qwen2.5-Omni-7B --omni --headless --stage-id 0 \
--omni-master-address 192.168.1.10 --omni-master-port 50051
5. OpenAI 兼容 API
5.1 完整端点列表
| 端点 | 方法 | 功能 | 适用模式 |
|---|---|---|---|
/v1/chat/completions | POST | 文本/多模态聊天 | 所有模式 |
/v1/images/generations | POST | 文生图(DALL-E 兼容) | Diffusion / Multi-stage |
/v1/images/edits | POST | 图生图编辑 | Diffusion / Multi-stage |
/v1/videos/generations | POST | 视频生成 | Diffusion |
/v1/audio/speech | POST | 文本转语音 (TTS) | LLM / Multi-stage |
/v1/audio/speech/batch | POST | 批量语音生成 | LLM |
/v1/audio/generate | POST | 音频生成 | Diffusion |
/health | GET | 健康检查 | 所有模式 |
/v1/models | GET | 列出可用模型 | 所有模式 |
5.2 Chat Completions API 详解
文本对话
curl -s http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen2.5-Omni-7B",
"messages": [{"role": "user", "content": "What is 2+2?"}],
"max_tokens": 50,
"stream": false
}'
多模态输入
支持 image_url、audio_url、video_url、text 四种内容类型。
{
"model": "Qwen/Qwen3-Omni-30B-A3B-Instruct",
"messages": [
{"role": "system", "content": [{"type": "text", "text": "You are Qwen, a virtual human..."}]},
{"role": "user", "content": [
{"type": "audio_url", "audio_url": {"url": "https://example.com/audio.wav"}},
{"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,XXXXX"}},
{"type": "text", "text": "What is this content?"}
]}
],
"modalities": ["text", "audio"],
"stream": false
}
Omni 扩展参数
| 参数 | 位置 | 类型 | 说明 |
|---|---|---|---|
modalities | 请求体 | list[str] | 输出模态: ["text"], ["audio"], ["text","audio"] |
speaker | extra_body | string | TTS 说话人选择 |
mm_processor_kwargs | extra_body | dict | 多模态处理器参数 |
stream | 请求体 | bool | 启用流式输出 |
5.3 图像生成 API (DALL-E 兼容)
curl 示例
curl -X POST http://localhost:8091/v1/images/generations \
-H "Content-Type: application/json" \
-d '{
"prompt": "a dragon laying over the spine of the Green Mountains of Vermont",
"size": "1024x1024",
"n": 1,
"seed": 42,
"num_inference_steps": 30,
"guidance_scale": 7.5,
"response_format": "b64_json"
}'
参数说明
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
prompt | string | 必填 | 图像描述 |
size | string | 模型默认 | 如 "1024x1024" |
n | int | 1 | 生成数量 (1-10) |
response_format | string | "b64_json" | 仅支持 b64_json |
negative_prompt | string | null | 负面提示 |
num_inference_steps | int | 模型默认 | 扩散步数 |
guidance_scale | float | 模型默认 | CFG 引导尺度 |
true_cfg_scale | float | 模型默认 | True CFG 尺度 |
seed | int | null | 随机种子 |
Python SDK 示例
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8091/v1", api_key="EMPTY")
response = client.images.generate(
model="Qwen/Qwen-Image",
prompt="A cat sitting on a windowsill",
n=1, size="1024x1024", response_format="b64_json",
)
5.4 视频生成 API
vLLM-Omni 的 /v1/videos 端点支持异步视频生成,分为三步流程。
步骤一:提交生成请求
curl -sS -X POST "${BASE_URL}/v1/videos" \
-F "prompt=Two anthropomorphic cats in comfy boxing gear fighting on a spotlighted stage." \
-F "seconds=2" -F "size=832x480" -F "fps=16" \
-F "num_inference_steps=40" -F "guidance_scale=4.0" \
-F "boundary_ratio=0.875" -F "flow_shift=5.0" -F "seed=42"
步骤二:查询生成状态
curl -sS "${BASE_URL}/v1/videos/${video_id}"
步骤三:下载生成的视频
curl -sS -L "${BASE_URL}/v1/videos/${video_id}/content" -o output.mp4
5.5 TTS API
三种任务类型
| task_type | 参数 | 说明 | 示例模型 |
|---|---|---|---|
| CustomVoice | voice, language | 预定义音色 | Qwen3-TTS-CustomVoice |
| VoiceDesign | instructions | 描述想要的音色 | Qwen3-TTS-VoiceDesign |
| Base | ref_audio, ref_text | 声音克隆 | Qwen3-TTS-Base |
curl 示例(CustomVoice)
curl -X POST http://localhost:8091/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{"input": "Hello, how are you?", "voice": "vivian", "language": "English"}' \
--output output.wav
支持格式:wav, mp3, pcm, flac, aac, opus
5.6 图像编辑 API
curl -X POST http://localhost:8000/v1/images/edits \
-F "model=xxx" -F "image=@gift-basket.png" \
-F "mask=@mask.png" -F "prompt='a bear wearing sportwear, holding a basketball'" \
-F "size=1024x1024" -F "output_format=png"
5.7 流式响应处理
from openai import OpenAI
import base64
client = OpenAI(base_url="http://localhost:8091/v1", api_key="EMPTY")
response = client.chat.completions.create(
messages=[system_msg, user_msg],
model="Qwen/Qwen3-Omni-30B-A3B-Instruct",
modalities=["text", "audio"],
stream=True,
)
for chunk in response:
for choice in chunk.choices:
if chunk.modality == "audio":
audio_data = base64.b64decode(choice.delta.content)
with open("output.wav", "wb") as f:
f.write(audio_data)
elif chunk.modality == "text":
print(choice.delta.content, end="")
6. 扩散模型(图像/视频/音频)
6.1 完整支持模型列表
三方来源综合:B(源码注册表)最为完整,收录 30+ Pipeline 类。A 覆盖约 20 个常用模型,C 覆盖约 25 个。
图像生成模型
| 模型 | Pipeline 类 | 特点 | 来源 |
|---|---|---|---|
| Qwen-Image | QwenImagePipeline | 双流 Transformer,完整特性 | A/B/C |
| Qwen-Image-Edit | QwenImageEditPipeline | 图像编辑 | B/C |
| Z-Image-Turbo | ZImagePipeline | 仅需 9 步推理 | A/B |
| FLUX.1-dev | FluxPipeline | Stable Diffusion 变体 | A/B/C |
| FLUX.2-klein | Flux2KleinPipeline | 最新版本 | B/C |
| Stable-Diffusion-3.5 | StableDiffusion3Pipeline | SD3.5 中等模型 | A/B |
| HunyuanImage-3.0 | HunyuanImage3ForCausalMM | 支持专家并行 | A/B/C |
| Ovis-Image | OvisImagePipeline | 文本到图像 | A/B |
| GLM-Image | GlmImagePipeline | 双阶段 pipeline | A |
| BAGEL | BagelPipeline | MoT 架构 | B/C |
| LongCat-Image | - | 长文本理解 | A |
| DreamID-Omni | DreamIDOmniPipeline | 图像生成 | B |
| DiffusersAdapter | DiffusersAdapterPipeline | HF 适配器 | B |
视频生成模型
| 模型 | Pipeline 类 | 类型 | 来源 |
|---|---|---|---|
| Wan2.2-T2V | WanPipeline | 文生视频 | A/B/C |
| Wan2.2-I2V | WanImageToVideoPipeline | 图生视频 | A/B/C |
| HunyuanVideo-1.5 | HunyuanVideo15Pipeline | 文生视频 | B/C |
| LTX-2 | LTX2Pipeline | 文生视频 | B/C |
| Helios | HeliosPipeline | 文生视频 | B/C |
音频 / TTS 模型
| 模型 | 架构类 | 类型 | 来源 |
|---|---|---|---|
| Qwen3-TTS | Qwen3TTSForConditionalGeneration | 文本转语音 | B/C |
| CosyVoice3 | CosyVoice3Model | 文本转语音 | B/C |
| MiMo-Audio | MiMoAudioForConditionalGeneration | 音频理解/生成 | B/C |
| Fish Speech S2 Pro | FishSpeechSlowARForConditionalGeneration | 文本转语音 | B/C |
| Voxtral TTS | VoxtralTTSForConditionalGeneration | 文本转语音 | B/C |
| Stable-Audio-Open | StableAudioPipeline | 文本到音频 | B/C |
| AudioX | AudioXPipeline | 文本到音频 | B |
| OmniVoice | OmniVoicePipeline | 语音生成 | B |
验证结论:B(源码注册表)最为完整,收录 30+ Pipeline 类。A 覆盖约 20 个常用模型。C 覆盖约 25 个。
6.2 扩散模型离线推理
以下示例演示使用 Omni 接口进行 Qwen-Image 图像生成推理:
from vllm_omni.entrypoints.omni import Omni
from vllm_omni.inputs.data import OmniDiffusionSamplingParams
import torch
omni = Omni(model="Qwen/Qwen-Image")
outputs = omni.generate(
{
"prompt": "a cup of coffee on the table",
"negative_prompt": None,
},
OmniDiffusionSamplingParams(
height=1024,
width=1024,
generator=torch.Generator("cuda").manual_seed(42),
true_cfg_scale=4.0,
guidance_scale=4.0,
num_inference_steps=50,
num_outputs_per_prompt=1,
),
)
# 提取图像
images = outputs[0].request_output.images
images[0].save("coffee.png")
来源:A/B 提供完整示例,C 确认 API 可用性。
6.3 扩散模型加速组件
| 加速类别 | 具体方法 | 效果 | 来源 |
|---|---|---|---|
| 缓存加速 | Cache-DiT | 显存减少 42%(1080P 视频) | A/C |
| TeaCache | 延迟降低 28%,内存效率 3x | A/C | |
| 序列并行 | Ulysses SP (all-to-all) | 高分辨率图像 >1536px | A/C |
| Ring Attention (P2P) | 8 GPU 通信降低 60% | A/C | |
| 模型并行 | CFG-Parallel | 正负分支跨设备 | A/B |
| Tensor Parallelism | 大模型分片 | A/C | |
| HSDP (FSDP2) | 14B+ 超大模型 | A/B | |
| Expert Parallelism | MoE 专家分片 | B | |
| 编译优化 | Torch.compile | 算子融合,每步减少 15% | A |
| 内存优化 | VAE Slicing/Tiling | 防 OOM | A/B/C |
| CPU Offload | 减少显存 | A/B/C | |
| FP8/INT8/GGUF 量化 | 低精度推理 | B |
6.4 Cache-DiT & TeaCache 配置
Cache-DiT 配置
cache_config = {
# DBCache 参数
"Fn_compute_blocks": 1,
"Bn_compute_blocks": 0,
"max_warmup_steps": 4,
"residual_diff_threshold": 0.24, # 越高缓存越激进
"max_continuous_cached_steps": 3,
# TaylorSeer 参数
"enable_taylorseer": False,
"taylorseer_order": 1,
# SCM (Step Computation Masking)
"scm_steps_mask_policy": None, # slow/medium/fast/ultra
"scm_steps_policy": "dynamic",
}
TeaCache 配置
cache_config = {
"rel_l1_thresh": 0.2, # 累积相对 L1 距离阈值
}
来源:A 提供详细配置参数,C 提供背景说明。
7. 多阶段 LLM(Qwen2.5-Omni / Qwen3-Omni)
7.1 架构对比
| 维度 | Qwen2.5-Omni | Qwen3-Omni | 来源 |
|---|---|---|---|
| 参数 | 7B | 30B-A3B(每次激活 ~3B) | A |
| 架构 | Dense Transformer | MoE(专家混合) | A/C |
| vLLM-Omni 兼容性 | 需特殊分支(qwen2_omni_public_v1) | 原生支持 | C 独有 |
| 安装复杂程度 | 复杂(需手动编译) | 简单(pip install) | C |
| 阶段数 | 3 | 3 | A/B/C |
重要警告:C(官方文档)明确说明 Qwen2.5-Omni 需要特定的 vLLM 分支(qwen2_omni_public_v1),而 A 和 B 均未提及此限制。用户如果按照 A 或 B 的指南直接 pip install vllm-omni 并使用 Qwen2.5-Omni,可能会遇到兼容性问题。
7.2 三阶段推理流程
| 阶段 ID | 名称 | 功能 | 输入 -> 输出 | worker_type |
|---|---|---|---|---|
| 0 | Thinker | 多模态理解(文本/图像/视频/音频) | 多模态输入 -> 文本生成 | ar |
| 1 | Talker | 语音码生成 | 文本嵌入 -> RVQ 码 | ar |
| 2 | Code2Wav | 音频波形生成 | RVQ 码 -> 24kHz 音频 | generation |
来源:A/B/C 一致。B 补充了 worker_type 细节。
7.3 完整离线推理示例
from vllm_omni.entrypoints.omni import Omni
from vllm.sampling_params import SamplingParams
# 初始化 Omni(Qwen3-Omni)
omni = Omni.from_cli_args(args, model="Qwen/Qwen3-Omni-30B-A3B-Instruct")
# 配置每阶段采样参数
thinker_sampling_params = SamplingParams(
temperature=0.9, top_p=0.9, max_tokens=1200, seed=42,
)
talker_sampling_params = SamplingParams(
temperature=0.9, top_k=50, max_tokens=4096, seed=42,
detokenize=False, stop_token_ids=[2150],
)
code2wav_sampling_params = SamplingParams(
temperature=0.0, max_tokens=4096*16, seed=42, detokenize=True,
)
sampling_params_list = [thinker_sampling_params, talker_sampling_params, code2wav_sampling_params]
# 执行生成(流式输出)
omni_generator = omni.generate(prompts, sampling_params_list, py_generator=True)
for stage_outputs in omni_generator:
output = stage_outputs.request_output
if stage_outputs.final_output_type == "text":
text_output = output.outputs[0].text
print(f"Text: {text_output}")
elif stage_outputs.final_output_type == "audio":
audio_tensor = output.outputs[0].multimodal_output["audio"]
sf.write("output.wav", audio_tensor.detach().cpu().numpy(), samplerate=24000)
omni.close()
来源:A/B/C 一致,B 提供最完整的代码分析。
7.4 多模态标记格式
| 模型 | 图像标记 | 音频标记 | 视频标记 |
|---|---|---|---|
| Qwen2.5-Omni | <|vision_bos|><|IMAGE|><|vision_eos|> | <|audio_bos|><|AUDIO|><|audio_eos|> | <|vision_bos|><|VIDEO|><|vision_eos|> |
| Qwen3-Omni | <|vision_start|><|image_pad|><|vision_end|> | <|audio_start|><|audio_pad|><|audio_end|> | <|vision_start|><|video_pad|><|vision_end|> |
来源:A/B 一致。
7.5 阶段配置 YAML 结构
# qwen3_omni_moe.yaml
async_chunk: true
stages:
- stage_id: 0
model_stage: "thinker"
model_arch: "Qwen3OmniMoeThinkerForConditionalGeneration"
engine_input_source: []
final_output: false
worker_type: "ar"
- stage_id: 1
model_stage: "talker"
model_arch: "Qwen3OmniMoeTalkerForConditionalGeneration"
engine_input_source: [0]
custom_process_input_func: "thinker2talker"
final_output: false
worker_type: "ar"
- stage_id: 2
model_stage: "code2wav"
model_arch: "Qwen3OmniMoeCode2Wav"
engine_input_source: [1]
custom_process_input_func: "talker2code2wav"
final_output: true
final_output_type: "audio"
worker_type: "generation"
来源:A/B 一致。注意 stage-configs-path 已废弃,新格式使用 deploy-config。
7.6 Async Chunk 模式
Async Chunk 让下游阶段在上游阶段完成之前开始处理(阶段级并发),从而显著减少端到端延迟:
# 单 prompt
bash run_single_prompt_async_chunk.sh
# 多 prompt 带并发控制
bash run_multiple_prompts_async_chunk.sh --max-in-flight 4
# 自定义阶段配置
python end2end_async_chunk.py --query-type use_audio --deploy-config /path/to/config.yaml
来源:A 提供最完整的说明和示例。
8. 配置与调优
8.1 OmniModelConfig 扩展字段
源代码分析确认 OmniModelConfig 继承自 vLLM 的 ModelConfig,添加了以下关键字段:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
stage_id | int | 0 | 阶段标识符 |
async_chunk | bool | False | 异步块传输 |
model_stage | str | "thinker" | thinker / talker / code2wav |
model_arch | str | None | 模型架构名 |
worker_type | str | None | ar / generation |
engine_output_type | str | None | 引擎输出类型 |
stage_connector_config | dict | SharedMemoryConnector | 阶段连接器配置 |
enable_sleep_mode | bool | False | 睡眠模式 |
task_type | str | None | TTS 任务类型 |
8.2 性能数据
| 指标 | 数据 | 来源 |
|---|---|---|
| 8xA100 集群,1B 参数文本+图像模型 | 吞吐比传统串行方案提高 2.1x | C |
| 端到端延迟 | 下降 35% | C |
| 任务完成时间 (JCT) 对比基线 | 最高缩短 91.4% | C |
| 端到端吞吐 | 提升 5.8x | C |
| 显存利用率提升 | 最高 40% | C |
8.3 性能调优参数速查
| 参数 | 作用 | 推荐值 | 来源 |
|---|---|---|---|
--gpu-memory-utilization | GPU 显存利用率 | 0.5 – 0.9 | A / C |
--max-num-seqs | 最大序列数 | 根据显存调整 | A / C |
--enforce-eager | 禁用 CUDA 图(防止 OOM) | 显存不足时启用 | C |
--swap-space | CPU 交换空间 | 0(禁用) | C |
micro_batch_size | 流水线并行微批大小 | 8 – 32 | C |
max_concurrent_requests | 最大并发请求数 | 2x GPU 数量 | C |
8.4 缓存策略选择推荐
| 模型类型 | 推荐缓存 | 配置方式 |
|---|---|---|
| 高分辨率图像 (>1536px) | Ulysses SP + TeaCache | --cache-backend tea_cache --usp |
| 长视频 (1080P+) | Cache-DiT | --cache-backend cache_dit --enable-cache-dit-summary |
| 大模型 (14B+) | HSDP | --use-hsdp |
| MoE 模型 | Expert Parallelism | --enable-expert-parallel |
| 小模型 (<7B) | 无需特殊配置 | 默认即可 |
9. 分布式部署与 OmniConnector
9.1 连接器类型与选择
| 连接器 | 适用场景 | 通信协议 | 来源 |
|---|---|---|---|
| SharedMemoryConnector | 单节点(默认) | POSIX 共享内存(零拷贝) | A / B / C |
| ZmqConnector | Ray / Headless 模式 | ZMQ + 握手服务器 | C(B 未提及) |
| MooncakeStoreConnector | 多节点 TCP | TCP via Mooncake | A / B / C |
| MooncakeTransferEngineConnector | 多节点最快 | RDMA / TCP + 托管内存池 | A / B / C |
| YuanrongConnector | 多节点 | TCP / RDMA + etcd | A / C(B 未提及) |
9.2 自动选择逻辑
三方验证一致的自动选择规则:
| 条件 | 默认连接器 |
|---|---|
worker_backend == "multi_process" 且共址 |
SharedMemoryConnector |
worker_backend == "ray" 或 --headless |
ZmqConnector |
9.3 连接器 YAML 配置示例
MooncakeTransferEngineConnector 的完整配置格式(来源 C):
runtime:
connectors:
mooncake_connector:
name: MooncakeTransferEngineConnector
extra:
host: "192.168.1.10"
metadata_server: "http://metadata:8000"
master: "192.168.1.100:8001"
segment: 1073741824 # 1GB
localbuf: 536870912 # 512MB
proto: "rdma" # 或 "tcp"
9.4 分布式部署命令
主节点(结合 Ray)
vllm serve Qwen/Qwen3-Omni-30B-A3B-Instruct \
--omni --worker-backend ray \
--tensor-parallel-size 4 --pipeline-parallel-size 2
远程阶段(Headless 模式)
vllm serve Qwen/Qwen3-Omni-30B-A3B-Instruct \
--omni --omni-master-address 192.168.1.100 \
--omni-master-port 8000 --stage-id 2 --headless
分离式推理(Disaggregated)
# 启动路由器(前端)
python -m dynamo.vllm.omni --omni-router --stage-configs-path ./stage_configs/glm_image.yaml
# Stage 0 (AR) on GPU 0
CUDA_VISIBLE_DEVICES=0 python -m dynamo.vllm.omni \
--omni --stage-id 0 --stage-configs-path ./stage_configs/glm_image.yaml
# Stage 1 (DiT) on GPU 1
CUDA_VISIBLE_DEVICES=1 python -m dynamo.vllm.omni \
--omni --stage-id 1 --stage-configs-path ./stage_configs/glm_image.yaml
来源 A 提供了分离式推理最完整的示例。
9.5 EPDG 全分离路线图
来源 A 提及的 2026 Q1 路线图:
- P0: Prefill-Decode (PD) 分离,适用于 Thinker / Talker 阶段
- P1: Encoder-Prefill (E->P) 分离
10. 横纵交汇洞察
10.1 纵向发展脉络
vLLM-Omni 的发展路径清晰体现了从单一 LLM 推理到多模态统一 serving 的演进:
- v0.12.0rc1:多模态推理引擎的全面进化—首次整合 Qwen2.5-Omni 支持
- v0.18.0(2026 年 3 月):里程碑版本—重新基于上游 vLLM v0.18.0,重构 serving 入口架构,为 PD 解耦和多模态输出解耦奠定基础。增强音频/语音生产 serving,扩展至更多模型
这一演变路径表明:vLLM-Omni 正从"支持特定几款多模态模型"走向"通用多模态 serving 基础设施"。
10.2 横向竞争定位
vLLM-Omni 在多模态推理框架领域处于独特位置:
- 与 vLLM(纯文本推理)相比:vLLM-Omni 是多模态扩展,而非替代
- 与 Hugging Face diffusers(纯扩散推理)相比:vLLM-Omni 提供统一化 serving + 高性能优化
- 与 OpenAI API(商业服务)相比:vLLM-Omni 是开源自部署方案
vLLM-Omni 的核心差异化优势:
- 解耦流水线:与现有流水线框架(如 NVIDIA Dynamo)本质不同—完全解耦的设计让各阶段可独立扩展
- OmniConnector:灵活的张量传输层,支持共享内存、RDMA、Mooncake 等多种后端
- 多阶段协同:自回归 + 非自回归混合流水线(如 Thinker->Talker->Code2Wav)
10.3 优势与短板
优势
- 架构创新度高(解耦流水线 + 动态路由 + 统一中间表示)
- 模型覆盖范围持续扩大(30+ Pipeline 类)
- 性能优化手段丰富(缓存、并行、量化、编译)
- 开源 + Apache 2.0 许可证
- 与 vLLM 生态深度集成
短板
- Qwen2.5-Omni 兼容性受限:需要手动编译特殊分支,增加了用户的使用门槛
- 文档完善度不足:中文文档滞后,部分 API 变更未及时更新(如
stage-configs-path→deploy-config) - 安装复杂度:从源码安装需要编译 CUDA 代码,对新手不够友好
- 缺少统一的管理控制台
10.4 风险评估
| 风险 | 可能性 | 影响 | 说明 |
|---|---|---|---|
| 模型兼容性断裂 | 中 | 高 | Qwen2.5-Omni 需要特殊分支,后续版本可能再次出现 |
| 上游 vLLM API 变更 | 中 | 高 | vLLM-Omni 强依赖上游 vLLM,API 变更会导致连锁反应 |
| 文档滞后 | 高 | 中 | 参数废弃(如 stage-configs-path)未及时反映在文档中 |
| 社区生态碎片化 | 低 | 中 | 社区驱动 vllm-omni-skills 等第三方项目可能与主线不同步 |
10.5 未来推演
- 最可能的剧本:vLLM-Omni 将持续跟随 vLLM 版本迭代,逐步实现 EPDG 全分离架构(PD 分离 → E->P 分离 → 全面跨节点),模型支持列表进一步扩大,成为多模态 serving 的事实标准。
- 最危险的剧本:如果多模态模型架构快速分化(如各厂商采用不兼容的 Stage 定义),vLLM-Omni 的统一抽象层需要同步演进,可能导致架构复杂度大幅上升。
- 最乐观的剧本:vLLM-Omni 完成 EPDG 全分离后,成为云原生多模态 AI 基础设施的核心组件,与 NVIDIA Dynamo 等方案形成互补生态。开源社区贡献活跃,模型支持达到 100+。
10.6 使用建议
- 首选 Qwen3-Omni:如果使用多阶段 LLM,优先选择 Qwen3-Omni(原生兼容 vLLM-Omni),避免 Qwen2.5-Omni 的特殊分支问题
- 使用 pip 安装:除非需要最新特性或进行开发,否则优先使用
pip install vllm-omni - 优先使用 deploy-config:阶段配置使用新格式
--deploy-config而非已废弃的--stage-configs-path - 视频生成注意参数:使用 Wan2.2 时务必设置
--boundary-ratio 0.875 --flow-shift 5.0 - 缓存加速按需启用:高分辨率图像/视频场景启用 Cache-DiT 或 TeaCache,可显著提升性能
- 分布式从单机开始:先验证单机 SharedMemoryConnector 工作正常,再扩展到多机 Mooncake/RDMA
分析结论
vLLM-Omni 是目前开源社区中最具潜力的全模态推理框架,其解耦流水线架构和丰富的模型支持使其在多模态 serving 领域占据独特定位。使用时应特别注意 Qwen2.5-Omni 的兼容性限制,优先选择原生支持的模型。文档和参数变更方面存在一定滞后,建议以源码分析为最终参考依据。
数据局限性说明
本报告的分析基于截至 2026 年 5 月的 vLLM-Omni 源码、官方文档及社区讨论。性能数据主要来源于项目内 Benchmark(来源 C),在特定硬件配置(8xA100)下测得,实际表现可能因硬件、模型版本及工作负载而异。文档内容可能滞后于代码变更,部分 API 参数可能已废弃或更新。
参考文献 / 来源致谢
- 来源 A:vLLM-Omni 官方文档及 README 文件
- 来源 B:vLLM-Omni 源码分析(model_executor / diffusion / distributed 模块)
- 来源 C:vLLM-Omni 内部 Benchmark 及性能评估报告
- 上游项目:vLLM — 高性能 LLM 推理引擎
- 社区:vLLM-Omni GitHub 仓库