全注意力的反击:百步训练把稠密注意力"翻译"成稀疏,1M 上下文 prefill 提速 9.36 倍
核心摘要
稀疏注意力这一年被推上了风口——Kimi Delta、DeepSeek Sparse Attention、NSA 这些路线背后都有一个相对昂贵的前提:要从头做 native sparse 预训练。这就有点劝退了,毕竟一个 Qwen3、一个 Llama,谁也舍不得为了换稀疏注意力把模型重训一遍。
南京大学和阿里巴巴的这篇论文给了一个让我眼前一亮的回答:别折腾预训练了,全注意力模型本身就已经是稀疏的,你只需要做最小手术。具体地,他们提出 RTPurbo——只对 15% 的"检索头"保留完整 KV 缓存,其余 85% 头当成局部头来处理;用一个 16 维的低秩索引器在 RoPE 频率几何上挑 token;再配上动态 top-p 替代固定 top-k 的选择机制。整套训练只需几百步、约 1M 标签 token 就能让 Qwen3-Coder-30B-A3B 完成稀疏化转换。
效果是真的能打:1M 上下文下 prefill 加速 9.36 倍、decode 加速 2.01 倍,LongBench 平均分 54.24 反而超过全注意力基线的 53.80,AIME24/AIME25 推理任务上完美追平稠密模型的 86.67。
我的判断:这是 2026 年我读到目前为止最有"工程务实感"的稀疏注意力论文。它的最大价值不在于刷了多漂亮的 benchmark,而在于揭穿了一个被行业默认很久的命题——所谓想要稀疏推理就得 native sparse 预训练,其实是个伪命题。
论文信息
- 标题:Full Attention Strikes Back: Transferring Full Attention into Sparse within Hundred Training Steps
- 作者:Yanke Zhou, Yiduo Li, Hanlin Tang, Maohua Li, Kan Liu, Lan Tao, Lin Qu, Yuan Yao, Xiaoxing Ma
- 机构:南京大学、阿里巴巴集团
- arXiv:2605.16928(v1,2026 年 5 月 16 日提交)
- 代码:论文中未公开
一、为什么这个问题值得你停下来读两眼
我先把场景说清楚。你想用 Qwen3-Coder-30B-A3B 跑一段 1M 上下文的代码仓库分析。注意力的 KQ 计算是 \(O(N^2)\) 的,1M 长度意味着 \(10^{12}\) 量级的内积——这显然不可能。所以业界这两年的主线就是把全注意力换掉,换成各种稀疏注意力。
主流路线大致分两类:
第一类是 native sparse 预训练,代表是 DeepSeek Sparse Attention(DSA)、Kimi Delta Attention、NSA 这些。优点是稀疏算子和模型一起被训出来,精度损失小、加速比可控;缺点是——你得重新训整个模型,成本是天文数字级别。对绝大多数二开团队来说这条路根本走不通。
第二类是启发式 token 驱逐,代表是 SnapKV、Quest、StreamingLLM。不需要重训,靠规则/局部统计量挑 token。优点是几乎零成本接入;缺点是精度掉得很难看,尤其在长上下文需要远程检索的任务上经常崩盘。
中间这条路一直是空的。你既不想付 native sparse 预训练那种"重新做人"的代价,又不想接受启发式驱逐那种"精度自由落体"的代价。这篇论文做的事情,就是把这个空缺补上。
说实话,我看到 abstract 里"only a few hundred training steps"那一行的时候,第一反应是怀疑——百步训练就能恢复精度?这听起来像是一个过于美好的承诺。但读完三个核心观察之后,我开始理解他们为什么敢这么说:因为他们没有"硬训"模型,他们是在利用模型本来就具备的稀疏结构。
二、三个关键观察:稀疏性其实早就在那里
RTPurbo 的所有设计都是从下面三个观察出发的,每一个都对应一个具体的工程选择。
观察 1:只有少数头真正需要全上下文(头层稀疏)
注意力头不是均质的,这件事其实在 Anthropic 2022 年那篇 induction heads 的工作里就已经被反复指出过——少部分头负责"远程检索"(看到 A B C ...... A B,下一个 token 应该预测 C),其余大部分头主要做"局部上下文化"。

