稀疏注意力的分水岭不在稀疏模式本身,而在稀疏结构是否参与训练。Sliding Window、Longformer 是贴在推理期的手工先验,DeepSeek 的 NSA 与 DSA 把「该看哪些 token」交给模型自己学,并让 kernel 真正跑得快。

全注意力的两重瓶颈

自注意力的计算量随序列长度平方增长,;同时所有历史 token 的 K/V 都要留在显存中。两个瓶颈方向不同,已有解法各管一边:

  • FlashAttention 用分块与在线 Softmax 消除了 注意力矩阵的显存往返,属于 IO 优化,计算量的量级不变
  • KV Cache 管缓存复用,MLA 把缓存压成低秩潜向量,解决的是显存装不下

NSA 论文给出的估计:解码 64k 上下文时,注意力占端到端延迟的 70–80%。想动这块只剩一条路——不要算全部。

经典方案:推理期贴上的手工先验

Softmax 注意力天然稀疏,绝大部分概率质量集中在少数 token 上,于是早期方案直接把稀疏模式写死:

  • Sliding Window Attention(Mistral 7B):每个 query 只看前 个 token(Mistral 取 4096),复杂度降到 ,靠层数堆叠间接扩大感受野
  • Longformer / BigBird:local 窗口 + 少量 global token + random 采样,用混合模式在理论上恢复长程连接能力

这类方案的共同问题不是效果,而是结构失配。稀疏模式由人手工指定、与数据无关,模型无法学到”什么值得看”;而后来那些在推理期做检索式稀疏(如按 block 估计重要性再取 top-k)的方法更尴尬——训练用全注意力、推理换稀疏,train-inference 行为不一致,模型从未被训练去适应被裁剪的上下文。

NSA 论文还点出一个常被忽略的坑:许多稀疏方法让每个注意力头独立选自己的 KV 子集,在 MHA 上确实省,但在 MQA/GQA 架构下,实际要搬运的是同组所有 query 头选择结果的并集——省了计算,没省访存,解码根本快不起来。

NSA:把稀疏做进预训练

NSA(Native Sparse Attention),arXiv:2502.11089,2025 年 2 月提交,ACL 2025 论文。核心主张写在标题里:hardware-aligned(硬件对齐)+ natively trainable(原生可训练)。

三条并行分支

NSA 把 K/V 按时间组织成 block,每个 query 经三条注意力路径并行处理:

分支做法作用
压缩 compression把连续 block 的 K/V 聚合成 block 级表示粗粒度全局概览
选择 selection按重要性挑 top-n 个 block,内部逐 token 精确计算细粒度关键信息
滑窗 window固定局部窗口邻近上下文

三路输出由门控加权求和,门控分数 由输入特征经 MLP + sigmoid 得到——即三条分支的权重也是学出来的。

设计上有个巧妙复用:block 重要性分数直接来自 query 与压缩分支的 K 做注意力,(当压缩与选择共享同一分块方案时)。选择哪些 block 不需要额外打分网络,压缩分支的副产物即可。

硬件对齐

稀疏往往「理论省算力、实际不加速」,NSA 的应对是让稀疏布局迁就 GPU:

  • block 粒度而非 token 粒度:连续访存、合并加载,把 Tensor Core 吃满
  • KV 跨 query 头共享:选择在 GQA 组层面统一,让访存量真正随稀疏度下降
  • 前向与反向都有定制 kernel:这是「原生可训练」的前提——反向传播也必须快

效果

27B 参数 backbone、260B token 预训练。NSA 的预训练 loss 低于全注意力基线,通用、长上下文、推理三类评测上持平或更优——稀疏不再是精度换速度的妥协。A100 上以 Triton 实现对齐 FlashAttention-2 比较,64k 上下文下:

  • 前向 9.0×,反向 6.0×
  • 解码 11.6×(访存量从 65536 token 降到 5632,解码是 memory-bound,加速近似线性)

DSA:lightning indexer 驱动的细粒度选择

**DSA(DeepSeek Sparse Attention)**随 DeepSeek-V3.2-Exp 于 2025 年 9 月发布,技术报告 DeepSeek_V3_2.pdf 随开源仓库一同发布(未见 arXiv 编号),报告中引用 NSA 为前作。V3.2-Exp 由 V3.1-Terminus(128K 上下文)续训而来,官方称其”首次实现细粒度稀疏注意力”。

与 NSA 的 block 粒度不同,DSA 直接在 token 粒度上选择,代价是需要一个足够便宜的打分器。

lightning indexer

索引器为 query token 与之前的 token 计算索引分数:

其中 是索引器头数,、 由 query token 导出, 由被打分 token 导出。三处让它”便宜”:

  • 激活函数选 ReLU 而非 Softmax,纯粹出于吞吐考虑
  • 头数少、可用 FP8 实现(开源实现中索引器的 K cache 直接存 float8_e4m3fn)
  • 索引器的 K 不分头,每个 token 只缓存一份低维向量

671B 开源配置给出的具体规格:索引器 64 头、head_dim 128、每个 query 取 top-2048 个 KV。索引器内部也用 RoPE——但布局是 non-interleaved,与 MLA 模块的 interleaved 相反,官方为此专门发过勘误。

训练:先对齐,再稀疏

DSA 不是”训完再插稀疏”,续训分两阶段:

  1. Dense warm-up:保持全注意力,冻结除索引器外的所有参数。把主注意力分数跨头求和得到目标分布,以 KL 散度训练索引器去逼近它——先让索引器学会模仿真实注意力在看什么。lr ,1000 步,约 2.1B token
  2. Sparse training:开启 top-2048 细粒度选择。索引器只吃自己的对齐损失 ,主模型只吃语言建模损失,两者梯度分离。lr ,15000 步、每步 480 条 128K 序列,共 943.7B token

因此”端到端”的准确含义是:稀疏选择在训练中就已生效,模型是在被裁剪的上下文上学习的,推理行为与训练一致——而不是索引器由 LM loss 直接训出来。

复杂度与实际代价

报告写得很克制:DSA 把主注意力复杂度从 降到 ( 为选中 token 数);索引器本身仍是 ,但常数远小于 MLA 的注意力计算,所以整体仍显著加速。这里没有渐进复杂度上的魔法,靠的是常数项的量级差。

工程上 DSA instantiate 在 MLA 之上(开源实现中 Indexer 就是 MLA 模块的子模块),kernel 层面要求每个 KV 条目在 query 头间共享——即 MQA 模式,与 NSA 强调的访存考量同源。评测结果与 V3.1-Terminus 基本持平(MMLU-Pro 均为 85.0,AIME 2025 从 88.4 到 89.3),而 H800 上实测的 token 成本随序列位置增长明显放缓。

路线对比

方案稀疏模式粒度模式来源复杂度代表模型
Sliding Window固定局部窗口token手工先验Mistral 7B
Longformer / BigBirdlocal + global + randomtoken手工先验Longformer, BigBird
NSA压缩 + top-n block + 滑窗,门控融合block训练中学习27B 验证模型
DSAindexer 打分取 top-k tokentoken训练中学习主注意力 ,indexer 小常数DeepSeek-V3.2-Exp

两代做法的取舍很清楚:NSA 用 block 粒度换 GEMM 友好,从零预训练验证;DSA 用极轻的索引器换回 token 粒度,代价是保留一项小常数的 ,换来可从已有 dense 模型续训落地。与 MLA 的缓存压缩叠加后,因果长上下文推理的计算与显存两侧被同时压下来——这是 DeepSeek 长上下文低成本方案的完整形状。