vLLM-Omni 扩散缓存加速
加速你的扩散推理
我们很高兴地宣布 vLLM-Omni 的一项重大性能更新。
vLLM-Omni 现在支持各种缓存加速方法,以最小的质量下降加速扩散模型推理,例如 Cache-DiT 和 TeaCache。这些缓存方法智能地缓存中间计算,以避免在扩散时间步中进行冗余工作。
通过此更新,用户现在可以在图像生成任务中实现 1.5倍到2倍以上的加速,且配置极少,质量损失可忽略不计。
瓶颈:扩散中的冗余
扩散模型以其高计算成本而闻名。生成一张图像需要几十个推理步骤。然而,相邻步骤通常处理非常相似的特征。
vLLM-Omni 现在利用了这种时间冗余。通过智能地缓存和重用中间计算结果,我们可以在后续步骤中跳过昂贵的计算,而无需重新训练模型。
两个强大的加速后端
vLLM-Omni 现在支持两种不同的缓存后端,以满足你的特定需求
1. Cache-DiT:高级控制 & 最大性能
Cache-DiT 是一个全面的基于库的加速解决方案。它提供了一套复杂的技巧来最大化效率
- DBCache(双块缓存):根据残差差异智能地缓存 Transformer 块输出。
- TaylorSeer:利用基于泰勒展开的预测来预测特征,进一步减少计算负载。
- SCM(步计算掩码):应用自适应掩码以选择性地跳过计算步骤。
2. TeaCache:简单 & 自适应
TeaCache 在 vLLM-Omni 内部原生实现,提供了一种基于钩子的自适应缓存机制。它监控输入之间的差异,并动态决定何时重用前一个时间步的 transformer 计算。
性能基准
我们使用 Qwen-Image(1024x1024 生成)在 NVIDIA H200 GPU 上对这些方法进行了基准测试。结果令人印象深刻
| 模型 | 后端 | 配置 | 时间 | 加速比 |
|---|---|---|---|---|
| Qwen-Image | 基线 | 无 | 20.0秒 | 1.0倍 |
| Qwen-Image | TeaCache | rel_l1_thresh=0.2 |
10.47秒 | 1.91倍 ⚡ |
| Qwen-Image | Cache-DiT | DBCache + TaylorSeer | 10.8秒 | 1.85倍 ⚡ |
无缓存
TeaCache
Cache-DiT
“编辑”模型
对于图像编辑任务,Cache-DiT 表现更为出色。在 Qwen-Image-Edit 上,Cache-DiT 实现了惊人的 2.38倍加速,将生成时间从 51.5秒 缩短到仅 21.6秒。
| 模型 | 后端 | 配置 | 时间 | 加速比 |
|---|---|---|---|---|
| Qwen-Image-Edit | 基线 | 无 | 51.5秒 | 1.0倍 |
| Qwen-Image-Edit | TeaCache | rel_l1_thresh=0.2 |
35.0秒 | 1.47倍 ⚡ |
| Qwen-Image-Edit | Cache-DiT | DBCache + TaylorSeer | 21.6秒 | 2.38倍 ⚡ |
无缓存
TeaCache
Cache-DiT
这些缓存优化技术在异构平台(如昇腾 NPU)上也显示出同样令人印象深刻的结果。例如,使用 Cache-DiT 将 Qwen-Image-Edit 在昇腾 NPU 上的推理时间从 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)
了解更多
准备好加速你的扩散管道了吗?查看我们的详细文档以获取高级配置
除了缓存,我们还在积极开发并行化、内核融合和量化方面的优化。敬请期待更强大的功能!