vLLM-Omni 快速上手指南:从离线文生图批量推理到 OpenAI 兼容在线服务
【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omni
本篇指南面向第一次接触 vLLM-Omni 的开发者,介绍如何在 Linux + Python 3.12 环境下完成环境安装、版本对齐,并通过两条核心路径跑通端到端的文本到图像生成:使用Omni同步入口进行离线批量推理,以及使用vllm serve --omni启动 OpenAI 兼容 API 服务器进行在线服务。读完本文,你将掌握 vLLM-Omni 的完整启动流程、Omni.generate的调用方式、/v1/images/generations端点参数细节,以及遇到版本不匹配、显存不足等问题时的排查思路。
前置条件
开始之前,请确认你的环境满足以下要求(这也是 vLLM-Omni 官方文档明确支持的运行基线):
- 操作系统:Linux(vLLM-Omni 当前不原生支持 Windows,详见 GPU 安装页)
- Python:3.12
vLLM-Omni 本身以 Python 库形式提供框架与模型的实现,支持 NVIDIA CUDA、AMD ROCm、Intel XPU、MThreads MUSA 以及 NPU 等硬件平台,平台级安装差异可查阅 安装指南。
安装:uv 虚拟环境 + 源码安装
官方推荐使用uv管理 Python 3.12 虚拟环境,然后从源码安装 vLLM-Omni。GPU 环境下的完整步骤如下:
uv venv --python 3.12 --seed source .venv/bin/activate # On CUDA uv pip install vllm==0.29.0 --torch-backend=auto # On ROCm uv pip install vllm==0.29.0+rocm723 --extra-index-url https://wheels.vllm.ai/rocm/0.29.0/rocm723 git clone https://github.com/vllm-project/vllm-omni.git cd vllm-omni uv pip install -e .说明几点:
uv venv --python 3.12 --seed会创建带pip/setuptools的隔离环境,避免污染系统 Python。- CUDA 与 ROCm 的 vLLM 安装源不同:CUDA 使用
--torch-backend=auto自动匹配;ROCm 需要从 vLLM 官方 wheel 源安装对应版本(本例为0.29.0+rocm723)。 - 最后一步
uv pip install -e .以可编辑模式安装当前仓库,改动源码即时生效,便于二次开发。
除源码安装外,仓库还提供预构建 wheel、Docker 镜像以及从源码构建 wheel 等多种方式,且针对不同后端(CUDA/ROCm/XPU/MUSA/NPU)给出了差异化命令,详见 GPU 安装指南 与 NPU 安装指南。仓库根目录的 Dockerfile.cuda、Dockerfile.rocm 等文件也印证了多平台镜像的构建入口。
版本对齐:必须与上游 vLLM 保持同一主版本号
这是安装环节最容易被忽视、也最容易踩坑的一点:
必须安装相同 major.minor 版本的 vLLM 与 vLLM-Omni,否则功能可能异常。版本不对齐时,导入 vLLM-Omni 会收到警告。
从源码看,vLLM-Omni 的入口实现(vllm_omni/entrypoints/omni.py)直接依赖vllm.sampling_params.RequestOutputKind等上游 API,并与 vLLM 的 V1 引擎深度耦合,因此跨小版本混用极易触发兼容性问题。
一个典型的症状是:vllm命令无法正确识别--omni参数。这通常意味着你安装了 vLLM <0.29.0而 vLLM-Omni 为0.29.0——新版本的 vLLM-Omni 不再劫持 vLLM 的入口点,--omni标志需要由匹配版本的 vLLM 自身提供。解决办法是升级 vLLM 到与 vLLM-Omni 一致的版本。
离线批量推理:使用 Omni 入口
离线推理适用于脚本、批处理与测试场景:一次性提交若干 prompt,等待全部完成后再统一取回结果。
单 prompt 文生图
from vllm_omni.entrypoints.omni import Omni if __name__ == "__main__": omni = Omni(model="Tongyi-MAI/Z-Image-Turbo") prompt = "a cup of coffee on the table" outputs = omni.generate(prompt) images = outputs[0].images images[0].save("coffee.png")这段代码的核心调用链是:
Omni(model=...)构造同步离线推理入口。Omni继承自OmniBase(见 vllm_omni/entrypoints/omni_base.py),构造时会先执行omni_snapshot_download(model)完成模型获取:支持本地路径直用、Hugging Face 仓库下载,且可通过VLLM_USE_MODELSCOPE环境变量切换到 ModelScope 下载(ModelScope 目前属于快速落地的 workaround 路径,代码中留有 TODO)。- 内部创建
AsyncOmniEngine作为底层异步引擎(Omni._create_engine)。 generate(prompt)提交请求,同步阻塞直到拿到OmniRequestOutput列表;outputs[0].images为生成的 PIL 图像对象列表,可直接save()。
批量多 prompt 文生图
generate接受 prompt 列表,多个独立请求并行调度:
from vllm_omni.entrypoints.omni import Omni if __name__ == "__main__": omni = Omni( model="Tongyi-MAI/Z-Image-Turbo", # deploy_config="./deploy-config.yaml", # Optional deploy override ) prompts = [ "a cup of coffee on a table", "a toy dinosaur on a sandy beach", "a fox waking up in bed and yawning", ] omni_outputs = omni.generate(prompts) for i_prompt, prompt_output in enumerate(omni_outputs): this_images = prompt_output.images for i_image, image in enumerate(this_images): image.save(f"p{i_prompt}-img{i_image}.jpg") print("saved to", f"p{i_prompt}-img{i_image}.jpg") # saved to p0-img0.jpg # saved to p1-img0.jpg # saved to p2-img0.jpg要点说明:
- 每个 prompt 是独立的逻辑请求。对于扩散类管线,多个兼容的进行中请求会由调度器与 runner 自动合批,但这属于运行时优化,不改变"每个 prompt 一个请求"的语义。
deploy_config是可选参数,可传入部署配置 YAML(如vllm_omni/deploy/目录下各模型对应的部署文件),用于覆盖阶段划分、并行度等默认设置。- 返回的
omni_outputs与 prompts 一一对应,每个prompt_output.images是该 prompt 生成的图像列表(受n等参数控制),因此外层循环按 prompt 编号命名、内层按图像序号命名。
generate 的完整签名与进阶用法
从源码(vllm_omni/entrypoints/omni.py)可以看到generate的完整能力:
def generate( self, prompts: OmniPromptType | Sequence[OmniPromptType], sampling_params_list: OmniSamplingParams | Sequence[OmniSamplingParams] | None = None, *, py_generator: bool = False, use_tqdm: bool | Callable[..., tqdm] = True, ) -> Generator[OmniRequestOutput, None, None] | list[OmniRequestOutput]:sampling_params_list:按阶段(stage)传入采样参数;在多阶段管线(如 PD 分离的 prefill/decode)场景下允许只给 N-1 个参数,引擎会按需展开。py_generator=True:改为惰性返回 Python 生成器,逐个 yield 完成的请求输出,适合边生成边消费的场景。use_tqdm:默认为 True 显示 "Processed prompts" 进度条,也可传入自定义进度回调。- 离线模式下,LLM 阶段默认会被强制为
FINAL_ONLY输出(_maybe_force_final_only_for_llm_stages),只有显式请求output_kind=DELTA的阶段才会走流式,从而保证离线批处理的简单语义。 - 异常处理:生成过程中任一步失败会记录日志、关闭引擎并重新抛出;请求被中途放弃(如生成器提前退出)时,
abort()会通知引擎取消对应请求。
对于扩散管线的请求级合批、按步执行(step execution)与流式输出控制,官方有专门文档 Diffusion Execution Modes 详细介绍,要点包括:
| 目标 | CLI 配置 |
|---|---|
| 串行请求执行 | --max-num-seqs 1 |
| 请求级融合批处理 | --max-num-seqs N |
| 单请求按步执行 | --step-execution --max-num-seqs 1 |
| 按步连续批处理 | --step-execution --max-num-seqs N |
| 分块扩散输出 | --diffusion-streaming-output |
其中--request-batch-max-wait-ms可设置批处理窗口(默认 0,非零值以少量延迟换取更优合批),且注意不要把一个 prompt 列表作为打包的单一 prompt 提交。
更多离线推理示例(如 Qwen2.5-Omni 的多模态对话),参见 离线推理示例。
在线服务:OpenAI 兼容 API Server
在线场景下,使用vllm serve启动一个常驻的 OpenAI 兼容 HTTP 服务器,其他进程通过 REST API 访问。
启动服务器
vllm serve Tongyi-MAI/Z-Image-Turbo --omni --port 8091--omni是启用 vLLM-Omni 多模态能力的关键标志,等价于离线入口的Omni封装。- 一个服务器实例只托管一个模型,只有该模型支持的端点才可用(详见 API Server 指南)。
启动后可验证服务健康状态与已加载模型:
export VLLM_OMNI_BASE_URL=http://localhost:8091 curl "$VLLM_OMNI_BASE_URL/health" curl "$VLLM_OMNI_BASE_URL/v1/models" | jq .若服务器带--api-key启动,则请求需携带Authorization: Bearer <api-key>头。
调用文生图端点
curl -s http://localhost:8091/v1/images/generations \ -H "Content-Type: application/json" \ -d '{ "prompt": "a cup of coffee on the table", "size": "1024x1024", "response_format": "b64_json", "seed": 42 }' | jq -r '.data[0].b64_json' | base64 -d > coffee.png命令逻辑:POST JSON 请求 → 返回体含 Base64 编码的 PNG → 用jq提取data[0].b64_json→base64 -d解码落盘为coffee.png。
端点参数详解
POST /v1/images/generations是 OpenAI DALL-E 兼容的文生图端点(详见 Image Generation API),参数分两类:
OpenAI 标准参数
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
prompt | string | 必填 | 图像的文字描述 |
model | string | 服务器模型 | 指定模型(一般与服务器一致即可) |
n | integer | 1 | 生成图像数量(1-10) |
size | string | 模型默认 | 图像尺寸,如"1024x1024" |
response_format | string | "b64_json" | "b64_json"或"file"(后者直接返回图像文件流) |
user | string | null | 用户标识(跟踪用) |
vllm-omni 扩展参数
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
negative_prompt | string | null | 希望图像避免的内容描述 |
num_inference_steps | integer | 模型默认 | 扩散去噪步数 |
guidance_scale | float | 模型默认 | 无分类器引导强度(典型 0.0-20.0) |
true_cfg_scale | float | 模型默认 | True CFG 系数(模型特有,不支持时可能被忽略) |
seed | integer | null | 随机种子,用于结果复现 |
设计原则是透传(pass-through):API 层只做基本类型与范围校验,参数直接转发给扩散管线,不做模型特定的转换;不支持或不适配的参数可能被模型静默忽略或由底层管线报错。因此最佳实践是:先采用模型官方推荐参数,再按需微调。
响应格式(b64_json模式):
{ "created": 1701234567, "data": [ { "b64_json": "<base64-encoded PNG>", "url": null, "revised_prompt": null } ] }使用 OpenAI Python SDK 客户端
服务器暴露标准http://localhost:8091/v1作为 OpenAI SDK 的base_url:
from openai import OpenAI client = OpenAI(base_url="http://localhost:8091/v1", api_key="none") response = client.images.generate( model="Tongyi-MAI/Z-Image-Turbo", prompt="a horse jumping over a fence nearby a babbling brook", n=1, size="1024x1024", response_format="b64_json" )注意:seed、num_inference_steps、true_cfg_scale等 vLLM-Omni 扩展参数是 OpenAI SDK 不直接暴露的,需要走原生 HTTP 请求(如requests直传 JSON)才能使用。更完整的 curl / Python / Gradio 多客户端示例见 在线文生图示例。
多卡并行加速
对于 Qwen-Image 等较大模型,可叠加并行度参数提升吞吐(对应示例见 examples/online_serving/text_to_image/README.md):
# Tensor Parallel(需 >= 2 卡) vllm serve Qwen/Qwen-Image --omni --port 8091 --tensor-parallel-size 2 # TP + VAE Patch Parallel + VAE Tiling(需 >= 2 卡) vllm serve Qwen/Qwen-Image --omni --port 8091 --tensor-parallel-size 2 --vae-patch-parallel-size 2 --vae-use-tiling # Sequence Parallelism / Ulysses-SP(需 >= 2 卡) vllm serve Qwen/Qwen-Image --omni --port 8091 --usp 2 # Ring Attention(需 >= 2 卡) vllm serve Qwen/Qwen-Image --omni --port 8091 --ring 2显存受限时可启用--vae-use-slicing --vae-use-tiling降低内存占用。
常见问题与排查
版本不匹配导致--omni不生效:升级 vLLM 至与 vLLM-Omni 相同的 0.29.x 主版本(见上文"版本对齐"一节)。
503 Diffusion engine not initialized:/v1/images/generations返回该错误说明服务器不是以扩散模型启动的——检查vllm serve <model> --omni中的模型是否为文生图模型。
400 参数格式错误:size必须是WIDTHxHEIGHT格式,例如"1024x1024",非法值(如"1024x")会返回 400。
显存不足(OOM):按size: "512x512"→num_inference_steps: 25→n: 1的顺序逐步降低资源占用,或启用 VAE slicing/tiling。
功能自检:仓库提供端到端测试,可通过 pytest 验证图像生成接口行为(测试参考 tests/entrypoints/openai_api/test_image_server.py):
pytest tests/entrypoints/openai_api/test_image_server.py -v小结与下一步
至此,你已经掌握了 vLLM-Omni 的完整入门链路:环境与版本对齐 → 离线Omni.generate批量文生图 →vllm serve --omni在线服务与/v1/images/generations调用。vLLM-Omni 在同一套框架下还覆盖语音合成、音频生成、图像编辑、视频生成、实时全双工对话与机器人策略推理等任务,各端点的选择与调用方式可在 API Server 指南 中按需查阅。
【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omni
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考