☰
LingBot-World 2.0八卡多GPU推理实战:torchrun + FSDP分片 + Ulysses序列并行完全指南
2026/10/11 21:40:38 网站建设 项目流程

【免费下载链接】lingbot-world-v2

Infinite Worlds with Versatile Interactions

项目地址:https://gitcode.com/gh_mirrors/li/lingbot-world-v2
点击查看免费下载

LingBot-World 2.0(又名 LingBot-World-Infinity)是 Robbyant 团队开源的 14B 参数交互式世界模型,支持"图生视频 + 相机轨迹 + 文本事件"的无限流式生成,可在 8 张 GPU 上以 720p/60fps 级别的速度实时驱动视频流。本文将带你从零跑通LingBot-World 2.0 八卡多 GPU 推理:用torchrun拉起 8 个进程、用FSDP 分片解决显存放不下、用Ulysses 序列并行解决视频序列太长,全程只需几条命令。

为什么 14B 视频生成需要 8 张 GPU?

理解推理配置前,先看清模型"吃"多少资源 🧮

组件规模显存压力来源
DiT(causal-fast 蒸馏模型)14B 参数、40 层、40 个注意力头参数本身 + 长视频序列的激活
T5 文本编码器(umt5-xxl)约 11B 参数编码 512 长度的提示词嵌入
VAE 解码器—361 帧潜变量的像素重建

视频生成的特殊性在于序列极长:361 帧按 chunk 流式推进时,注意力 KV cache 会持续增长。项目用两套互补的并行手段应对(定义见 wan/configs/wan_i2v_A14B.py):

  • FSDP(Fully Sharded Data Parallel):把 DiT 和 T5 的权重切分到 8 张卡上,每卡只持有 1/8 参数 → 解决"显存放不下";
  • Ulysses 序列并行:把注意力序列维度切到 8 张卡,每卡只算 40 ÷ 8 = 5 个头的注意力,卡间用 All-to-All 交换 → 解决"单卡算太慢、KV cache 太大"。

第一步:一键安装 LingBot-World 2.0 环境依赖

项目基于 Wan2.2 构建,环境要求以 requirements.txt 为准(torch>=2.4.0、flash_attn等)。安装只需三步:

git clone https://gitcode.com/gh_mirrors/li/lingbot-world-v2 cd lingbot-world-v2 pip install -r requirements.txt pip install flash-attn --no-build-isolation

⚠️flash-attn必须加--no-build-isolation安装,否则可能构建失败。

第二步:下载 14B causal-fast 模型

当前已开放的是causal-fast 蒸馏模型(每个 chunk 仅 4 步采样、无需 CFG),官方同时提供 HuggingFace 与 ModelScope 双渠道下载:

# 方式一:huggingface-cli huggingface-cli download robbyant/lingbot-world-v2-14b-causal-fast --local-dir ./lingbot-world-v2-14b-causal-fast # 方式二:modelscope-cli(国内网络更友好) modelscope download robbyant/lingbot-world-v2-14b-causal-fast --local_dir ./lingbot-world-v2-14b-causal-fast

下载完成后用--ckpt_dir指向该目录即可。

第三步:torchrun + FSDP + Ulysses 三支柱如何协作 🏗️

torchrun:每 GPU 一个进程

torchrun --nproc_per_node=8 generate.py ...会在同一节点启动 8 个 Python 进程,每进程独占一张卡,并自动注入RANK / LOCAL_RANK / WORLD_SIZE环境变量。入口脚本 generate.py 读取这些变量后执行torch.cuda.set_device(local_rank),再以 NCCL 后端初始化通信组。

FSDP:把 14B 参数切成 8 份

命令中的--dit_fsdp与--t5_fsdp分别对 DiT 和 T5 启用分片。核心实现在 wan/distributed/fsdp.py:

  • 采用SHARD_GRAD_OP策略,以每个 Transformer block 为单元做自动包装(auto wrap),前向时按需 all-gather 完整权重;
  • 混合精度:参数bf16存储、fp32通信,兼顾速度与精度。

如果显存仍紧张,可加--t5_cpu把 T5 编码器放到 CPU(只编码一次,开销可接受)。

Ulysses:序列并行的"头部轮转"

--ulysses_size 8开启 Ulysses 注意力(实现见 wan/distributed/ulysses.py 与 wan/distributed/sequence_parallel.py):

  1. 每张卡先持有完整序列、但只负责5/40 的注意力头;
  2. 通过 All-to-All(wan/distributed/util.py)把 Q/K/V 在"序列维"与"头维"之间互换;
  3. 每卡对完整序列算自己负责的 5 个头,再换回来。

