扩散模型加速概述¶
vLLM-Omni 支持多种缓存加速方法,以最小的质量损失来加速扩散模型推理。这些方法包括 **缓存方法**,它智能地缓存中间计算,以避免在扩散时间步长之间进行冗余工作,以及 **并行化方法**,将计算分配到多个设备上。
支持的加速方法¶
vLLM-Omni 目前支持两种主要的缓存加速后端
- TeaCache - 基于钩子的自适应缓存,当连续的时间步长相似时缓存 Transformer 计算
- Cache-DiT - 基于库的加速,使用多种技术
- DBCache (双块缓存):根据残差差异缓存中间 Transformer 块的输出
- TaylorSeer:使用基于泰勒展开的预测进行更快的推理
- SCM (步进计算掩码):根据自适应掩码选择性地计算步进
这两种方法都可以提供显著的速度提升(通常为 **1.5x-2.0x**),同时保持高质量的输出。
vLLM-Omni 还支持扩散模型的序列并行 (SP),包括
- 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 指南
- 序列并行 - 关于如何通过配置设置序列并行化的指南。