图1:RTPurbo 的总览图。这个图最能说明问题的不是 9.36× 的加速数字,而是右半边——在 512K 长度上,MInference 准确率只剩 6.0、FlexPrefill 59.5,而 RTPurbo 还能稳在 82.7。这就是头层稀疏 + 动态 top-p 共同作用的结果。
作者的做法是:定义一个 head-wise 离线校准指标(基于头注意力分布的远程信息熵),把所有 query head 排序,只保留得分最高的 15% 作为检索头(retrieval head),剩下 85% 当作局部头(local head)。检索头保留完整 KV 缓存继续做稠密注意力;局部头只看 4 个 sink token 加一个 8192 token 的滑窗。
这一步省下了什么?省下了 85% 头的 KV 缓存——内存稀疏度直接到接近 85%。

图2:一个直观的检索头示意。橙色高条对应远距离的"匹配模式",绿色低条是其他位置的弱噪声注意力。检索头干的活很像 induction head——你之前见过 A B C,现在又看到 A B,那它就把注意力打回到那个 C 上。
观察 2:RoPE 让远程检索可以在 16 维子空间里完成
这是整篇论文我最欣赏的洞察。
RoPE(Rotary Position Embedding)大家都熟,把 query 和 key 的每对维度做一次旋转,旋转角度由 \(\theta_i\) 控制,\(\theta_i\) 随通道下标递减。所以低频通道的旋转角度对距离 \(\Delta\) 不敏感,高频通道则对距离极度敏感。把 \(q_m^\top k_n\) 展开你会得到:
直觉是这样的:高频分量随距离剧烈震荡,对远程检索不仅没用、反而是噪声;低频分量平滑,能稳定保留检索信号。说到底,远程检索这件事是被低频子空间主导的。
作者把这个直觉做成了一个工程方案:在每个检索头上训练一对低秩投影矩阵 \(W^Q_h, W^K_h \in \mathbb{R}^{r \times d_h}\),把 RoPE 之前的 query/key 表示压到 \(r\) 维(论文里默认 \(r=16\),这是个非常激进的压缩比),用这个压缩后的内积去近似 token 之间的相关性,再用它来做 top-p 选择。
注意一个关键细节:低维投影只用来"路由"——挑哪些 token 进入注意力计算,最终的 attention output 用的还是完整的 \(Q, K, V\) 在原始维度上的精确计算。这就避免了"压缩通道一时爽,最终精度全报废"的常见陷阱。
实验显示这个 16 维索引器能 recover 90% 以上的注意力 mass。我看到这个数字的时候是真有点惊讶——128 维原始头被压成 16 维(8× 压缩),还能保住 90% recall,这就是 RoPE 频率结构带来的红利。
观察 3:固定 top-k 是错的,必须动态 top-p
这一点也很反直觉,但作者用一张图就把人说服了。

图3:这就是 top-k 和 top-p 之争的最直观证据。同一个检索头、同一个模型,仅仅因为 query 不同,"该看多少 token"的答案差了三个数量级。
我想强调一下作者发现的这个 5 倍方差——在 Layer 25 上跑 32K 上下文: - niah-S 任务每个检索头平均只激活 468.8 个 token(attention mass > 0.95) - multi-K 任务则需要激活 2462.1 个 token(attention mass > 0.96)
如果你硬塞一个固定 top-k=2048,对 niah-S 是巨大的浪费,对 multi-K 又是 recall 的灾难。论文 Table 1 也给了一个干净的实验结论:top-16k 比 top-p 多算了大约 8000 个 token,但只多 recover 了 3.8% 的注意力 mass——典型的边际收益崩塌。
所以 RTPurbo 用动态 top-p:按 query 自适应地选择 token 集合 \(\mathcal{S}_h(m) = \text{Top-P}(s_h(m,\cdot), p)\),论文默认 \(p=0.9\)。
这三个观察叠在一起,就是 RTPurbo 整套架构的全部底层逻辑。
三、方法:RTPurbo 的最小手术