这样每卡的 KV cache 只需存 5 个头的份额(见 wan/image2video.py 中local_num_heads = num_heads // sp_size),长视频推理显存和耗时同步下降。

⚙️ 两条硬约束(在 generate.py 中会直接 assert):ulysses_size必须等于world_size(即进程数),且必须能整除注意力头数 40(可用 1/2/4/5/8)。

第四步:一条命令跑通八卡推理

仓库已提供 run_fast.sh 脚本,只需传模型目录与帧数:

bash run_fast.sh lingbot-world-v2-14b-causal-fast 361

等价的完整命令(即官方推荐配置):

torchrun --nproc_per_node=8 generate.py \ --task i2v-A14B --size 480*832 \ --ckpt_dir lingbot-world-v2-14b-causal-fast \ --image examples/03/image.jpg --action_path examples/03 \ --dit_fsdp --t5_fsdp --ulysses_size 8 \ --frame_num 361 --local_attn_size 18 --sink_size 6 \ --prompt "A serene lakeside scene with a lone tree standing in calm water..."

输入由三部分组成:首帧图片(如examples/03/image.jpg)、相机轨迹poses.npy / intrinsics.npy(wan/utils/cam_utils.py 会将其转换为 Plücker 嵌入条件)以及提示词,完整示例见 examples/ 各目录。

生成的视频由 rank 0 进程保存到output/目录,文件名自动包含模式、分辨率、提示词摘要与时间戳。

核心推理参数速查表

参数默认值说明
--taski2v-A14B当前唯一任务:图生视频
--size1280*720支持480*832 / 832*480 / 720*1280 / 1280*720
--frame_num配置默认帧数,须满足 4n+1(如 81、361)
--ulysses_size1Ulysses 并行度,多卡下须等于进程数
--dit_fsdp/--t5_fsdp关对 DiT / T5 启用 FSDP 分片
--local_attn_size-1KV cache 滑动窗口大小(示例用 18),支撑无限时长流式生成
--sink_size0窗口外保留的"锚点"帧数(示例用 6)
--offload_model多卡时关前向后将模型卸载回 CPU,省显存
--t5_cpu关T5 常驻 CPU,进一步省显存

关于--local_attn_size 18 --sink_size 6:causal-fast 推理按 chunk(默认 4 帧)流式推进,KV cache 只保留最近 18 帧窗口 + 6 帧锚点,这正是"无界交互时域"(Unbounded Interaction Horizon)的关键——视频可以无限延长而显存恒定。

多 GPU 推理常见问题与解决 💡

Q1:显存不足(OOM)怎么办?加--offload_model True与--t5_cpu;--offload_model在多卡场景默认关闭(单卡默认开启),手动开启后每步前向会把模型搬回 CPU,速度略降但显存显著下降。

Q2:报错ulysses_size should be equal to the world size?torchrun --nproc_per_node=N中的 N 必须与--ulysses_size一致,例如 4 卡机器就用--nproc_per_node=4 --ulysses_size 4(4 能整除 40,合法)。

Q3:单卡能跑吗?可以。单进程直接python generate.py ...,但 FSDP 与 Ulysses 均不可用(generate.py 会直接断言报错),14B 模型对单卡显存要求极高,建议至少 4 卡以上。

Q4:帧数为什么必须是 4n+1?VAE 时间压缩步长为 4,首帧为条件帧,因此总帧数需满足 4n+1(如 81、361),脚本会自动向下对齐到合法值。

Q5:想验证多卡真的并行加速了吗?观察 8 个进程的nvidia-smi显存曲线:每卡显存约为单卡全量模型的 1/8 量级 + 5 头 KV cache 份额,且 8 卡利用率均衡,即说明 FSDP 与 Ulysses 均生效。


至此,你已经掌握了 LingBot-World 2.0 八卡多 GPU 推理的完整链路:torchrun 拉起进程 → FSDP 分片 14B 权重 → Ulysses 切分长序列 → KV cache 流式解码。更多演示效果、模型更新计划与许可信息(CC BY-NC-SA 4.0,见 LICENSE.txt)可参考 README.md。

【免费下载链接】lingbot-world-v2

Infinite Worlds with Versatile Interactions

项目地址:https://gitcode.com/gh_mirrors/li/lingbot-world-v2
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询