vLLM-Omni 扩散模型 Pipeline Parallel 实现指南:以 Wan2.2 文生视频/图生视频为参考的完整实践
【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omni
导读:Pipeline Parallelism(PP,流水线并行)将去噪 Transformer 切成多个顺序阶段并分布到不同 GPU rank,从而降低单卡显存占用、让更大的扩散 Transformer 可以跨多卡运行。本文以 vLLM-Omni 仓库中的 Wan2.2 text-to-video 与 image-to-video 流水线为参考实现,系统讲解如何为扩散流水线接入 PP:从继承PipelineParallelMixin的 5 步实现检查清单、核心通信原语与异步机制,到层切分、权重加载、与 CFG-Parallel 的组合,再到离线验证命令与常见故障排查。读完本文,你将掌握将任意 DiT 类扩散模型改造成 PP 感知模型的完整方法论,并能直接复现 Wan2.2 的pp2与pp2+cfg2组合运行。
实现检查清单
为扩散流水线增加 Pipeline Parallel 支持,需要完成以下 5 个步骤(参考 pipeline_parallel.md):
- ✅继承 Mixin—— 在流水线类中把
PipelineParallelMixin放在CFGParallelMixin之前继承; - ✅让 stage 前向可续跑—— Transformer 前向路径支持
intermediate_tensors输入; - ✅返回正确的对象类型—— 非末位 PP rank 返回
IntermediateTensors,末位 rank 返回最终模型输出; - ✅使用标准去噪循环—— 调用
predict_noise_maybe_with_cfg()与scheduler_step_maybe_with_cfg(); - ✅测试一致性—— 将 PP 结果与单卡基线对比验证数值等价。
下文将按"原理 → 分步实现 → 测试 → 排错 → 参考实现"的顺序展开。
Overview:什么是 Pipeline Parallelism
Pipeline Parallelism 把去噪 Transformer 拆分成多个顺序阶段(sequential stages),每个阶段放在不同的 rank 上。与每个 rank 都持有完整 DiT 不同,每个 PP rank 只拥有模型层的一个切片(slice)。
每个去噪步的通信模式如下:
- Rank 0 使用当前 latents 启动前向传播;
- 每个中间 rank 接收来自上一个 rank 的 hidden states,运行自己本地的层切片,并把
intermediate_tensors转发给下游; - 最后一个 PP rank 产生最终的 noise prediction;
- 最后一个 PP rank 执行 scheduler 步进,把更新后的 latents 发回 rank 0,供下一个 timestep 使用。
这一设计带来的收益包括:降低单 rank 模型内存、使更大的扩散 Transformer 能跨多 GPU 运行,并且可以与 CFG-Parallel 组合——每条 PP 流水线承载一个 CFG 分支。
架构:PipelineParallelMixin的核心方法
vLLM-Omni 通过PipelineParallelMixin(实现在 vllm_omni/diffusion/distributed/pipeline_parallel.py)封装扩散流水线的 PP 通信模式。其核心方法与自动行为如下:
| 方法 | 用途 | 自动行为 |
|---|---|---|
diffuse() | 去噪循环边界 | 被PipelineParallelMixin包装,在退出时冲刷(flush)未完成的异步 PP 发送 |
predict_noise_maybe_with_cfg() | 带 PP 支持的噪声预测 | 在非末位 PP rank 上执行部分前向,需要时与 CFG 逻辑组合 |
scheduler_step_maybe_with_cfg() | 带 PP 同步的 scheduler 步进 | 仅在末位 PP rank 上运行 scheduler,将更新后的 latents 返回 rank 0 |
_sync_pp_send() | 冲刷待决的异步发送 | 在后续 collective 或 decode 之前等待所有未决isendhandle |
从源码结构看,PipelineParallelMixin是流水线级别的抽象:模型专属的predict_noise()仍然决定本地 stage 如何执行,Mixin 只负责跨 rank 的编排与通信(vllm_omni/diffusion/distributed/pipeline_parallel.py中predict_noise_maybe_with_cfg通过get_pp_group()获取 PP 进程组,并在非首 rank 调用pp_group.irecv_tensor_dict()、在非末 rank 调用pp_group.isend_tensor_dict(result.tensors))。
工作方式:三种模式自动切换
predict_noise_maybe_with_cfg()会根据并行配置自动在三种模式间切换(源码位于vllm_omni/diffusion/distributed/pipeline_parallel.py):
PP 关闭(
pipeline_parallel_size == 1):- 回退到
CFGParallelMixin.predict_noise_maybe_with_cfg(),行为与非 PP 完全一致。
- 回退到
仅 PP(
pipeline_parallel_size > 1,cfg_parallel_size == 1):- Rank 0 以输入 latents 启动;
- 中间 rank 接收
intermediate_tensors,运行本地层区间后异步向下游发送; - 末位 rank 返回最终 noise prediction;
- 注意:此模式下若开启 CFG(顺序 CFG,sequential CFG),正负两个分支都要穿过同一条 PP 流水线,每个去噪步的通信量翻倍。只要
cfg_parallel_size > 1可用,应优先选择 PP + CFG-Parallel 以规避该开销。
PP + CFG-Parallel(
pipeline_parallel_size > 1,cfg_parallel_size > 1):- 每条 PP 流水线承载一个 CFG 分支;
- 末位 PP rank 在 CFG 组内执行 all-gather;
- CFG 组合在每个 CFG 组内的末位 PP rank 上执行,与非 PP 的 CFG-parallel 行为一致。
scheduler_step_maybe_with_cfg()则保证去噪循环的一致性:
- PP 关闭:回退到
scheduler_step_maybe_with_cfg()(即CFGParallelMixin的实现); - PP 开启:
- 只有末位 PP rank 持有
noise_pred,由它执行 scheduler 步进; - 结果 latents 被发回 rank 0;
- Rank 0 收到一个
AsyncLatents包装对象,直到张量真正被消费时才解析。
- 只有末位 PP rank 持有
这种异步设计避免了去噪步之间的不必要阻塞。当流水线类被定义时,PipelineParallelMixin会包装其diffuse()方法,并在diffuse()返回或抛异常后的finally块中调用_sync_pp_send()——这样模型代码无需显式进行 PP 清理,同时保证最后一次非阻塞 PP 发送在 decode 或后续 collective 之前完成。
异步细节:AsyncLatents与AsyncIntermediateTensors
AsyncLatents(定义于vllm_omni/diffusion/distributed/pipeline_parallel.py)是一个"透明异步包装器":它持有未决的irecv_tensor_dict结果,把handle.wait()延迟到底层张量真正被消费时才执行——无论是通过属性访问(如latents.to(dtype)、latents.shape)还是 torch 运算(如mask * latents)都会触发解析。它实现了__getattr__与__torch_function__协议,因此对上层代码完全透明;torch.as_tensor(latents)会与底层张量共享存储、不做拷贝。对应的单元测试TestAsyncLatents覆盖了属性访问解析、__torch_function__解包、handle 等待与解析幂等性等场景(见 tests/diffusion/distributed/test_pipeline_parallel.py)。
中间 stage 之间的张量则使用 vLLM 的AsyncIntermediateTensors(来自vllm.v1.worker.gpu_worker),配合pp_group.isend_tensor_dict()/irecv_tensor_dict()实现异步流水线传递,所有通信都采用异步isend/irecv而非同步发送。
Step-by-Step Implementation
Step 1:继承PipelineParallelMixin与CFGParallelMixin
PipelineParallelMixin强制要求CFGParallelMixin,并且必须在类的 MRO 中排在它之前。这一约束在类定义时通过__init_subclass__强制执行(见vllm_omni/diffusion/distributed/pipeline_parallel.py):
- 只继承
PipelineParallelMixin而缺少CFGParallelMixin,会在 import 时立即抛出TypeError; - 把
PipelineParallelMixin写在CFGParallelMixin之后,同样会在 import 时抛出TypeError。
原因是PipelineParallelMixin把噪声预测、CFG 组合与 scheduler 步进都委托给CFGParallelMixin(后者提供predict_noise()、predict_noise_maybe_with_cfg()、scheduler_step_maybe_with_cfg()与combine_cfg_noise(),见 vllm_omni/diffusion/distributed/cfg_parallel.py)。
示例:
from vllm_omni.diffusion.distributed.cfg_parallel import CFGParallelMixin from vllm_omni.diffusion.distributed.pipeline_parallel import PipelineParallelMixin import torch.nn as nn class YourPipeline(nn.Module, PipelineParallelMixin, CFGParallelMixin): ...顺序至关重要:PipelineParallelMixin必须列在CFGParallelMixin之前,这样predict_noise_maybe_with_cfg()与scheduler_step_maybe_with_cfg()的调用会解析到 PP 感知的包装方法,而其内部的super()调用在 PP 关闭或末位 PP stage 之后会委托给 CFG 实现。
实际参考:Wan2.2 的 T2V 流水线Wan22Pipeline与 I2V 流水线Wan22I2VPipeline都严格遵循这一 MRO 顺序(见 pipeline_wan2_2.py 与 pipeline_wan2_2_i2v.py)。
Step 2:让模型 forward 与predict_noise()具备 PP 感知
PP mixin 会把intermediate_tensors注入常规的predict_noise()调用。你的模型 forward 路径必须支持两种输入:
- 来自 rank 0 的常规输入,通常以
hidden_states或x传入; - 来自上游 PP rank 的
intermediate_tensors。
标准模型 forward 模式:
- 若存在
intermediate_tensors,从其中读取本地 hidden state; - 只运行本 rank 的层切片;
- 在非末位 PP rank 上返回
IntermediateTensors(...); - 在末位 PP rank 上返回最终模型输出。
CFGParallelMixin.predict_noise()已经为常见流水线遵循这一约定——其默认实现调用self.transformer(*args, **kwargs),当结果为IntermediateTensors时原样返回,否则取result[0](见vllm_omni/diffusion/distributed/cfg_parallel.py)。
最小示例:
from vllm.sequence import IntermediateTensors from vllm_omni.diffusion.distributed.parallel_state import get_pp_group def forward(self, hidden_states=None, intermediate_tensors=None, **kwargs): if intermediate_tensors is not None: hidden_states = intermediate_tensors["hidden_states"] for i in range(self.start_layer, self.end_layer): hidden_states = self.layersi pp_group = get_pp_group() if not pp_group.is_last_rank: return IntermediateTensors({"hidden_states": hidden_states}) return (hidden_states,)Wan2.2 的真实实现佐证:WanTransformer3DModel.forward()(vllm_omni/diffusion/models/wan2_2/wan2_2_transformer.py)在is_pipeline_first_stage()时执行 patch embedding 与 flatten,否则要求必须提供intermediate_tensors(否则抛出RuntimeError("intermediate_tensors must be provided for non-first PP stages")),并从中取出hidden_states继续。非末位 stage 直接return IntermediateTensors({"hidden_states": hidden_states});末位 stage 才执行norm_out、proj_out与 unpatchify,返回(output,)或Transformer2DModelOutput。同时,patch_embedding只在首个 PP stage 实例化,其余 stage 用PPMissingLayer占位。
Step 3:切分 Transformer 层
每个 PP rank 上的本地模块必须只暴露该 rank 的层切片。在参考测试与 vLLM 模型实现中,通常使用 vLLM 工具make_layers(...)完成——它会构造本地层并用PPMissingLayer填充缺失区间。除层切分本身外,模型作者还应接线make_empty_intermediate_tensors_factory(...)(用于中间张量分配)与is_pp_missing_parameter(...)(用于 PP 感知的权重加载)。
为 Transformer 准备 PP 支持,请按顺序实现以下 4 个子步骤。
3.1 将 Transformer 层切分到各 PP rank
每个 PP rank 只应拥有自己的本地层区间,通常暴露为[start_layer, end_layer)。实践中通常用make_layers(...)构造本地层,并用PPMissingLayer填充缺失区间。目标是:
- 每个 PP rank 都知道自己的
[start_layer, end_layer)范围; - 非本地层不在此 rank 上执行;
- forward 可以从传入的
intermediate_tensors恢复执行。
默认情况下,层通过get_pp_indices()均匀分布到各 PP rank。当层数不能被 PP 大小整除时,剩余层会被分配到中间分区以平衡计算与内存。可以通过VLLM_PP_LAYER_PARTITION环境变量覆盖这一默认行为,指定每个 rank 的精确层数:
# Example: 40 layers across 4 PP ranks, assigning 8 / 12 / 12 / 8 layers export VLLM_PP_LAYER_PARTITION=8,12,12,8该值必须是逗号分隔的整数列表,长度等于pipeline_parallel_size,且总和等于 Transformer 总层数。
Wan2.2 参考:WanTransformer3DModel.__init__中,self.start_layer, self.end_layer, self.blocks = make_layers(num_layers, lambda prefix: WanTransformerBlock(...), prefix="blocks"),即 40 层(Wan2.2-5B 的默认num_layers=40)被切分到各 PP stage;同时末位 stage 才实例化norm_out/proj_out与output_scale_shift_prepare,其余用PPMissingLayer占位(vllm_omni/diffusion/models/wan2_2/wan2_2_transformer.py)。测试侧,MockPipelineParallel也通过make_layers进行层切分,验证了与真实 DiT 模型一致的层分割逻辑(tests/diffusion/distributed/test_pipeline_parallel.py)。
3.2 暴露make_empty_intermediate_tensors
Transformer 模块应暴露self.make_empty_intermediate_tensors,通常用make_empty_intermediate_tensors_factory(...)创建。这对于 PP 至关重要:各 PP rank 需要一种一致的方式来分配带预期 keys 与 hidden 维度的占位IntermediateTensors。
示例:
from vllm.model_executor.models.utils import make_empty_intermediate_tensors_factory self.make_empty_intermediate_tensors = make_empty_intermediate_tensors_factory( ["hidden_states"], inner_dim, )对 Wan2.2 而言,PP stage 之间传递的中间载荷是存放在"hidden_states"key 下的 token 序列,因此 factory 用该 key 与 Transformer hidden size 创建。Wan2.2 的实际代码为make_empty_intermediate_tensors_factory(["hidden_states"], inner_dim),其中inner_dim = num_attention_heads * attention_head_dim。
3.3 在非末位 PP rank 返回IntermediateTensors
模型forward()或自定义predict_noise()实现应当在非首 rank 上消费intermediate_tensors,并在非末 rank 上返回IntermediateTensors(...)。这样每个 PP stage 可以从上游 hidden states 恢复执行,并把本地结果传给下一 stage。
3.4 在load_weights()中跳过非本地权重
当模型被 PP 切分后,checkpoint 中的许多参数属于当前 rank 上不存在的层。load_weights()必须使用is_pp_missing_parameter(...)跳过属于缺失 PP stage 的参数。如果不这样做,权重加载会失败,或者错误地尝试把张量加载进PPMissingLayer占位符。
Wan2.2 是最佳参考:WanTransformer3DModel.load_weights()(vllm_omni/diffusion/models/wan2_2/wan2_2_transformer.py)在加载 QKV 融合权重(stacked_params_mapping中的.attn1.to_qkv映射)与 remapped 权重(如scale_shift_table→output_scale_shift_prepare.scale_shift_table)之前都先调用is_pp_missing_parameter(lookup_name, self)判断并跳过。其stacked_params_mapping只融合 self-attention(.attn1.to_q/to_k/to_v→.attn1.to_qkv),cross-attention 保持分离。此外,当tp_size > 1时还会对norm_q/norm_k/norm_added_k等 RMSNorm 权重按 TP 秩切片,保证与分片后的 hidden 维度匹配。
如果你的模型有多个 Transformer 变体(如 Wan2.2 的双 Transformer 结构transformer与transformer_2),只要每个被选中的 Transformer 都遵守同一契约,PP 依然可用。Wan22Pipeline 通过boundary_ratio决定加载哪个/哪两个 Transformer(boundary_ratio=1.0只加载低噪声阶段transformer_2,boundary_ratio=0.0只加载高噪声阶段transformer),两个 Transformer 都经由make_layers进行 PP 切分(vllm_omni/diffusion/models/wan2_2/pipeline_wan2_2.py)。
Step 4:使用标准去噪契约
vLLM-Omni 扩散流水线已经把去噪流程路由到diffuse()、predict_noise_maybe_with_cfg()与scheduler_step_maybe_with_cfg()。当pipeline_parallel_size > 1时,PipelineParallelMixin会覆盖这些标准 helper,因此模型集成不应该再引入单独的 PP 专属 helper 名称或手动后置循环同步。
在 PP 模式下:
- 非末位 PP rank 在下发
IntermediateTensors后,从predict_noise_maybe_with_cfg()返回None; - 末位 PP rank 返回最终预测;启用 CFG-Parallel 时,CFG 组内的每个末位 PP rank 都拿到组合后的结果;
- Rank 0 从
scheduler_step_maybe_with_cfg()收到AsyncLatents,它只在 latents 被消费时才解析; - 未决的非阻塞发送在
diffuse()退出时自动冲刷。
Wan2.2 的diffuse()佐证:Wan22Pipeline.diffuse()(vllm_omni/diffusion/models/wan2_2/pipeline_wan2_2.py)在循环中对每个 timestep 依据boundary_timestep选择当前 Transformer 与 guidance scale,构造positive_kwargs/negative_kwargs(仅在current_guidance_scale > 1.0且存在负向 prompt embeddings 时启用 CFG),随后调用self.predict_noise_maybe_with_cfg(...)与self.scheduler_step_maybe_with_cfg(noise_pred, t, latents, do_true_cfg)——没有引入任何 PP 专属代码路径,完全符合标准去噪契约。DMD 变体(self.is_dmd)则走scheduler.predict_clean/add_noise的蒸馏路径。
Testing
使用pipeline_parallel_size > 1的离线推理脚本进行验证。
仅 PP(2 个流水线 stage):
python examples/offline_inference/text_to_video/text_to_video.py \ --model=Wan-AI/Wan2.2-TI2V-5B-Diffusers \ --width=1280 \ --height=704 \ --guidance-scale=5.0 \ --prompt="Two anthropomorphic cats in comfy boxing gear and bright gloves fight intensely on a spotlighted stage" \ --output=t2v_5B_pp2.mp4 \ --pipeline-parallel-size=2PP + CFG-Parallel 组合:
python examples/offline_inference/text_to_video/text_to_video.py \ --model=Wan-AI/Wan2.2-TI2V-5B-Diffusers \ --width=1280 \ --height=704 \ --guidance-scale=5.0 \ --prompt="Two anthropomorphic cats in comfy boxing gear and bright gloves fight intensely on a spotlighted stage" \ --output=t2v_5B_pp2_cfg2.mp4 \ --pipeline-parallel-size=2 \ --cfg-parallel-size=2命令行参数说明:
--pipeline-parallel-size表示流水线并行 stage 数(默认 1),--cfg-parallel-size表示 CFG 并行 GPU 数,二者都会传入initialize_model_parallel(...)(参见 examples/offline_inference/text_to_video/text_to_video.py 的参数解析与并行初始化代码)。--model支持本地目录或模型 ID,--width/--height/--num-frames缺省时使用模型默认值,--guidance-scale缺省时使用模型特定默认值(Wan2.2 非 DMD 默认 4.0)。
验证要点:
- 运行在 PP stage 边界不挂起;
- 输出质量与单卡基线一致(正常数值波动范围内);
- 每 GPU 峰值内存相对单 rank 模型下降;
- decode 前无未决通信错误。
源码级一致性测试
仓库在 tests/diffusion/distributed/test_pipeline_parallel.py 中提供了系统化的测试矩阵:
- 单元测试(CPU,无需进程组):
TestAsyncLatents验证延迟解析语义;TestSyncPPSend验证发送冲刷;TestDiffuseWrapper验证diffuse()在成功与异常两条路径下都会冲刷未决发送(finally语义),且包装保留原方法元数据;TestVaeDecodeGuard验证 VAE decode 包装逻辑(非首 stage 跳过 decode、多 rank 分布式 VAE 时先 broadcast 再解码)。 - MRO 约束测试:
test_pipeline_parallel_requires_cfg_mixin与test_pipeline_parallel_requires_mro_before_cfg_mixin分别验证缺少CFGParallelMixin与 MRO 顺序错误时抛出TypeError。 - 分布式一致性测试(CPU gloo / GPU NCCL):
_CPU_PREDICT_NOISE_CASES覆盖pp2-no_cfg、pp2-seq_cfg、pp2-cfg2、pp3-no_cfg;GPU 侧还覆盖 float32 与 bfloat16(容差分别为1e-5与1e-2)。测试用同一MockPipelineParallel在单进程计算基线,再与多 rank PP/CFG 拓扑对比predict_noise_maybe_with_cfg输出与scheduler_step_maybe_with_cfg返回的 rank 0 latents(后者要求与基线严格相等,rtol/atol 均为 0)。非末位 rank 断言noise_pred is None,末位 rank 断言非 None——与 Step 4 描述的返回契约完全一致。
Troubleshooting
问题:import 时TypeError—— 缺少CFGParallelMixin
症状:导入一个继承PipelineParallelMixin的流水线时抛出:
TypeError: YourPipeline inherits PipelineParallelMixin but not CFGParallelMixin.或:
TypeError: YourPipeline must inherit PipelineParallelMixin before CFGParallelMixin ...原因:PipelineParallelMixin通过__init_subclass__强制要求子类同时继承CFGParallelMixin,并在 MRO 中把PipelineParallelMixin列在前面。
解决:把CFGParallelMixin添加到流水线基类中,且位于PipelineParallelMixin之后:
from vllm_omni.diffusion.distributed.cfg_parallel import CFGParallelMixin from vllm_omni.diffusion.distributed.pipeline_parallel import PipelineParallelMixin class YourPipeline(nn.Module, PipelineParallelMixin, CFGParallelMixin): ...问题:非末位 PP rank 调用predict_noise时崩溃
症状:除首个与最后一个 PP rank 外的 rank 出现 shape 错误或缺少输入错误。
原因:模型 forward 路径假设直接输入张量,忽略了intermediate_tensors。
解决:更新 Transformerforward()或自定义predict_noise()路径,在intermediate_tensors存在时从中加载 hidden states(参见 Step 2 的标准模式)。
问题:PP 输出与单卡基线不一致
症状:PP 运行完成,但输出在数值上不一致。
原因与解决:
- 本地层切分错误
- 验证每个 rank 只运行自己的
[start_layer, end_layer)切片;
- 验证每个 rank 只运行自己的
- 非末位 rank 返回普通张量而非
IntermediateTensors- 在最后一个 PP stage 之前,一律返回
IntermediateTensors({...});
- 在最后一个 PP stage 之前,一律返回
- CFG 分支接线错误
- 启用 CFG 时,确认正/负向 kwargs 与非 PP 路径完全一致地传入(例如 Wan2.2 中
positive_kwargs/negative_kwargs的encoder_hidden_states分别对应prompt_embeds与negative_prompt_embeds,见pipeline_wan2_2.py的diffuse())。
- 启用 CFG 时,确认正/负向 kwargs 与非 PP 路径完全一致地传入(例如 Wan2.2 中
Reference Implementations
代码库中的完整参考实现:
| 组件 | 路径 | 说明 |
|---|---|---|
PipelineParallelMixin | vllm_omni/diffusion/distributed/pipeline_parallel.py | 核心 PP 通信与 scheduler 辅助方法,含AsyncLatents、__init_subclass__强制约束、diffuse()包装与 VAE decode 守卫 |
CFGParallelMixin | vllm_omni/diffusion/distributed/cfg_parallel.py | 默认predict_noise()元组归一化、combine_cfg_noise()CFG 组合公式(n + scale * (p - n))与 CFG helper 回退,另含多分支(N-branch)CFG 接口 |
| Wan2.2 transformer | vllm_omni/diffusion/models/wan2_2/wan2_2_transformer.py | 层切分(make_layers+PPMissingLayer)、IntermediateTensors、make_empty_intermediate_tensors、PP 感知权重加载(is_pp_missing_parameter)、patch embedding 与输出层按 stage 条件实例化 |
| Wan2.2 T2V 流水线 | vllm_omni/diffusion/models/wan2_2/pipeline_wan2_2.py | Wan22Pipeline的 PP + CFG 集成参考(文生视频),含boundary_ratio双 Transformer 调度、I2V 的expand_timesteps模式 |
| Wan2.2 I2V 流水线 | vllm_omni/diffusion/models/wan2_2/pipeline_wan2_2_i2v.py | Wan22I2VPipeline的 PP + CFG 集成参考(图生视频),MRO 同样为PipelineParallelMixin在CFGParallelMixin之前 |
| PP 测试 | tests/diffusion/distributed/test_pipeline_parallel.py | 基线一致性(baseline parity)与异步通信测试,覆盖 CPU 单元测试、CPU gloo 分布式测试与多 GPU NCCL 夜间测试 |
小结
在 vLLM-Omni 中为扩散流水线接入 Pipeline Parallel 的核心是一句话:让流水线继承PipelineParallelMixin(并保持其在CFGParallelMixin之前的 MRO 顺序),让 Transformer 的前向与权重加载遵守intermediate_tensors/IntermediateTensors/is_pp_missing_parameter三件套契约,其余全部交给标准去噪 helper 完成。PP 的层切分、异步isend/irecv通信、AsyncLatents延迟解析、CFG 分支的 all-gather 组合以及diffuse()退出时的发送冲刷,都由PipelineParallelMixin自动处理。以 Wan2.2 文生视频/图生视频为参照,配合VLLM_PP_LAYER_PARTITION的精确层分配与--pipeline-parallel-size/--cfg-parallel-size的运行时组合,即可将更大的扩散 Transformer 高效部署到多 GPU 环境。
【免费下载链接】vllm-omniA framework for efficient model inference with omni-modality models项目地址: https://gitcode.com/GitHub_Trending/vl/vllm-omni
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考