vLLM-Omni 扩散模型 Pipeline Parallel 实现指南:以 Wan2.2 文生视频/图生视频为参考的完整实践
2026/9/17 9:48:28 网站建设 项目流程

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 的pp2pp2+cfg2组合运行。


实现检查清单

为扩散流水线增加 Pipeline Parallel 支持,需要完成以下 5 个步骤(参考 pipeline_parallel.md):

  1. 继承 Mixin—— 在流水线类中把PipelineParallelMixin放在CFGParallelMixin之前继承;
  2. 让 stage 前向可续跑—— Transformer 前向路径支持intermediate_tensors输入;
  3. 返回正确的对象类型—— 非末位 PP rank 返回IntermediateTensors,末位 rank 返回最终模型输出;
  4. 使用标准去噪循环—— 调用predict_noise_maybe_with_cfg()scheduler_step_maybe_with_cfg()
  5. 测试一致性—— 将 PP 结果与单卡基线对比验证数值等价。

下文将按"原理 → 分步实现 → 测试 → 排错 → 参考实现"的顺序展开。

Overview:什么是 Pipeline Parallelism

Pipeline Parallelism 把去噪 Transformer 拆分成多个顺序阶段(sequential stages),每个阶段放在不同的 rank 上。与每个 rank 都持有完整 DiT 不同,每个 PP rank 只拥有模型层的一个切片(slice)

每个去噪步的通信模式如下:

  1. Rank 0 使用当前 latents 启动前向传播;
  2. 每个中间 rank 接收来自上一个 rank 的 hidden states,运行自己本地的层切片,并把intermediate_tensors转发给下游;
  3. 最后一个 PP rank 产生最终的 noise prediction;
  4. 最后一个 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.pypredict_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 完全一致。
  • 仅 PPpipeline_parallel_size > 1cfg_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-Parallelpipeline_parallel_size > 1cfg_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包装对象,直到张量真正被消费时才解析

这种异步设计避免了去噪步之间的不必要阻塞。当流水线类被定义时,PipelineParallelMixin会包装其diffuse()方法,并在diffuse()返回或抛异常后的finally块中调用_sync_pp_send()——这样模型代码无需显式进行 PP 清理,同时保证最后一次非阻塞 PP 发送在 decode 或后续 collective 之前完成。

异步细节:AsyncLatentsAsyncIntermediateTensors

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:继承PipelineParallelMixinCFGParallelMixin

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_statesx传入;
  • 来自上游 PP rank 的intermediate_tensors

标准模型 forward 模式:

  1. 若存在intermediate_tensors,从其中读取本地 hidden state;
  2. 只运行本 rank 的层切片;
  3. 在非末位 PP rank 上返回IntermediateTensors(...)
  4. 在末位 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_outproj_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_outoutput_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_tableoutput_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 结构transformertransformer_2),只要每个被选中的 Transformer 都遵守同一契约,PP 依然可用。Wan22Pipeline 通过boundary_ratio决定加载哪个/哪两个 Transformer(boundary_ratio=1.0只加载低噪声阶段transformer_2boundary_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=2

PP + 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)。

验证要点:

  1. 运行在 PP stage 边界不挂起;
  2. 输出质量与单卡基线一致(正常数值波动范围内);
  3. 每 GPU 峰值内存相对单 rank 模型下降;
  4. 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_mixintest_pipeline_parallel_requires_mro_before_cfg_mixin分别验证缺少CFGParallelMixin与 MRO 顺序错误时抛出TypeError
  • 分布式一致性测试(CPU gloo / GPU NCCL)_CPU_PREDICT_NOISE_CASES覆盖pp2-no_cfgpp2-seq_cfgpp2-cfg2pp3-no_cfg;GPU 侧还覆盖 float32 与 bfloat16(容差分别为1e-51e-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 返回普通张量而非IntermediateTensors
    • 在最后一个 PP stage 之前,一律返回IntermediateTensors({...})
  • CFG 分支接线错误
    • 启用 CFG 时,确认正/负向 kwargs 与非 PP 路径完全一致地传入(例如 Wan2.2 中positive_kwargs/negative_kwargsencoder_hidden_states分别对应prompt_embedsnegative_prompt_embeds,见pipeline_wan2_2.pydiffuse())。

Reference Implementations

代码库中的完整参考实现:

组件路径说明
PipelineParallelMixinvllm_omni/diffusion/distributed/pipeline_parallel.py核心 PP 通信与 scheduler 辅助方法,含AsyncLatents__init_subclass__强制约束、diffuse()包装与 VAE decode 守卫
CFGParallelMixinvllm_omni/diffusion/distributed/cfg_parallel.py默认predict_noise()元组归一化、combine_cfg_noise()CFG 组合公式(n + scale * (p - n))与 CFG helper 回退,另含多分支(N-branch)CFG 接口
Wan2.2 transformervllm_omni/diffusion/models/wan2_2/wan2_2_transformer.py层切分(make_layers+PPMissingLayer)、IntermediateTensorsmake_empty_intermediate_tensors、PP 感知权重加载(is_pp_missing_parameter)、patch embedding 与输出层按 stage 条件实例化
Wan2.2 T2V 流水线vllm_omni/diffusion/models/wan2_2/pipeline_wan2_2.pyWan22Pipeline的 PP + CFG 集成参考(文生视频),含boundary_ratio双 Transformer 调度、I2V 的expand_timesteps模式
Wan2.2 I2V 流水线vllm_omni/diffusion/models/wan2_2/pipeline_wan2_2_i2v.pyWan22I2VPipeline的 PP + CFG 集成参考(图生视频),MRO 同样为PipelineParallelMixinCFGParallelMixin之前
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),仅供参考

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

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

立即咨询