从"猜"到"量":CalibAtt 如何用 64 个 prompt 重建视频注意力的稀疏地图
你有没有想过,为什么视频生成模型这么慢?
一段 5 秒的 720p 视频,Wan 2.1 14B 要跑 20 分钟。但如果你去看 GPU 利用率,会发现一个尴尬的事实:大部分算力花在了乘以零上。 注意力矩阵里,90% 以上的元素接近零,但 dense attention 还是老老实实地把它们全算了一遍。
Apple 和特拉维夫大学 2026 年 3 月的这篇论文,标题叫 "Accelerating Text-to-Video Generation with Calibrated Sparse Attention",方法叫 CalibAtt。它的核心思想一句话能说清楚:别猜哪些注意力连接重要,去量一下。
但"量一下"这三个字背后的工程细节,比你想的精妙得多。
一、能量视角:不是所有连接都值得算
CalibAtt 的核心数学工具是一个叫"block 能量"的东西。把 $N \times N$ 的注意力矩阵 $\mathbf{P}$ 切成 $B \times B$ 的 block($B=128$),每个 block 的能量定义为:
$$\mathbf{E}_{r,c} = \frac{1}{B} \sum_{i \in \mathcal{I}_r} \sum_{j \in \mathcal{J}_c} \mathbf{P}_{ij}$$
直觉上,这就是"query block $r$ 里有 $B$ 个 query,它们对 key block $c$ 里的 $B$ 个 key 的平均关注程度"。因为 post-softmax 的 $\mathbf{P}$ 每行和为 1,所以每个 query block-row 的能量加起来等于 1。
有了能量,选择策略就很自然了:对每个 query block,贪心地选最少的 key block,让累计能量达到阈值 $\epsilon$。 这是一个经典的"最小覆盖"问题,贪心算法给出最优解。
阈值 $\epsilon(t)$ 随时间步变化:早期(高噪声)用 0.99(几乎全保留),后期可以放松到 0.84。指数衰减调度:
$$\epsilon(t) = A + (C-A) \exp(-kt/T)$$
这个设计很聪明。早期时间步的误差会通过扩散过程传播放大——你在 $t=0$ 跳过的一个 block,会影响后面所有时间步的输入。所以早期保守、后期激进,是唯一合理的选择。
二、跨 prompt 聚合:64 个样本就够了
单 prompt 的 mask 不够用——你不知道这个 mask 是"这个 prompt 特有的"还是"所有 prompt 共享的"。所以 CalibAtt 跑 64 个校准 prompt,对每个 $(t, l, h)$ 组合:
1. 每个 prompt 生成一个二值 mask $\mathbf{M}_p^{(t,l,h)}$ 2. 跨 prompt 平均:$\bar{\mathbf{M}}^{(t,l,h)} = \frac{1}{64} \sum_p \mathbf{M}_p^{(t,l,h)}$ 3. 用阈值 $\rho = 0.5$ 二值化
这里有个关键问题:64 个 prompt 够吗? 论文的图 3(b) 给出了答案。Block keep-rate 的直方图呈强双峰分布——大部分 block 要么 keep-rate 接近 0(几乎从不被选),要么接近 1(几乎总是被选)。中间地带很少。这意味着 64 个样本已经足以稳定地识别出哪些 block 是"数据无关地不重要"。
更妙的是,这种双峰分布意味着阈值 $\rho$ 的选择不敏感。从 0.3 到 0.7,结果几乎一样——因为大部分 block 的 keep-rate 本来就不在 0.5 附近。这是 CalibAtt 鲁棒性的根源。
三、两种加速策略的互补性:负相关的妙处
CalibAtt 有两条加速路线:
路线一:Block 稀疏化。 跳过低能量 block,用 skip list 告诉 FlashAttention3 kernel 哪些要算。
路线二:空间行重复。 对某些 head,同一帧内不同空间行的注意力模式几乎一样。只算 $k=5$ 个"锚点行",广播给其他行。
论文最优雅的发现是:这两条路线负相关。 空间重复性高的 head,block 稀疏度低;block 稀疏度高的 head,空间重复性低。
为什么?因为它们对应两种不同的注意力功能:
- 高 block 稀疏的 head:在做"帧内注意力"——同一帧内的 token 关注彼此,不同位置关注不同地方,所以 block 级别看起来稀疏(每个 query 只关注少数 key)
- 高空间重复的 head:在做"帧间注意力"——当前帧的所有 token 关注同一组其他帧的 token,所以空间行之间模式一致,但 block 级别不稀疏(因为所有行关注的是同一组 key block)
四、和现有方法的本质区别
把 CalibAtt 放在现有方法的坐标系里看,差异更清晰:
| 方法 | 决策时机 | 决策依据 | 超参数敏感度 |
|---|---|---|---|
| Radial Attention | 离线(固定) | 空间距离先验 | 中(窗口大小) |
| SpargeAttention | 在线 | 压缩 Q/K 估计 | 高(阈值) |
| SVG2 | 在线 | 聚类质心 | 中(聚类数) |
| CalibAtt | 离线(校准) | 实测能量 | 低(双峰分布) |
代价是什么?一次性校准成本。 论文没给出具体时间,但从 64 个 prompt × 50 时间步 × 40 层 × 40 头来看,估计在 10-20 分钟量级。这个成本是一次性的——校准完之后,同一个模型+分辨率+帧数的配置可以反复用。
五、实验数据的细节
论文的 Table 1 有几个容易被忽略的细节:
1. 720p 的加速比高于 480p。 Wan 2.1 14B 720p 是 1.58×,480p 是 1.45×。因为序列更长($N$ 更大),attention 在总时间里占比更高,稀疏化的收益更大。这暗示 CalibAtt 在更长序列(1080p、更多帧)上可能收益更高。
2. Mochi 1 的加速比只有 1.16×。 远低于 Wan 2.1。论文解释是 Mochi 1 的 attention 在总推理时间中占比更小。这说明 CalibAtt 不是万灵药——如果瓶颈不在 attention,加速就有限。
3. VBench 质量分略升。 这不是统计噪声。CalibAtt 在三个模型上的 VBench Total 都不低于 dense baseline。可能的解释:跳过的低能量连接本身可能携带高频噪声,稀疏化相当于一种隐式去噪。
4. 在少步蒸馏模型上也有效。 LightX2V(4 步 Wan 2.1)上 CalibAtt 依然有效,虽然加速比略低。只有 4 个时间步意味着校准粒度变粗,但每个时间步的 mask 依然准确。
六、工程实现的关键决策
论文的工程部分有几个值得学习的决策:
1. skip list 而非 mask 矩阵。 推理时不传 $N_B \times N_B$ 的二值矩阵,而是传"要算的 block 区间列表"。这对 GPU kernel 更友好——连续内存访问比随机访问快得多。
2. 基于 FlashAttention3 实现。 不是另起炉灶,而是在 FA3 的 block 循环里加一个"这个 block 要不要算"的判断。这意味着 CalibAtt 可以和 FA3 的其他优化(如 FP8、异步 softmax)叠加。
3. 校准和推理分离。 校准用自定义 CUDA kernel(只统计能量,不 materialize 完整 $\mathbf{P}$),推理用修改版 FA3。两个阶段用不同的 kernel,各自优化。
4. 空间重复用标准 FA3 + 广播。 不需要特殊 kernel,用标准 FA3 算 $k$ 个锚点行,然后用 gather/scatter 广播。简单但有效。
七、对行业的启示
CalibAtt 的意义超出"视频生成快了 1.5 倍"。它提出了一个方法论:
先测量,再优化。 在深度学习系统优化中,我们太习惯用先验("attention 应该是 local 的""早期层更重要")来指导优化。但这些先验在不同模型、不同任务上可能不成立。CalibAtt 的做法是:花 20 分钟跑校准,用实测数据驱动优化决策。
这个思路可以推广到其他场景:
- LLM 推理:不同层的 attention pattern 差异更大,校准可能更有价值
- 多模态模型:不同模态的 attention 行为完全不同,固定 mask 肯定不行
- 长上下文模型:序列越长,稀疏化收益越大,校准的成本回报比越高
但作为一个"几乎零成本就能拿到 1.5 倍加速"的方法,CalibAtt 值得每个做视频生成的团队认真看。论文没提供公开代码,但方法描述足够详细,有 CUDA kernel 经验的工程师应该能在一两周内复现。
---
*论文:arXiv:2603.05503 — Accelerating Text-to-Video Generation with Calibrated Sparse Attention (Yehezkel, Yadin, Elata, Ostrovsky-Berman, Kawar; Apple & Tel Aviv University, 2026)*