SeaCache(CVPR 2026 Oral):频谱演化感知缓存,训练无关加速扩散模型

本文先精读 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)。本文公式与数据来自论文与官方实现,改进尝试部分为作者自测,仅供交流。