让扩散推理更快

我们很高兴宣布 vLLM-Omni 的一次重要性能更新。

vLLM-Omni 现在支持多种缓存加速方法,可以在尽量不牺牲生成质量的前提下,加速扩散模型推理,例如 Cache-DiTTeaCache。这些缓存方法会智能缓存中间计算结果,从而避免在扩散 timestep 之间重复做同样的工作。

通过这次更新,用户现在可以在图像生成任务中实现 1.5 倍到 2 倍以上的加速,而且配置改动非常小,画质损失也几乎可以忽略。

瓶颈:扩散中的冗余计算

扩散模型最出名的特点之一,就是算得非常重。生成一张图片通常需要几十个推理步骤,而相邻步骤处理的特征往往又非常相似。

vLLM-Omni 现在正是利用了这种时间冗余。通过缓存并复用中间计算结果,我们可以在后续步骤中跳过昂贵计算,而不需要重新训练模型。

两种强大的加速后端

vLLM-Omni 现在支持两种不同的缓存后端,可以分别满足不同的使用需求:

1. Cache-DiT:更强控制力与更高性能上限

Cache-DiT 是一个更完整的库级加速方案,提供了一整套偏“重型”的优化手段来最大化效率:

  • DBCache(Dual Block Cache):根据残差差异智能缓存 Transformer block 的输出
  • TaylorSeer:利用基于泰勒展开的预测来推断特征,进一步减少计算量
  • SCM(Step Computation Masking):通过自适应 masking,选择性跳过某些计算步骤

2. TeaCache:简单且自适应

TeaCache 已经原生集成在 vLLM-Omni 中,提供了一种基于 hook 的自适应缓存机制。它会监控输入之间的差异,并动态决定是否复用上一个 timestep 的 Transformer 计算结果。

性能基准

我们在 NVIDIA H200 GPU 上,使用 Qwen-Image(1024x1024 生成)对这些方法做了基准测试,结果如下:

模型 后端 配置 用时 加速比
Qwen-Image 基线 None 20.0s 1.0x
Qwen-Image TeaCache rel_l1_thresh=0.2 10.47s 1.91x
Qwen-Image Cache-DiT DBCache + TaylorSeer 10.8s 1.85x
No Cache

No Cache

TeaCache

TeaCache

Cache-DiT

Cache-DiT

“Edit” 模型

在图像编辑任务上,Cache-DiT 的优势更加明显。对于 Qwen-Image-Edit,Cache-DiT 实现了 2.38 倍加速,生成时间从 51.5 秒降到仅 21.6 秒。

模型 后端 配置 用时 加速比
Qwen-Image-Edit 基线 None 51.5s 1.0x
Qwen-Image-Edit TeaCache rel_l1_thresh=0.2 35.0s 1.47x
Qwen-Image-Edit Cache-DiT DBCache + TaylorSeer 21.6s 2.38x
No Cache

No Cache

TeaCache

TeaCache

Cache-DiT

Cache-DiT

这些缓存优化技术在异构平台上也同样表现亮眼。例如,在昇腾 NPU 上,Qwen-Image-Edit 推理通过 Cache-DiT 从 142.38 秒降到 64.07 秒,获得了超过 2.2 倍加速。

支持的模型

模型 TeaCache Cache-DiT
Qwen-Image
Z-Image
Qwen-Image-Edit

快速开始

在 vLLM-Omni 中启用缓存加速非常直接:初始化 Omni 类时指定 cache_backend 即可。

使用 TeaCache 加速

from vllm_omni import Omni

omni = Omni(
    model="Qwen/Qwen-Image",
    cache_backend="tea_cache",
    cache_config={"rel_l1_thresh": 0.2} 
)

outputs = omni.generate(prompt="A cat sitting on a windowsill", num_inference_steps=50)

使用 Cache-DiT 加速

from vllm_omni import Omni

omni = Omni(
    model="Qwen/Qwen-Image",
    cache_backend="cache_dit",
    cache_config={
        "Fn_compute_blocks": 1,
        "Bn_compute_blocks": 0,
        "max_warmup_steps": 8,
        "enable_taylorseer": True, # Enable Taylor expansion forecasting
        "taylorseer_order": 1,
    }
)

outputs = omni.generate(prompt="A cat sitting on a windowsill", num_inference_steps=50)

了解更多

如果你想继续优化扩散推理流水线,可以参考以下详细文档:

除了缓存加速之外,我们还在持续推进并行化、kernel fusion 和量化方面的优化。后续还会有更多能力更新。

参考链接