本文先精读 SeaCache(CVPR 2026 Oral) 这篇训练无关的扩散加速工作------它的动机、频谱演化洞察、SEA 滤波器推导、缓存调度与实验;最后再附上我自己的一次复现与改进尝试作为收尾。
一、背景:扩散模型为什么慢,缓存怎么救
扩散模型生成质量很高,但推理慢的根因在于去噪是串行的 ------几十步必须一步接一步算。一类训练无关(training-free)的加速思路是特征缓存:相邻时间步的网络中间特征变化不大,于是可以跳过部分步骤、直接复用上一次算好的残差。
这条线上的代表是 TeaCache:它用「时间步调制后的输入特征」的相对 L1 距离作为指标,累计变化超过阈值才重算,否则复用上一步残差。
SeaCache 指出 TeaCache 的核心问题:它依赖原始特征差,把「内容」和「噪声」纠缠在了一起 。这忽视了扩散过程一个重要的规律------频谱演化。
二、核心洞察:频谱演化(Spectral Evolution)
扩散去噪沿着轨迹有一个清晰的频率规律:
- 早期步骤(高噪声):先建立低频的整体结构;
- 后期步骤(低噪声):再细化高频的细节。
对应到信号与噪声:
- 信号(内容相关) :与干净样本对齐,主要集中在低频;
- 噪声(随机成分) :集中在高频。
也就是说,不同时间步、不同频段的「信噪比」是不一样的。用一个对所有频率一视同仁的原始特征距离来判断要不要缓存,会被高频噪声带偏 ------产生与内容保真无关的虚假距离信号。SeaCache 的目标就是:先把噪声频段压下去、保留内容频段,再算距离。
三、SEA 滤波器:从扩散前向过程推出的 Wiener 滤波(论文核心)
SeaCache 的理论核心,是从扩散前向加噪模型出发,推导一个频谱演化感知(Spectral-Evolution-Aware, SEA)滤波器。
3.1 推导
前向加噪:
x_t = a_t · x_0 + b_t · ε, ε ~ N(0, I)
考虑最优线性 MMSE 去噪器,最小化 J_t(h_t) = ||h_t * x_t − x_0||²。在频域分析下,最优响应是一个 Wiener 形式:
G_t(f) = ( a_t · S_x(f) ) / ( a_t² · S_x(f) + b_t² )
其中 S_x(f) 是干净样本的功率谱,论文用幂律近似 S_x(f) = 1 / (|f|^p + ε)(图像 p=2,视频 p=3)。
这个滤波器是时间步自适应的:
- 早期(a_t 小):强烈压制高频,只放行低频结构;
- 后期(a_t 大):逐渐打开高频,让细节通过。
这恰好和频谱演化的规律对齐。
3.2 归一化(容易被忽略但很关键)
原始 G_t 的整体增益随时间步漂移,会让不同步之间的距离不可比。SeaCache 强制平均增益恒定来归一化:
ν_t = ( (1/L) · Σ_{f} G_t(f) )^(-1)
G_t^norm(f) = ν_t · G_t(f)
这样滤波后特征的能量在全轨迹保持稳定,距离度量才有意义。
3.3 应用
对中间特征 I_t 做 FFT → 乘滤波器 → iFFT:
P(G_t, I_t) = iFFT( G_t(f) ⊙ FFT(I_t) )
四、缓存调度:把距离换成 SEA 滤波后的距离
SeaCache 把 TeaCache 的原始距离替换为 SEA 滤波后的相对 L1:
Δ̃_t = L1_rel( P(G_t^norm, I_t), P(G_{t-1}^norm, I_{t-1}) )
L1_rel(a, b) = ||a − b||₁ / (||b||₁ + ξ)
然后累计这个距离,直到超过阈值 δ 才触发重算并清零累加器,否则复用残差:
Σ_{s=t_a}^{t_b−1} Δ̃_s ≤ δ < Σ_{s=t_a}^{t_b} Δ̃_s
阈值 δ 控制激进程度:δ 小 → 重算多、质量高;δ 大 → 复用多、速度快。
两个实用亮点:
- 零额外超参:滤波器参数完全由调度器的 (a_t, b_t) 决定,不用调保留比例之类的系数;
- 开销极低 :FFT/iFFT 仅占总推理约 0.2%;
- 还能和高效注意力、块级缓存等正交加速叠加。
另外论文观察到一个很漂亮的现象:SeaCache 会自动把重算集中在早期步骤(频谱变化最大处),无需手动设置「强制前几步计算」。
五、实验结果
在相同刷新率(≈相同算力)下,SeaCache 的质量显著优于 TeaCache / TaylorSeer:
| 模型(≈50% 刷新) | TeaCache | TaylorSeer | SeaCache |
|---|---|---|---|
| FLUX (T2I) PSNR | 20.76 | 22.78 | 26.29 |
| HunyuanVideo PSNR | 23.40 | 24.14 | 32.39 |
| Wan2.1-1.3B PSNR | 20.84 | 16.15 | 26.60 |
延迟(FLUX,RTX PRO 6000):原始 18.0s → SeaCache δ=0.3 9.4s → δ=0.6 6.4s。
消融结论(都重要,缺一不可):
- 用互补滤波 (1−SEA):更差(只看噪声不看信号);
- 去掉归一化:PSNR 下降(幅度跨步漂移);
- 用静态低通(固定 30% 截止):明显更差 → 时间步依赖的动态滤波至关重要。
支持模型:Wan2.1(T2V/I2V)、HunyuanVideo(T2V)、FLUX(T2I)。
六、工程实现要点(源码视角)
官方实现结构很轻量,每个模型目录两个文件:
util_seacache.py(三模型完全相同):SEA 滤波核心ab_from_scheduler(scheduler, idx):从 diffusers 调度器取 (a_t, b_t)(支持 flow matching 与 VP/DDPM);apply_sea_from_ab(x, a, b, ...):N 维可分离 Wiener 滤波(逐轴构建 1D 增益再相乘);rel_l1(a, b):相对 L1。
seacache_generate.py:用 monkey-patch 把 transformer 的forward换成带 SEA 门控的版本。
几个模型相关差异值得注意:
| FLUX | HunyuanVideo | Wan2.1 | |
|---|---|---|---|
| SEA 维度 | 2D (-2,-3) | 3D (-2,-3,-4) | 3D (-2,-3,-4) |
| power_exp | 2.0 | 3.0 | 3.0 |
| 缓存路径 | 单路 | 单路 | 双路(偶=cond/奇=uncond) |
Wan2.1 因为跑 CFG(条件 + 无条件交替前向),所以维护两套独立缓存状态 ,步计数器跑 0..2N−1,首尾若干步强制计算(retention/cutoff),中间走累计门控。
七、附:我的一次复现与改进尝试(收尾)
复现跑通后(Wan2.1-T2V-1.3B,832×480,50 步),我想试试还能不能更进一步,按三个正交杠杆系统地砸了一遍:
- 调度(何时缓存) :试了 LogSNR 归一化阈值、Wiener 比值残差预测------都输给固定阈值。固定阈值有个隐藏优点:早期残差变化大、一定超阈值被强制算,天然保护了关键步骤。
- 复用(跳步用什么值) :所有方法都是零阶
x += 上一次残差。我发现两件有意思的事:① 想用门控信号 Δφ 去一阶修正复用值------失败,cos(ΔR, Δφ)≈0,方向完全不相关;② 残差时序外推在 ≤2× 加速下能稳定 +0.35dB(无参数、可叠加) ,但 >2.4× 激进缓存时会过冲翻车 (这恰好解释了 SeaCache 为何能胜过 Taylor 式外推的 TaylorSeer)。一个反直觉的发现:采样器对残差的幅度误差部分免疫、却会传播方向误差,所以开环看主导的幅度修正、到闭环里反而被吃掉。 - 粒度(逐 block) :单个 block 残差步间变化高达 0.10~0.27,而整栈只有 0.04~0.06------时序冗余是整栈的「聚合涌现」属性(单 block 剧烈波动但互相抵消),所以逐 block 缓存利用不了它。
结论:纯缓存杠杆很难大幅超越 SeaCache。根因链条是------冗余是聚合的 → SeaCache 门控已近最优地提取它 → 采样器吸收复用误差 → 单 block 又互相抵消。SeaCache 确实站在了一个很硬的前沿上。
这次探索也再次印证一个方法论:先 dump 全量轨迹做离线(开环)秒级排名,只对胜出者跑昂贵的闭环验证;并用「用真值的诊断上界」定位误差来源。把一个强基线为什么强搞清楚,本身就是值得的。
参考:SeaCache: Spectral-Evolution-Aware Cache for Accelerating Diffusion Models (arXiv:2602.18993)。本文公式与数据来自论文与官方实现,改进尝试部分为作者自测,仅供交流。