跳到内容

扩散模型加速概述

vLLM-Omni 支持多种缓存加速方法,以最小的质量损失来加速扩散模型推理。这些方法包括 **缓存方法**,它智能地缓存中间计算,以避免在扩散时间步长之间进行冗余工作,以及 **并行化方法**,将计算分配到多个设备上。

支持的加速方法

vLLM-Omni 目前支持两种主要的缓存加速后端

  1. TeaCache - 基于钩子的自适应缓存,当连续的时间步长相似时缓存 Transformer 计算
  2. Cache-DiT - 基于库的加速,使用多种技术
    • DBCache (双块缓存):根据残差差异缓存中间 Transformer 块的输出
    • TaylorSeer:使用基于泰勒展开的预测进行更快的推理
    • SCM (步进计算掩码):根据自适应掩码选择性地计算步进

这两种方法都可以提供显著的速度提升(通常为 **1.5x-2.0x**),同时保持高质量的输出。

vLLM-Omni 还支持扩散模型的序列并行 (SP),包括

  1. Ulysses-SP - 沿序列维度分割输入,并使用 all-to-all 通信,让每个设备只计算一部分注意力头。

快速对比

缓存方法

方法 配置 描述 最适合
TeaCache cache_backend="tea_cache" 简单的自适应缓存,配置最少 快速设置,速度/质量平衡
Cache-DiT cache_backend="cache_dit" 高级缓存,支持多种技术(DBCache, TaylorSeer, SCM) 最大加速,细粒度控制

支持的模型

下表显示了每种加速方法目前支持的模型

模型 模型标识符 TeaCache Cache-DiT Ulysses-SP
Qwen-Image Qwen/Qwen-Image
Z-Image Tongyi-MAI/Z-Image-Turbo
Qwen-Image-Edit Qwen/Qwen-Image-Edit
Qwen-Image-Edit-2509 Qwen/Qwen-Image-Edit-2509

性能基准测试

以下基准测试是在 **Qwen/Qwen-Image** 和 **Qwen/Qwen-Image-Edit** 模型生成 1024x1024 图像,进行 50 次推理步长时测量的

基准测试免责声明

这些基准测试**仅供一般参考**。所示的配置使用默认或常见的参数设置,并未针对最大性能进行详尽优化。实际性能可能会因以下因素而异:

  • 特定模型和用例
  • 硬件配置
  • 仔细的参数调整
  • 不同的推理设置(例如,步长数,图像分辨率)

为了在您的特定场景中获得最佳性能,我们建议您尝试不同的参数配置,如下面的详细指南所述。

模型 缓存后端 缓存配置 生成时间 加速比 注意事项
Qwen/Qwen-Image None None 20.0s 1.0x 基线 (diffusers)
Qwen/Qwen-Image TeaCache rel_l1_thresh=0.2 10.47s 1.91x 推荐的默认设置
Qwen/Qwen-Image Cache-DiT DBCache + TaylorSeer (Fn=1, Bn=0, W=8, TaylorSeer order=1) 10.8s 1.85x -
Qwen/Qwen-Image Cache-DiT DBCache + TaylorSeer + SCM (Fn=8, Bn=0, W=4, TaylorSeer order=1, SCM fast) 14.0s 1.43x -
Qwen/Qwen-Image-Edit None 无加速 51.5s 1.0x 基线 (diffusers)
Qwen/Qwen-Image-Edit Cache-DiT 默认 (Fn=1, Bn=0, W=4, TaylorSeer disabled, SCM disabled) 21.6s 2.38x -

为了衡量并行化方法,我们使用 **Qwen/Qwen-Image** 模型生成图像(**2048x2048** 作为长序列输入),进行 50 次推理步长,进行了基准测试。硬件设备是 NVIDIA H800 GPU。sdpa 是注意力后端。

配置 Ulysses degree 生成时间 加速比
基线 (diffusers) - 112.5s 1.0x
Ulysses-SP 2 65.2s 1.73x
Ulysses-SP 4 39.6s 2.84x
Ulysses-SP 8 30.8s 3.65x

快速入门

使用 TeaCache

from vllm_omni import Omni

omni = Omni(
    model="Qwen/Qwen-Image",
    cache_backend="tea_cache",
    cache_config={"rel_l1_thresh": 0.2}  # Optional, defaults to 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,
        "taylorseer_order": 1,
    }
)

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

使用 Ulysses-SP

运行文本到图像

from vllm_omni import Omni
from vllm_omni.diffusion.data import DiffusionParallelConfig
ulysses_degree = 2

omni = Omni(
    model="Qwen/Qwen-Image",
    parallel_config=DiffusionParallelConfig(ulysses_degree=2)
)

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

运行图像到图像

from vllm_omni import Omni
from vllm_omni.diffusion.data import DiffusionParallelConfig
ulysses_degree = 2

omni = Omni(
    model="Qwen/Qwen-Image-Edit",
    parallel_config=DiffusionParallelConfig(ulysses_degree=2)
)

outputs = omni.generate(prompt="turn this cat to a dog",
        pil_image=input_image, num_inference_steps=50)

文档

有关每种加速方法的详细信息

  • TeaCache 指南 - 完整的 TeaCache 文档、配置选项和最佳实践
  • Cache-DiT 加速指南 - 涵盖 DBCache、TaylorSeer、SCM 和配置参数的全面 Cache-DiT 指南
  • 序列并行 - 关于如何通过配置设置序列并行化的指南。