图4:把上面三个观察拼起来就是这张架构图。最值得品的是右上角那个小图——RoPE 频率从低到高画下来,越低频留存的远程信号 mass 越高,这就是为什么 16 维投影能 work。整张图配合下面这段流程读,整套机制就理顺了。
3.1 离线 head-wise 校准
不需要训练,跑一段长序列上算每个 query head 的 retrieval score(基于注意力分布在远程区域的 mass 占比),按分数排序,前 15% 标为检索头,后 85% 标为局部头。
论文附录的分析显示这个校准结果对输入文档极其稳定——不同长文档跑出来的检索头集合高度一致。这个稳定性其实很关键,否则你每次 inference 都要重新校准,那就根本不是"最小手术"了。
另一个有趣的发现:检索头集中在模型的后半部分层。这和 LLM 的层级语义假设吻合——前层做 token 局部上下文化、后层做更稳定的语义抽象,所以远程检索这种语义任务自然落在后层。
3.2 自适应稀疏注意力
整套机制可以用一个公式概括(针对检索头 h):
其中 \(\mathcal{S}_h(m) = \text{Top-P}(s_h(m,\cdot), p)\),而打分函数 \(s_h(m,n)\) 用低维投影计算:
这里 \(q^{\text{pre}}, k^{\text{pre}}\) 是 RoPE 注入之前的特征——这个细节也是关键。如果用 RoPE 之后的特征做低秩投影,高频成分的剧烈震荡会破坏 retrieval 信号;用 pre-RoPE 特征则能稳定地保留低频几何结构。
对 GQA/MQA 模型,作者把稀疏度拆成两套: - Compute sparsity:在 query head 层面统计平均激活 token 数 - Memory sparsity:在 KV head 层面统计——KV 缓存只能按 KV head 划分,所以保留集合是所有映射到该 KV head 的 query head 选中 token 的并集
这两个数会差不少,论文 Table 6 中 64K niah-S compute sparsity 89.2%、memory sparsity 87.7% 就是这个原因。
3.3 两阶段轻量训练
这是论文标题里"百步训练"的核心。
第一阶段:低维投影预训练 冻结 backbone,只训每个检索头的 \(W^Q_h, W^K_h\)。损失函数是低维投影分布与原始稠密注意力分布的 KL 散度:
这一步纯粹是让 16 维投影学会"模仿"完整 128 维的注意力分布,不动模型本体。
第二阶段:端到端自蒸馏 插入训好的投影、切换到稀疏注意力模式,把稠密原模型当 teacher 做 self-distillation。优化目标是 top-10 logits 的 KL 散度:
只对齐 top-10 logits,是为了进一步省算力。整个第二阶段只需 1M 标签 token 量级的数据——按 batch 算下来就是几百步训练。
我觉得这里自蒸馏这个选择是真的聪明。如果用普通 SFT,你得仔细 ablate 数据混合比例(数学占多少、代码占多少、长文档占多少),调教起来很烦。自蒸馏直接把稠密 teacher 当成"标签生成器",绕开了数据分布这个雷区——你只要让稀疏 student 在 teacher 行为分布下尽量贴近就行。
3.4 硬件感知的 top-p decode kernel
光算法漂亮没用,要落地就得有 kernel。论文为 decode 阶段写了一个定制的 GPU kernel。

