AdaCluster: Adaptive Query-Key Clustering for Sparse Attention in Video Generation¶
会议: CVPR 2026
arXiv: 2604.18348
代码: https://github.com/USTC-MLSys-Team/Adacluster (有)
领域: 视频生成 / 扩散模型 / 推理加速 / 稀疏注意力
关键词: 视频 DiT、稀疏注意力、Token 聚类、训练无关加速、Top-K 注意力
一句话总结¶
AdaCluster 是一个训练无关的稀疏注意力框架,针对视频 DiT 中 query 和 key 在注意力里扮演的不同角色,分别用「角度聚类」压缩 query、用「逐层自适应多阶段 K-means」聚类 key,再配合可跑在 Tensor Core 上的 TensorQuest 快速选关键簇,在 CogVideoX-2B / HunyuanVideo / Wan-2.1 上实现 1.67×–4.31× 端到端加速且画质几乎无损(PSNR 最高 30.99)。
研究背景与动机¶
领域现状:视频扩散 Transformer(DiT)已经是高保真视频生成的主流范式,但推理极慢——注意力复杂度随序列长度平方增长,而视频的序列长度等于「帧数 × 高 × 宽」,动辄 70K~180K token。作者实测 CogVideoX-2B 在单张 A40 上生成 81 帧 720p 视频要 1691 秒,其中注意力就占了 75% 的时间。要让 DiT 落地,必须把注意力这块的计算砍下来。
现有痛点:现有稀疏注意力大体分两条路。一类是「分块」方法(如 SpargeAttn),把连续 token 切成定长块、用块均值当代表——但连续的 token 在嵌入空间里未必语义相近,某些 token 离块代表很远,估计就不准。另一类是「聚类」方法(如 SVG2),用聚类保证同组内 token 更相似,理论上更准;但 SVG2 对 query 和 key 一视同仁,都用同一套基于欧氏距离的聚类,并且把簇数写死(所有模型/层统一 100 个 query 簇 + 500 个 key 簇)。
核心矛盾:作者观察到两个被忽略的事实。其一,query 和 key 在注意力里角色不同、分布也很不一样——query 只需保住「相对打分」的排序,而 key 的方向和长度都直接影响 Top-K 结果,二者本不该用同一种聚类。其二,不同层的 token 分布松紧差异巨大(图 2/图 4 的 compactness score 在层间相差很多),有的层高度分散需要更多簇甚至不适合聚类,有的层很集中、少量簇就够;用统一簇数必然「该细的没细、该粗的浪费」,最终漏掉关键 token、掉画质。
本文目标:在不训练、不改权重的前提下,(1) 给 query/key 设计各自合适的聚类策略以提高压缩率,(2) 让 key 的簇数随层自适应,(3) 聚类后还能高效且不漏地把关键 token 选出来。
核心 idea:对「先聚类、再选簇」这条管线做角色感知重设计——query 走角度聚类拿高压缩率,key 走逐层自适应的多阶段聚类保欧氏紧致度,关键簇选择用等价但能上 Tensor Core 的 TensorQuest 加速。
方法详解¶
整体框架¶
AdaCluster 接收一层注意力的 \(Q, K, V\),对 query 和 key 走两条不同的聚类路径,最后只在被选中的少量「关键簇」上做注意力,从而把 \(O(L^2)\) 的全注意力压成稀疏计算。具体地:query 先归一化再做标准 KMeans(角度聚类);key 走多阶段 K-means,顺带判定「这一层是否值得压缩」;对值得压缩的层,用 TensorQuest 估计每个 key 簇对当前 query 的重要性、取 Top-K 簇内的 token 算注意力;对那些怎么聚都不紧致的「难压缩层」,直接回退成 FlashAttention 全注意力以保精度。整个过程训练无关,只在推理时按层动态决策。
%%{init: {'flowchart': {'rankSpacing': 24, 'nodeSpacing': 28, 'padding': 6, 'wrappingWidth': 400}}}%%
flowchart TD
A["输入 Q / K / V"] --> B["Query 角度聚类<br/>归一化后压缩查询"]
A --> C["Key 多阶段自适应聚类<br/>逐层定簇数"]
C -->|该层难压缩| D["回退全注意力"]
C -->|可压缩| E["TensorQuest<br/>选 Top-K 关键簇"]
B --> E
E --> F["稀疏注意力<br/>输出"]
D --> F
关键设计¶
1. Query 角度聚类:归一化到单位球再聚类,换更高压缩率
痛点是 query 向量分布在高维空间、模长差异极大,直接在原始空间聚类很难,只能拿到有限的压缩率。作者用了一个关键性质:对任意 query \(q\),query-key 打分 \(s\) 的相对大小与 \(q\) 的模长无关——也就是说,决定「哪个 key 重要」的只是方向,不是长度。基于此,AdaCluster 先把 query 归一化到单位球,再用归一化后的 query 去衡量 key 的重要性。归一化后 query 分布变得紧凑得多(图 3),于是能用很高的压缩率聚类。本质上这是把「欧氏距离聚类」换成了「角度(cosine)聚类」:只要角度接近就归为一簇,比 SVG2 对 query 也用欧氏聚类高效得多,实验里固定到 65 个 query 簇即可。
2. Key 多阶段自适应聚类:逐层动态定簇数,按紧致度收敛
key 这边不能照搬 query 的偷懒——key 的方向和长度都影响 Top-K 结果,必须保住欧氏相似性。理由可由上界给出:设 \(c(k)\) 是 \(k\) 聚类后的簇心,则对任意 \(q\) 有
只要同簇内 token 足够紧致(\(\|k-c(k)\|\) 很小),就能用簇心打分 \(q^{\top}c(k)\) 近似真实打分 \(q^{\top}k\),从而「只比较簇、不比较每个 key」。所以簇内紧致度直接决定关键 key 能否被选中。但不同层分布松紧差别很大,统一簇数行不通。作者用层级的紧致度量化:对每个 head 算重建误差 \(\mathrm{MSE}^{i}_{l}=\frac{1}{N}\sum \|k^{i}_{l}-c(k^{i}_{l})\|_2^2\),并定义紧致度 \(\mathrm{Comp}_l = 1/\mathrm{MSE}_l\),分散的层就该多给簇。落地用多阶段 K-means(算法 1):先用中等簇数聚一遍,把离簇心超过阈值 \(\tau\) 的离群 token 挑出来、用少量新簇再聚,反复直到所有 token 都进了紧致簇;若簇数超过上限 \(N_{\max}\),就判定该层「难压缩」、整层退回全注意力。一个加速细节是跨步初始化:DiT 多步去噪里相邻步的 token 分布几乎不变(图 6),所以只在第一步跑完整多阶段聚类来定各层簇数,后续步固定簇数、并用上一步的簇心当初始化,省掉大量重复聚类
3. TensorQuest:把关键簇选择从 CUDA Core 搬到 Tensor Core
聚完类还得快速判断「哪些簇对当前 query 重要」。作者借鉴 LLM 解码里的 Quest——它用注意力权重上界来估计 key 的重要性:
但 Quest 的逐维取 max/min 只能跑在 CUDA Core 上,而扩散去噪的注意力计算量远大于 LLM 解码,直接用会带来无法接受的延迟。AdaCluster 提出 TensorQuest:先把 query/key 拆成正负两部分 \(q^{+}=\max(q,0),\,q^{-}=\min(q,0)\)(key 同理),则上式可等价改写成两次矩阵乘
这样除了轻量的正负拆分,主计算变成矩阵乘、能吃满擅长高吞吐矩阵运算的 Tensor Core,数值上与原版 Quest 完全等价,却把 Top-K 选择这步在最长序列上加速最高约 5×。拿到打分后取 Top-K 簇、收集其中的 \(K^{*}, V^{*}\) 做注意力即可
损失函数 / 训练策略¶
全程训练无关,无需任何微调或额外训练,方法以推理期算子形式落地。关键超参:query 簇数固定 65,key 簇数按算法逐层动态调整;阈值 \(\tau\) 取第一步推理里「token 到簇心平均距离」的 1.5×;按 \(k_{\max}\) 让紧致度最差的约 15% 层走全注意力。算子用 Triton + FlashInfer 自定义实现,跳过的层用 FlashAttention。HunyuanVideo 用 30 步去噪,另两个模型用 50 步。
实验关键数据¶
主实验¶
在 PenguinVideoBenchmark 提示集上,用 PSNR/SSIM/LPIPS 衡量与全注意力的相似度,用 VBench 衡量画质,硬件为单张 A40。
| 模型 | 方法 | PSNR↑ | SSIM↑ | LPIPS↓ | 加速比↑ |
|---|---|---|---|---|---|
| CogVideoX-2B (720×480) | SpargeAttn | 28.189 | 0.517 | 0.618 | 1.23× |
| CogVideoX-2B | AdaCluster | 30.989 | 0.767 | 0.231 | 1.67× |
| Wan-2.1-1.3B (832×480) | SpargeAttn | 28.292 | 0.437 | 0.599 | 1.81× |
| Wan-2.1-1.3B | SVG2 | 28.230 | 0.358 | 0.679 | 1.61× |
| Wan-2.1-1.3B | AdaCluster | 29.083 | 0.571 | 0.393 | 1.85× |
| HunyuanVideo (1280×720) | SpargeAttn | 28.155 | 0.490 | 0.596 | 1.33× |
| HunyuanVideo | SVG2 | 29.319 | 0.794 | 0.308 | 1.57× |
| HunyuanVideo | AdaCluster | 30.580 | 0.835 | 0.203 | 1.68× |
AdaCluster 在三个模型上的相似度(PSNR/SSIM/LPIPS)全面优于 SpargeAttn 和 SVG2,同时加速比也最高,即「掉点最少又最快」。
效率随序列长度¶
用 HunyuanVideo 固定 81 帧、变分辨率(token 数见下),观察加速比随序列长度的变化。
| token 数 | AdaCluster | SpargeAttn | SVG2 |
|---|---|---|---|
| 28.3K | 1.53× | 1.28× | 1.46× |
| 176.4K | 4.31× | 1.78× | 不适用 |
序列越长稀疏度越高、加速空间越大,AdaCluster 在 176.4K token 上拉到 4.31×;SVG2 因缓存元数据的显存开销,token 超过约 101.1K 就跑不了。
消融实验¶
均基于 HunyuanVideo 1280×720、81 帧(75.6K token)。
| 配置 | PSNR↑ | SSIM↑ | LPIPS↓ | ImgQual↑ | 说明 |
|---|---|---|---|---|---|
| AdaClus(逐层自适应簇数) | 30.580 | 0.835 | 0.203 | 65.11% | 完整模型 |
| AvgClus(各层等簇数,均值持平 412) | 29.007 | 0.724 | 0.378 | 64.79% | 去掉自适应簇数 |
| TensorQuest 选簇 | 30.580 | 0.835 | 0.203 | 65.11% | 完整模型 |
| w/o Quest(均值估计) | 28.941 | 0.687 | 0.410 | 64.06% | 去掉 TensorQuest |
关键发现¶
- 自适应簇数贡献明显:在「平均簇数持平」的公平对比下,逐层自适应(AdaClus)比统一簇数(AvgClus)PSNR 高约 1.57 dB、LPIPS 从 0.378 降到 0.203,证明「按层分散程度分配簇数」确实保住了更多关键 token。
- TensorQuest 选簇优于均值:用 Quest 上界估计簇重要性比简单用簇均值(w/o Quest)PSNR 高约 1.64 dB,说明簇心均值会漏掉边界上的关键 token,而 Quest 上界更稳。
- TensorQuest 同时提速:因为把计算挪到 Tensor Core,Top-K 选择这步在最长序列上最高 5× 加速,是端到端加速的重要来源。
- CogVideoX 是软肋:CogVideoX 本身画质最差,AdaCluster 和 SpargeAttn 在它上面的 image quality 都明显下滑,作者归因于模型本身而非方法。
亮点与洞察¶
- 角色感知是核心洞察:query 只关心「相对排序」(与模长无关)→ 角度聚类可激进压缩;key 方向长度都重要 → 必须保欧氏紧致度。把这个不对称性挑明并落到两套聚类,是相比 SVG2「一视同仁」最关键的差异。
- 多阶段聚类自带「难压缩层」退出机制:簇数超上限就整层退回全注意力,既避免在不适合聚类的层硬压掉画质,又把「该不该压」交给数据自己决定,工程上很干净。
- TensorQuest 的正负分解很巧:\(\max(q^d\max K^d, q^d\min K^d)\) 这种逐维分支天然不亲和矩阵乘,作者用正负部分拆分把它等价改写成两次 matmul,从而吃满 Tensor Core——这是一个可迁移到其他「需要上界估计 + 想上 Tensor Core」场景的通用 trick。
- 跨步复用簇心:利用 DiT 相邻去噪步分布平滑这一先验,只在第一步定簇、后续步复用并热启动,把聚类开销摊薄到几乎为零。
局限与展望¶
- 依赖序列足够长才有大加速:短序列(28.3K token)加速仅 1.53×,加速优势主要在超长序列(176.4K → 4.31×)时才充分显现;低分辨率/短视频收益有限。
- 画质评估本身不可靠:作者自己承认 VBench 等指标存在「SpargeAttn 偶尔反超原模型」的反常,画质评估仍是开放问题,因此「无损」更多靠相似度指标支撑而非绝对画质分。
- 若干超参靠经验设定:\(\tau=1.5\times\) 平均距离、top 15% 层走全注意力、query 簇数 65,这些阈值的鲁棒性主要靠附录敏感性分析,跨更多模型/分辨率是否稳定仍需更多验证。
- CogVideoX 上画质下滑:在弱模型上稀疏化更容易暴露问题,方法对底座质量有一定依赖。
相关工作与启发¶
- vs SVG2:同为聚类式稀疏注意力,SVG2 对 query/key 用同一套欧氏聚类且簇数写死;AdaCluster 做角色感知拆分(query 角度、key 欧氏)+ 逐层自适应簇数,相似度和加速都更好,且 SVG2 因元数据显存在超长序列上直接跑不了。
- vs SpargeAttn:SpargeAttn 在块级检测稀疏、按连续 token 分块,忽略语义/数值相似性;AdaCluster 用聚类保证簇内相似,长序列加速比(4.31× vs 1.78×)和画质都更高。
- vs Quest:Quest 面向 LLM 解码、用上界估计选关键 KV page,但只跑 CUDA Core;AdaCluster 的 TensorQuest 在数值等价前提下改写为矩阵乘上 Tensor Core,适配计算更密集的扩散去噪。
- vs 训练式稀疏注意力(VSA / DSV / RadialAttention):这些方法靠重训练或 LoRA 微调学稀疏模式,成本高;AdaCluster 完全训练无关、即插即用。
- vs 扩散量化(PTQD / SVDQuant 等):量化降数值精度,与本文正交——AdaCluster 降的是注意力计算量,二者可叠加。
评分¶
- 新颖性: ⭐⭐⭐⭐ 「query/key 角色感知 + 逐层自适应簇数 + TensorQuest 上 Tensor Core」三点组合清晰,但单点多基于已有 Quest/聚类思想的改造。
- 实验充分度: ⭐⭐⭐⭐ 覆盖三个主流 DiT、多分辨率、相似度与画质双维度、含针对性消融;但仅 A40 主实验、画质指标本身不稳。
- 写作质量: ⭐⭐⭐⭐ 动机推导(分布差异、上界分析)扎实,算法伪代码完整,叙述清楚。
- 价值: ⭐⭐⭐⭐⭐ 训练无关、即插即用、超长序列 4.31× 加速,对视频 DiT 落地有直接实用价值。