vLLM-Omni 实战:基于分布式逐层卸载(DLO)在 RTX 5090 上部署 MiniMax-H3 视频音频生成服务
【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omni
本篇技术指南以 vllm-omni 仓库中的 MiniMax-H3-5090 部署配方 为核心,系统讲解如何在一张或两张 RTX 5090(32 GiB HBM)上以**内存优先(memory-first)的思路承载 MiniMax H3 这一联合视频/音频扩散模型:采用 BF16 权重、tiled VAE 解码、可选的张量并行(TP),以及关键的分布式逐层卸载(Distributed Layerwise Offload,DLO)**机制,把 270 GiB 级别的双分区检查点压进消费级 GPU 的显存预算内。读完本文,你将掌握 1344×768、5 秒、50 步采样在单卡/双卡 RTX 5090 上的可运行服务命令、DLO 参数的内存语义,以及验证部署正确性的实测依据。
配方概览:面向 32 GiB 消费级 GPU 的内存优先方案
MiniMax H3 是 CFG-distilled 的联合视频/音频扩散 Transformer,其检查点包含两个任务专用 DiT 分区:
FL2VA:承载 text-to-video+audio(t2va)与 first-frame-to-video+audio(fl2va)任务;Ref2VA:承载最多 9 张图片、3 段视频、3 段音频参考输入的ref2va任务(纯音频输入会被拒绝)。
每个分区约含134 GiB的 BF16 safetensors(磁盘上约135 GiB),两个分区同时落地需要约270 GiB的模型存储空间。这意味着模型权重体量远超 RTX 5090 的 32 GiB 显存,因此 5090 配方整体设计为内存优先:降低常驻(resident)权重的数量以压缩 HBM 占用,代价是增加 CPU 到 GPU 的传输时间。换言之,这是容量路径(capacity path)而非延迟路径,其目标是让请求在消费级硬件上"跑得起来且结果正确"。
容量需求:显存、系统内存与检查点存储三者分开规划
配方要求把 GPU HBM、主机 RAM 与检查点存储当作三个相互独立的资源维度来规划:
| 资源 | 单张 RTX 5090 | 两张 RTX 5090 |
|---|---|---|
| GPU HBM | 32 GiB | 每卡 32 GiB |
| 检查点存储 | 每分区 135 GiB | 每分区 135 GiB |
| 可用系统 RAM | 最低 200 GiB | 最低 200 GiB |
| 推荐系统 RAM | 384 GiB | 384 GiB |
两点必须牢记的约束:
FL2VA与Ref2VA是两个独立的 135 GiB 检查点分区,应一次只启动一个服务。配方推荐用--task-type fl2va或--task-type ref2va只下载并加载所选分区,以保持"单分区"行为。- DLO 会把 rank 本地的权重保存在固定(pinned)主机内存中;在当前实现下,增大
--dlo-resident-layers会改善延迟,但不会减少主机 RAM 占用——因为常驻层仍然保留着固定内存中的 CPU 主副本。所以 200 GiB 是最低可用内存、384 GiB 是推荐配置,且不应在一个按最低内存规划的主机上同时运行 FL2VA 与 Ref2VA 两个服务。
Modular H3 说明:当仓库合入后续的 Modular 改造(文档中记为 #5720)后,配方希望用
--task-type fl2va或--task-type ref2va保持当前的"单分区"行为。在当前版本中,组合服务会同时下载两个分区,而--task-type只下载所选分区。
单张 RTX 5090:1344×768、5 秒的容量路径
单卡方案的关键参数是12 个常驻 DiT 层(resident layers)。配方给出的参考数据点:一个 50 步的 B300 分配测试在完全相同的单 rank 拓扑下峰值约26.50 GiB——因此在目标卡上提高常驻层数之前,务必先在目标卡上重新测量峰值 HBM。
CUDA_VISIBLE_DEVICES=0 vllm serve /path/to/MiniMax-H3/FL2VA \ --omni --trust-remote-code --host 0.0.0.0 --port 8000 \ --num-gpus 1 --tensor-parallel-size 1 --text-encoder-tp-size 1 \ --usp 1 --ring 1 --vae-patch-parallel-size 1 \ --vae-parallel-mode tile --vae-use-tiling \ --enable-distributed-layerwise-offload --dlo-no-use-allgather \ --dlo-resident-layers 12 --enforce-eager \ --diffusion-attention-backend CUDNN_ATTN命令要点逐项拆解:
--omni启用 vLLM-Omni 的多模态一体化服务路径;--trust-remote-code允许执行仓库远端代码(H3 检查点需要)。--num-gpus 1 --tensor-parallel-size 1 --text-encoder-tp-size 1:单 rank 拓扑,文本编码器不做 TP。--usp 1 --ring 1 --vae-patch-parallel-size 1:Ulysses 序列并行度、Ring 并行度、VAE patch 并行度均为 1。--vae-parallel-mode tile --vae-use-tiling:启用 H3 VAE 原生的 tiled 解码。注意 H3 VAE 只支持tile模式,不支持spatial_shard_height/spatial_shard_width。--enable-distributed-layerwise-offload:开启 DLO。--dlo-no-use-allgather:关闭 AllGather 权重重建(详见下文 DLO 原理)。--dlo-resident-layers 12:前 12 个 DiT 块常驻显存、跨采样步复用,其余块按需从主机流式传输。--enforce-eager:消费级路径显式选择 eager 执行,规避未经验证的编译路径。--diffusion-attention-backend CUDNN_ATTN:消费级 RTX 路径显式选用 cuDNN attention(无需 FlashAttention-4)。
两张 RTX 5090:TP2 + 20 个常驻层的双卡方案
双卡方案使用TP2 与 20 个常驻 DiT 层。配方的参考数据:两 rank 的 B300 容量测试在 1344×768、50 步时每 rank 峰值27,726 MiB。文档明确强调这是内存/正确性代理数据(memory/correctness proxy),不是消费级 GPU 的延迟承诺。
CUDA_VISIBLE_DEVICES=0,1 vllm serve /path/to/MiniMax-H3/FL2VA \ --omni --trust-remote-code --host 0.0.0.0 --port 8000 \ --num-gpus 2 --tensor-parallel-size 2 --text-encoder-tp-size 2 \ --usp 1 --ring 1 --vae-patch-parallel-size 2 \ --vae-parallel-mode tile --vae-use-tiling \ --enable-distributed-layerwise-offload --dlo-no-use-allgather \ --dlo-resident-layers 20 --enforce-eager \ --diffusion-attention-backend CUDNN_ATTN这条拓扑把所有可用的并行能力都用上了:
- TP2 同时切分 DiT 与 Qwen3-VL 文本编码器;
--dlo-no-use-allgather让每个 rank 流式传输自己局部的 TP 分片,无需重建完整权重块;- VAE patch 并行度 2把 tiled 解码拆分到两张卡上。
值得强调的语义:常驻层数量只改变权重放置与传输频率,不改变计算精度——它不会做量化,也不会改动 BF16/FP32 的去噪数学。在换用不同请求形状之前,应重新测量峰值内存再决定是否提高常驻层数。
切换 Ref2VA 分区:停止 FL2VA 服务,用同样的命令把模型路径改为/path/to/MiniMax-H3/Ref2VA重新启动即可。Ref2VA 的参考视频数量与提示词长度会增加激活内存,建议开始时一次只提交一个请求。
DLO 原理:rank-local 传输为何能省显存
从源码看,DLO 的参数定义与校验逻辑位于 arg_utils.py 与 offloader/config.py:
dlo_use_allgather: bool = True、dlo_resident_layers: int = 0、vae_use_tiling: bool = False、vae_parallel_mode: str = "tile"是引擎参数层的字段定义;- CLI 侧
--dlo-no-use-allgather的语义在 serve.py 中写得很清楚:关闭 AllGather 后,每个 rank 直接流式传输标准加载器产出的 rank 本地张量(包括已有的 TP 分片),仅走 H2D 拷贝——没有额外的 DP 切分、没有 AllGather、也没有并发请求的同步要求。
配置解析层resolve_offload()还会做一致性校验:
dlo_resident_layers必须是非负整数;dlo_resident_layers要求 DiT 的 DLO 传输方式为 rank-local(即必须配合--dlo-no-use-allgather),否则直接报错:dlo_resident_layers requires the DiT DLO transfer to be rank-local; set dlo_use_allgather=False;resident_layers目前只支持dit组件(resident_layers currently supports only the 'dit' component);- 若同时使用
--diffusion-offload-config与新式配置,则不能再叠加dlo_use_allgather/dlo_resident_layers等兼容性旧选项。
这套约束解释了 5090 配方为什么必须成对出现--enable-distributed-layerwise-offload --dlo-no-use-allgather --dlo-resident-layers N:常驻层语义建立在 rank-local 流式传输之上。
从双卡执行路径看,DLO 与标准加载器的配合是:标准加载器先创建 rank 局部的 TP 分片,DLO 把该分片保留在固定主机内存中,尾部 DiT 块通过共享的双缓冲窗口流式进入 GPU;前 20 个 DiT 块在每个去噪阶段只拷贝一次、被所有采样步复用,并在 VAE 解码前释放,以便解码器复用其 HBM。这也是为什么"增大 resident 层数不省主机内存"——固定内存中的 CPU 主副本始终存在。
与 RTX 4090 配置的对照与目标硬件验证
主配方文档(MiniMax-H3.md)给出了两个消费级配置文件的对照表:
| Profile | GPU | 起始形状 | 常驻 DiT 块 | 注意力 | 执行 | 状态 |
|---|---|---|---|---|---|---|
rtx5090 | 2 × 32 GB | 1344×768 | 20 | cuDNN attention | eager | 目标硬件已验证 |
rtx4090 | 2 × 24 GB | 1024×576 | 12 | cuDNN attention | eager | 容量代理起点 |
在 vLLM-Omni commitae6577ea上,一次完整的 50 步 T2VA 请求在 2 × RTX 5090 上无 OOM 完成:
| 形状 | 帧数 | 客户端端到端 | 采样峰值/卡 | 输出校验 |
|---|---|---|---|---|
| 1344×768 | 124 @ 24 FPS | 8 分 38 秒 | 约 22.6 GiB | H.264 视频 + 32 kHz 立体声 AAC;ffmpeg全量解码通过 |
需要说明的边界:
- 这是一次端到端验证,不是多轮预热后的延迟基准;采样峰值来自
nvidia-smi采样,也不是 CUDA 分配器的高水位标记。 - 验证环境为 vLLM 0.26.0、vLLM-Omni
0.26.1.dev14+gae6577ea、PyTorch 2.11.0+cu130。 - 在正式跑目标卡之前,两个 profile 都在两 rank B300 上做过分配与正确性代理:1344×768、124 帧、50 步时 20 层 profile 每 rank 峰值 27,726 MiB;1024×576 时 12 层 profile 在 5 步容量测试中每 rank 峰值 18,888 MiB。常驻与全流式两种放置方式,对相同形状、步数、提示词与种子产生了完全一致的解码视频帧与音频哈希——这从正确性角度印证了 DLO 传输不改变去噪数值结果。
- B300 结果不能推导 RTX 4090 PCIe 的延迟表现;4090 profile 在实测之前应视为保守起点。
仓库还提供了可复现的端到端脚本 run_h3_2gpu_all_tasks.sh:它依次运行 T2VA、FL2VA、image+audio Ref2VA 与双视频 Ref2VA,校验每个 MP4 的 H.264/AAC 流,并保留服务端与 GPU 内存日志。脚本对PROFILE=rtx5090选择 20 个常驻层、PROFILE=rtx4090选择 12 个;DLO_RESIDENT_LAYERS=N可覆盖默认值:
RUN_ROOT=/path/to/run-root \ MODEL_ROOT=/path/to/MiniMax-H3 \ GPU_IDS=0,1 \ PROFILE=rtx5090 \ bash examples/offline_inference/minimax_h3/run_h3_2gpu_all_tasks.sh服务与调用:以/v1/videos完成文本到视频音频生成
5090 配方启动的即 OpenAI 兼容的/v1/videosHTTP 服务。以 T2VA 任务为例,通过同步端点(/v1/videos/sync)可以直接把响应体保存为 MP4。所有任务统一使用 24 FPS、50 个 sigma 点,视频/音频 flow shift 分别取 12 与 3(小数时长经extra_params传递):
export API_URL="http://127.0.0.1:8000/v1/videos/sync" curl -sS -X POST "${API_URL}" \ -F 'prompt=A quiet cinematic night scene with matching ambient sound.' \ -F 'width=1344' \ -F 'height=768' \ -F 'aspect_ratio=16:9' \ -F 'fps=24' \ -F 'num_inference_steps=50' \ -F 'flow_shift=12' \ -F 'seed=1101' \ -F 'extra_params={"task":"t2va","duration":5.0,"audio_flow_shift":3.0}' \ -o t2va.mp4请求通过extra_params.task选择任务专用 DiT:t2va/fl2va路由到FL2VA/transformer,ref2va路由到Ref2VA/transformer。输出契约固定为 4–15 秒、24 FPS、立体声 32 kHz 音频、32 像素画布倍数。H3 是 CFG-distilled 模型,因此--cfg-parallel-size必须保持为 1。
需要强调的是,以上是配方主题(RTX 5090 部署)下的最小调用示例;完整的 T2VA / FL2VA / Ref2VA 请求矩阵、参考输入约束与官方输入矩阵可查阅 MiniMax-H3 主配方文档 与 视频 API 文档。
部署清单与注意事项
总结在 RTX 5090 上落地本配方的完整检查清单:
- 环境准备:从包含 MiniMax H3 支持的 vLLM-Omni 检出安装(
uv pip install -e .);RTX 5090/4090 消费级 profile 使用 cuDNN attention,无需FlashAttention-4。ffmpeg与ffprobe必须在PATH上(用于参考视频处理与 MP4 输出)。 - 资源规划:单分区 135 GiB 检查点存储、每卡 32 GiB HBM 预算、200 GiB 最低/384 GiB 推荐系统 RAM,三者在同一台主机上不要同时跑 FL2VA 与 Ref2VA 服务。
- 分区选择:先
--task-type fl2va跑 FL2VA;需要 Ref2VA 时停掉服务、换路径重启。 - 参数组合:
--enable-distributed-layerwise-offload必须与--dlo-no-use-allgather、--dlo-resident-layers N搭配;单卡取 12、双卡取 20,改动前务必在目标卡上重测峰值 HBM。 - 注意力后端:消费级路径固定
--diffusion-attention-backend CUDNN_ATTN,并保持--enforce-eager。 - 验证口径:以"无 OOM 完成 +
ffprobe报告 H.264 视频与 32 kHz 立体声 AAC"作为通过标准;记录实测峰值而非假定标称值。
本配方定位清晰:它是一份消费级硬件的容量与正确性部署方案,不是吞吐或延迟基准。若需要吞吐导向的部署(无卸载、四卡、Ulysses 序列并行、tiled VAE patch 并行、区域torch.compile与稠密TRTLLM_ATTN),或想了解更完整的 API 用法,可继续阅读 MiniMax-H3 主配方、支持模型列表 与 Diffusion 并行总览。
【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omni
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考