图5:这个 kernel 的两个工程亮点是:(1) 用直方图代替排序——传统 top-p 要 sort,复杂度 \(O(N_b \log N_b)\),二分查找又要 \(O(N_b)\) 内存(在 16K 个 block 时直接爆)。作者的方案是把每个 block 的 log-sum-exp 原子写入 256 bin 直方图,每个头只占 1 KB 内存,跟序列长度无关。(2) 计分和选择融合为一次 kernel launch——最后一个完成的 CTA 负责扫描直方图、确定 top-p 阈值并写出 block mask,避免额外的 kernel 启动开销。
第二个 kernel 是 bandwidth-optimized 的 block-sparse 注意力。对长序列来说,即使是稀疏注意力也是 memory-bound 的——选中的 KV block 还是可能跨几万个 token。作者用了类似 FlashAttention-2 的 split-KV 并行 + cross-split reduce 的写法。
最后的实测在 prefill 上从 32K 的 2.83× 提速到 1M 的 9.36×,decode 从 1.47× 提速到 2.01×。
四、实验:精度与效率,两手都要硬
4.1 长上下文 benchmark
我先把 LongBench 上的关键结果列出来——选了几个有代表性的列:
| 方法 | qasper | qmsum | trec | lcc | repo-p | PR-zh | PR-en | Avg. |
|---|---|---|---|---|---|---|---|---|
| Full Attn | 42.08 | 23.77 | 89.93 | 61.50 | 35.08 | 99.75 | 99.00 | 53.80 |
| RazorAttn | 40.31 | 23.59 | 89.26 | 59.50 | 35.01 | 99.00 | 99.75 | 52.98 |
| Minference | 40.22 | 23.60 | 51.95 | 32.25 | 34.05 | 99.00 | 100 | 48.39 |
| Quest | 39.11 | 23.55 | 79.88 | 59.00 | 35.80 | 98.83 | 91.92 | 50.69 |
| SnapKV | 42.56 | 17.68 | 82.03 | 57.21 | 35.00 | 99.00 | 99.75 | 50.74 |
| RTPurbo top-p | 44.49 | 24.60 | 90.85 | 60.00 | 34.56 | 99.75 | 100 | 54.24 |
基模型:Qwen3-Coder-30B-A3B,列名是 LongBench 子任务缩写
RTPurbo 在 LongBench 平均分 54.24,反超全注意力基线 53.80 大约 0.44 分。这个反超我倾向于解读为"两者基本持平、自蒸馏轻微正则化带来一点点提升",而不是稀疏比稠密更好——但能做到这个水平已经很说明问题。
注意 RTPurbo 同时给了 top-k 和 top-p 两个版本:top-k 平均 53.30,top-p 平均 54.24。这接近 1 个点的差距,全是动态选择带来的——这个数也佐证了观察 3。
4.2 RULER 长上下文:32K vs 64K 的差别才能看出谁是真稀疏
| 方法 | 32K Avg. | 64K Avg. |
|---|---|---|
| Full Attn | 89.65 | 86.23 |
| RazorAttn | 88.69 | 85.11 |
| Minference | 83.58 | 65.61 |
| FlexPrefill | 83.40 | 77.77 |
| Quest | 78.97 | 70.60 |
| SnapKV | 83.43 | 75.81 |
| RTPurbo top-p | 90.06 | 85.49 |
到 64K 上下文长度时,Minference 直接掉到 65.61、Quest 70.60、SnapKV 75.81——这些 baseline 在 32K 还能勉强撑住的方法,到 64K 全部出现明显的精度滑坡。RTPurbo 在 64K 上 85.49 分,几乎贴着全注意力的 86.23 在跑。
这就是头层稀疏 + 动态 top-p 的组合拳效果——当上下文变长、token 重要性分布变得更不均匀的时候,固定比例方法就开始 recall 失败,动态 top-p 反而能自适应扩张激活集。
4.3 超长上下文(128K-512K):分水岭在 256K

