news 2026/9/17 17:36:04

vLLM-Omni 实战:基于分布式逐层卸载(DLO)在 RTX 5090 上部署 MiniMax-H3 视频音频生成服务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
vLLM-Omni 实战:基于分布式逐层卸载(DLO)在 RTX 5090 上部署 MiniMax-H3 视频音频生成服务

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 HBM32 GiB每卡 32 GiB
检查点存储每分区 135 GiB每分区 135 GiB
可用系统 RAM最低 200 GiB最低 200 GiB
推荐系统 RAM384 GiB384 GiB

两点必须牢记的约束:

  1. FL2VARef2VA是两个独立的 135 GiB 检查点分区,应一次只启动一个服务。配方推荐用--task-type fl2va--task-type ref2va只下载并加载所选分区,以保持"单分区"行为。
  2. 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 = Truedlo_resident_layers: int = 0vae_use_tiling: bool = Falsevae_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)给出了两个消费级配置文件的对照表:

ProfileGPU起始形状常驻 DiT 块注意力执行状态
rtx50902 × 32 GB1344×76820cuDNN attentioneager目标硬件已验证
rtx40902 × 24 GB1024×57612cuDNN attentioneager容量代理起点

在 vLLM-Omni commitae6577ea上,一次完整的 50 步 T2VA 请求在 2 × RTX 5090 上无 OOM 完成:

形状帧数客户端端到端采样峰值/卡输出校验
1344×768124 @ 24 FPS8 分 38 秒约 22.6 GiBH.264 视频 + 32 kHz 立体声 AAC;ffmpeg全量解码通过

需要说明的边界:

  • 这是一次端到端验证,不是多轮预热后的延迟基准;采样峰值来自nvidia-smi采样,也不是 CUDA 分配器的高水位标记。
  • 验证环境为 vLLM 0.26.0、vLLM-Omni0.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/transformerref2va路由到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 上落地本配方的完整检查清单:

  1. 环境准备:从包含 MiniMax H3 支持的 vLLM-Omni 检出安装(uv pip install -e .);RTX 5090/4090 消费级 profile 使用 cuDNN attention,无需FlashAttention-4。ffmpegffprobe必须在PATH上(用于参考视频处理与 MP4 输出)。
  2. 资源规划:单分区 135 GiB 检查点存储、每卡 32 GiB HBM 预算、200 GiB 最低/384 GiB 推荐系统 RAM,三者在同一台主机上不要同时跑 FL2VA 与 Ref2VA 服务。
  3. 分区选择:先--task-type fl2va跑 FL2VA;需要 Ref2VA 时停掉服务、换路径重启。
  4. 参数组合--enable-distributed-layerwise-offload必须与--dlo-no-use-allgather--dlo-resident-layers N搭配;单卡取 12、双卡取 20,改动前务必在目标卡上重测峰值 HBM。
  5. 注意力后端:消费级路径固定--diffusion-attention-backend CUDNN_ATTN,并保持--enforce-eager
  6. 验证口径:以"无 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 17:35:14

WeChatMsg教程:导出微信聊天记录为HTML/Word/CSV并生成年度报告

WeChatMsg教程:导出微信聊天记录为HTML/Word/CSV并生成年度报告 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending…

作者头像 李华
网站建设 2026/9/17 17:34:38

IEEE118节点系统case118.m实战:从MATPOWER潮流计算到牛顿-拉夫逊迭代

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/17 17:34:03

四年级上册单词卡教案怎么做?拆合配回与2-4-7复习法全解析

简介:一份面向小学四年级英语教学的单词卡教案,基于人教版上册教材,适合教师备课或家长课后辅导使用。压缩包内为一个doc文档,体积仅26KB,内容集中无冗余,便于打印或对照参考。教案按主题系统整理基础词汇&…

作者头像 李华
网站建设 2026/9/17 17:32:21

基于STM32的车位占用检测系统:从传感器选型到串口屏实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/17 17:29:59

Qt图书管理系统源码解析:moc机制、数据库设计与部署实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/17 17:28:57

瑞芯微RV1106G3平台fastboot调试实战:从分区烧录到报错排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华