FlexCache
FlexCache 为不同特征复用方法提供统一配置、生命周期和统计接口。它只作用于一次
generate(),请求结束或发生异常时会恢复所有临时 hook。
基本原理
扩散模型相邻去噪步骤的中间特征通常相近。缓存策略在 fresh step 执行原始计算并保存 结果,在 reuse step 跳过部分计算,用残差、历史输出或预测值代替。
CacheSession 在请求开始时定位模型、block 和 attention site,并只包装当前 pipeline
实例。串行 CFG 的 conditional 与 unconditional 分支分别保存状态,因此不会读取对方
的 tensor。
FlexCache 可用于单卡、静态 NCCL CP 和静态 Fast CP。缓存层不创建 process group, 也不选择并行布局。同一 CP lane 的所有 rank 根据 step、timestep 或完整序列 probe 做出相同 fresh/reuse 决定,避免 collective 控制流分叉。
优化方案
| 策略 | 复用对象 | 当前支持 |
|---|---|---|
| MagCache | image-token backbone residual | FLUX.1、Qwen-Image、Wan 1.3B 的官方 profile |
| MeanCache | CFG 合并后的 prediction 与 scheduler state | Z-Image、Qwen-Image,固定 50 steps |
| TeaCache | block-group residual | FLUX.1、Wan 1.3B/14B 的默认标定 |
| TaylorSeer | attention、MLP 和 projection 的 Taylor 预测值 | Z-Image、FLUX.1、Qwen-Image、Wan |
| PAB | 按周期复用 attention 输出 | Z-Image、FLUX.1、Qwen-Image、Wan |
MagCache
MagCache 根据模型预先标定的 magnitude-ratio profile 生成 reuse 日程。fresh step 保存 整个 image-token backbone 的 residual,reuse step 在第一个 block 注入 residual,并 跳过后续 block。
MeanCache
MeanCache 在 scheduler 边界保存 CFG 合并后的 prediction、latents 和 sigma 历史。 reuse step 使用 sigma-JVP 外推 prediction,再执行正常 scheduler step。它不修改 transformer block。
TeaCache、TaylorSeer 和 PAB
TeaCache 根据 modulation probe 的累计变化决定是否复用 block-group residual。 TaylorSeer 用有限差分和 Taylor 展开预测 block 内部输出,计算量更低,但缓存 tensor 较多。PAB 按 attention 类型和周期复用输出,MLP 仍正常执行。
每种方法都改变数值轨迹。profile、threshold、fresh step 数或周期改变后,需要重新测量 质量和延迟。
优化结果
以下结果均来自单张 NVIDIA H20、BF16,并相对相同 ChituDiffusion backend、prompt 和 seed 的无缓存结果。不同模型和策略的工作负载不同,不能横向比较。
MagCache
| 模型与配置 | 无缓存 | MagCache | 加速 | PSNR / LPIPS |
|---|---|---|---|---|
| FLUX.1,1024²,28 steps | 24.83s | 8.31s | 2.99x | 17.06 / 0.2963 |
| Qwen-Image,1664×928,50 steps | 100.45s | 73.27s | 1.37x | 35.90 / 0.0172 |
| Wan 1.3B,480×832×81 帧,50 steps | 263.69s | 116.49s | 2.26x | 16.00 / 0.2043 |
MeanCache
测试使用 512²、50 steps、seed 42。fresh 表示 50 个步骤中执行完整模型的步骤数。
| 模型 | fresh | 加速 | PSNR |
|---|---|---|---|
| Z-Image | 25 / 17 / 13 | 2.26x / 2.83x / 4.23x | 29.25 / 24.90 / 19.76 |
| Qwen-Image | 25 / 17 / 10 | 2.07x / 2.65x / 4.73x | 31.15 / 30.11 / 27.44 |
仓库目前没有条件一致的 TeaCache、TaylorSeer 和 PAB 评测,因此不提供这三种方法的 性能结论。
使用示例
CLI 使用 MagCache:
chitu generate \
--model wan \
--model-path /path/to/Wan2.1-T2V-1.3B \
--steps 50 \
--cache-strategy magcache \
--output outputs/wan-magcache.mp4
Python API 使用 MeanCache:
import torch
from chitu_diffusion import (
CacheConfig,
MeanCacheConfig,
ZImagePipeline,
ZImageRequest,
)
pipeline = ZImagePipeline.from_pretrained(
"/path/to/Z-Image",
torch_dtype=torch.bfloat16,
cache=CacheConfig(
strategy="meancache",
params=MeanCacheConfig(fresh_steps=25),
),
)
try:
result = pipeline.generate(
ZImageRequest(
prompt="a red cube on a white table",
num_steps=50,
seed=7,
)
)
if pipeline.parallel_context.rank == 0:
result.images[0].save("zimage-meancache.png")
print(pipeline.last_cache_stats)
finally:
pipeline.close()
EPE serve 不接受 FlexCache 配置。当前缓存状态是 request-local,不能跨排队请求或
动态 lane 共享。