图6:这张图我反复看了几遍。最戳人的是 multi-K 任务上:MInference 从 128K 的 36.0 一路跌到 512K 的 4.2(完全失败),FlexPrefill 从 92.8 跌到 75.0,RTPurbo 从 99.0 跌到 89.4——但稀疏度从 94% 涨到 97.1%。这个曲线就是"动态自适应"的最佳代言。
256K 是个明显的分水岭。256K 之前,所有方法(除了 MInference)都还能见,差距不大;256K 之后开始拉开,512K 时分化彻底——RTPurbo 还能稳定保持 80+ 准确率并且稀疏度爬到 97%+,其他 baseline 要么精度雪崩要么稀疏度上不去。
4.4 推理任务:AIME 上完美追平稠密
| 方法 | AIME24 | AIME25 | MMLU-Bio | MMLU-CS | MMLU-Math |
|---|---|---|---|---|---|
| Full Attn | 86.67 | 86.67 | 89.20 | 86.10 | 93.60 |
| Quest | 46.67 | 46.67 | 88.28 | 82.68 | 93.20 |
| SnapKV | 43.33 | 46.67 | 88.14 | 80.49 | 90.00 |
| RTPurbo top-p | 86.67 | 86.67 | 89.80 | 85.12 | 93.60 |
| RTPurbo top-k | 80.00 | 80.00 | 88.80 | 50.49 | 71.60 |
AIME24/AIME25 这种"短输入、超长 reasoning trace"的任务,瓶颈完全在 decode 阶段。Quest 和 SnapKV 在这两个任务上从 86.67 一路掉到 46 分——几乎是腰斩。RTPurbo top-p 完美追平稠密 86.67,top-k 版本却只有 80.00。
这给了一个非常 sharp 的结论:推理任务对动态 token 预算极其敏感。reasoning chain 的不同步骤需要回看的历史长度差异巨大——开头规划阶段可能只需要几百 token,中间验证阶段可能需要几千 token——固定 top-k 必然在某些步骤上失败。
我还注意到一个细节:top-k 版本在 MMLU-CS 和 MMLU-Math 上塌得很厉害(50.49 和 71.60,远低于稠密的 86.10 和 93.60),说明 top-k 不只是慢一点的问题,在某些任务上根本是会"爆雷"的。这也间接说明动态 top-p 不是个 marginal trick,而是一个 enabling design。
4.5 我的批判性观察
聊几个让我皱眉的地方:
-
基模型只测了 Qwen3-Coder-30B-A3B。论文附录提到 Qwen3-30B-A3B-Think 头分布也有类似规律,但没在主实验里跑完整对比。15% 的检索头比例是不是 model-specific?换到 Llama-3.1-405B、Mixtral 这些非 Qwen 系列上是否还成立?这是悬而未决的问题。
-
15% 这个比例本身有调参嫌疑。论文附录 Table 10 给了 10% vs 15% 的对比,10% 在某些子任务上掉得明显(如 RULER multi-K 从 99.60 掉到不到 95)。这说明 15% 是个相对窄的甜区——对其他模型族这个甜区在哪儿?
-
decode 加速 2.01× 没有 prefill 9.36× 那么惊艳。原因其实是 decode 阶段是 memory-bound 的,sparse 算子省的是计算量、对带宽的优化空间相对有限。这是这类方法的天然限制,不是论文的问题,但读者要意识到 decode 加速的天花板没有那么高。
-
训练成本"几百步"听起来便宜,但前提是你已经有一个好的稠密 teacher。如果你的稠密模型本身在长上下文上就拉胯,自蒸馏出来的稀疏版本也只能继承拉胯——这个方法不会"无中生有"。
五、和同期工作摆一起看,RTPurbo 站在哪里
我把这一年长上下文稀疏注意力的几个代表方法放在一张表里:
| 方法 | 稀疏机制 | 训练成本 | Token 选择 | 工程化程度 |
|---|---|---|---|---|
| DeepSeek Sparse Attention(DSA) | 学习的 indexer + top-k | Native sparse 预训练 | 静态 top-k | 高 |
| Kimi Delta Attention | Delta gating | Native sparse 预训练 | 动态门控 | 高 |
| Quest | Min-max page ranking | 训练免费 | 静态 top-k | 中 |
| SnapKV | 局部 query 压缩 | 训练免费 | 局部观测窗 | 中 |
| MInference | 离线模式发现 | 训练免费 | 模式分配 | 中 |
| DuoAttention | Retrieval/streaming 分组 | 需重训 KV | 静态划分 | 中 |
| RazorAttn | Retrieval head 概念 | 需训练 | 静态 top-k | 中 |
| RTPurbo | Retrieval head + 16D 索引 + 动态 top-p | 几百步轻训 | 动态 top-p | 高 |
如果硬要给 RTPurbo 一个定位,它在工业落地友好度和精度保留度之间踩到了一个非常少有人踩到的位置。
- 比 DSA、Kimi Delta 这类 native sparse 方案便宜两个数量级(百步 vs 全量预训练)
- 比 Quest、SnapKV 这类启发式驱逐方案精度高一大截(看 64K 之后的 RULER 数据)
- 比 DuoAttention、RazorAttn 多了"低维 RoPE 几何"和"动态 top-p"两个关键组件
它不是 native sparse 的颠覆者——native sparse 在精度上限和算子效率上仍有结构优势。但对于绝大多数没有重训预算的团队来说,RTPurbo 是从全注意力模型迁移到稀疏推理的最低成本路径,目前没有之一。
还得提一句,它和 RazorAttn、DuoAttention 这两条路线在概念上非常接近——都用"检索头/局部头"的二分。RTPurbo 的关键增量是三件事:用 RoPE 的低维几何把 token 索引压到 16 维、用动态 top-p 替代静态 top-k、用自蒸馏避开数据混合调参。这三个增量组合起来效果就上去了。
六、工程启发:如果你也在做这件事
我把读完之后立刻能用上的几条经验拎出来:
-
检索头/局部头的二分要尽早做离线校准,且只校准一次。论文附录验证了校准结果对输入分布极其稳定,所以别每次推理都重算——固定一次写进配置就行。
-
低维投影的训练阶段一定要冻结 backbone。这是一个轻量、可独立验证的"路由学习",分阶段做能避免和 backbone 互相干扰。一阶段不收敛就别进二阶段。
-
如果你只能选一个稀疏化机制改造现有模型,优先选动态 top-p。论文里 top-k vs top-p 在推理任务上的差距(80 vs 86.67)说明动态选择不是锦上添花,是雪中送炭。
-
decode kernel 的直方图 top-p 写法值得借鉴。256 bin、1 KB、和序列长度无关——这套设计放到任何需要 GPU 上做 top-p 选择的场景都是好实践。
-
15% 这个魔法数字别盲目照搬。不同模型规模、不同预训练数据、不同 GQA/MQA 结构都会影响这个比例。先用论文的 retrieval score 指标做校准,再按累计远程信息 mass 决定切分点。
七、一些我还想看到的实验
最后留几个我自己读的时候没有完全被回答的问题——也算是给作者下一篇工作或者社区跟进者的方向:
- 小模型也有这种结构吗? Qwen3-Coder-30B-A3B 是 MoE,主激活只有 3B。在 8B、14B 这类稠密小模型上,head 特化是不是同样明显?还是说稀疏头结构是大模型专属?
- 15% 这个比例和模型层数、head 数的关系是什么? 是否随层深线性增长?这关系到能不能给"该选多少检索头"一个 closed-form 公式,而不是每次都靠调参。
- 持续训练(continual pretraining)会改变检索头分布吗? 如果你 SFT 一个模型让它做新任务,原来的检索头还是检索头吗?这关系到 RTPurbo 能不能直接套到下游 finetune 后的模型上。
- 跟 native sparse 模型直接对比——RTPurbo 改造的 30B 稠密模型 vs 同样大小的 native sparse 模型(如 NSA 路线),在严格匹配训练量的前提下谁更强?这个实验做出来才能真正回答"全注意力的反击"是不是名副其实。
收尾
读到最后我有一个非常清晰的判断:这不是一篇会"震惊"业界的 paper,但它会成为长上下文工程师的工具箱里的常驻成员。
它做对的事情有三件:第一,承认了稀疏性是模型预训练阶段就形成的内在结构,而不是必须通过 native sparse 训练注入的外部约束;第二,在 RoPE 的频率几何里发现了一个工程上极其友好的低秩子空间;第三,用动态 top-p 这个最简单的机制解决了 token 预算的 query 依赖问题。
如果你正在维护一个长上下文 LLM 推理服务、又没有重训预算,RTPurbo 是 2026 年我会强烈建议你跟进的方法之一。100 步训练、9.36× prefill 加速、近无损精度——这个 ROI 在工业界几乎是不存在的。
但更重要的是它带出的那个反直觉判断:全注意力模型本身就已经是稀疏的,你只是需要找到合适的"翻译方式"而已。
觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我