大模型稀疏注意力机制深度解析:从 NSA 到 MoBA 的长上下文高效推理架构核心痛点:当上下文从 32K 冲向百万 token,全注意力O ( S 2 ) O(S^2)O(S2)的算力与O ( S ) O(S)O(S)的 KV 显存在 prefill 与 decode 两端同时压顶——而线性注意力改写了 softmax 数学导致召回掉点、KV Cache 压缩又永久淘汰 token 不可逆,长上下文急需一种"保留精确 softmax、只跳过不重要块计算"的稀疏注意力适配人群:大模型预训练/继续训练工程师、推理引擎与 kernel 开发者、关注 Kimi K2 / DeepSeek-V3.2 / Llama 长上下文训练与部署的算法和系统工程师、有 FlashAttention 或 PagedAttention 经验并想深入稀疏注意力内核机制的开发者收获能力:掌握稀疏注意力的统一视角与"计算稀疏 vs 存储稀疏"边界、NSA 三分支(压缩/选择/滑窗)可训练门控与硬件对齐 kernel、MoBA 块级路由与 MHA↔MoBA 无缝切换、Quest 查询感知两阶段关键块估计、SeerAttention 学习式门控蒸馏、以及块尺寸与 Tensor Core 对齐、因果掩码下选择负载不均、训练-推理稀疏一致性、decode 内存墙等工程陷阱与应对技术背景与演进逻辑背景:长上下文从 8K 一路涨到 128K 甚至 1M(Kimi K2 256K、Qwen 长上下文、Llama 3 128K),全注意力成为算力与显存的双重瓶颈算力:每层注意力计算量正比于S 2 c d o t d S^2 cdot dS2cdotd,S 翻百倍则单层算力翻万倍,prefill 阶段尤为惨烈显存:朴素实现需物化S × S S × SS×S注意力分数矩阵,百万 token 单层即数十 GBKV 代价(块公式):M m a t h r m K V = 2 c d o t L c d o t d c d o t S c d o t b M_{mathrm{KV}} = 2 cdot L cdot d cdot S cdot bMmathrmKV=2cdotLcdotdcdotScdotb(2 表示 K 与 V,L 为层数,d 为隐藏维,S 为序列长,b 为每元素字节数;FP16 下 b=2,FP8 下 b=1)内存墙:decode 阶段每步 token 少、算力低,瓶颈从计算转为每加载一字节 KV 做极少次乘加——注意力变成纯访存密集,省算力无用,必须减少实际加载的 KV推演:单卡无论算力、显存还是带宽都无法承载百万 token 的全注意力 - 必须让注意力"只算该算的块"线索一:滑动窗口只看局部,丢全局现象:Mistral/Gemma 用滑窗注意力(sliding window)只看最近 l 个 token,复杂度降到O ( S c d o t l ) O(S cdot l)O(Scdotl),kernel 友好推论:局部窗口无法召回远处的"针",长文档 needle-in-haystack 直接失效 - 需要一种能选择性回看远处的稀疏线索二:KV Cache 压缩是存储优化,不可逆现象:H2O/SnapKV/Attention Sink 按 token 重要度永久淘汰 KV,省的是"存了多少"推论:淘汰不可逆,不同 query 看不到被淘汰的 token,长程召回受损 - 稀疏注意力应只决定"算哪些块"而保留全部 KV线索三:线性注意力改写了数学,掉召回现象:Performer/Linformer/RWKV 用核近似或线性化把复杂度降到O ( S ) O(S)O(S),但近似 softmax 核导致精确检索能力下降推论:保留精确 softmax、只对选中的块做精确注意力,才能兼顾线性复杂度与召回 - 内容相关稀疏是正解线索四:事后稀疏与训练稀疏的鸿沟现象:Quest 等推理时稀疏无需重训,但模型未见过稀疏注意力分布,高稀疏率下质量下滑推论:若让门控参与反向传播、训练时即稀疏,模型会主动适应稀疏模式 - NSA 提出"原生可训练稀疏"演进时间线(知识表格):年份里程碑核心贡献2017Transformer 全注意力O ( S 2 ) O(S^2)O(S2)全局注意力,奠定长程依赖基础但随 S 爆炸2020Longformer/BigBird滑窗 + 全局 token 的固定稀疏模式,静态非内容相关2023Mistral/Gemma 滑窗工业级滑窗注意力,局部高效但丢全局召回2024.06Quest(ICML 2024)查询感知两阶段关键块估计,推理时稀疏、免重训2024.10SeerAttention学习式门控 + 自蒸馏,32K 下 90% 稀疏近乎无损2025.02NSA(DeepSeek)压缩/选择/滑窗三分支原生可训练 + 硬件对齐 kernel2025.02MoBA(Moonshot)块级混合专家注意力,MHA↔MoBA 无缝切换2025.04Sparse Frontier系统性稀疏注意力权衡研究,揭示模型对稀疏的鲁棒性2025.04DeepSeek-V3.2生产级采用 MLA + DeepSeek Sparse Attention(NSA 工程化)2025.06SeerAttention-R面向长推理的解码稀疏适配,去 query 池化、GQA 共享稀疏2025.07Kimi K2生产级采用 MLA + MoBA,持续预训练到 256K/512K/1M总结:技术迭代的必然性在于"保留精确 softmax、只跳过不重要块计算"既绕开了线性注意力的召回损失,又避开了 KV 压缩的不可逆淘汰,核心价值是让百万 token 的注意力算力、显存与访存在"该算的块"上被精确投入核心原理深度解析稀疏注意力的统一视角本质:对每个 query,只从全部 KV 块中挑出少数"重要块"做精确 softmax 注意力,其余块跳过,从而把单 query 的计算与访存从O ( S ) O(S)O(S)降到O ( k c d o t l ) O(k cdot l)O(kcdotl)(k 个块、每块长 l)难点:哪些块重要取决于 query(内容相关),且选择本身不能太贵,否则省下的算力被选择开销吃掉 - 需要轻量打分 + 高效 top-k与近亲的区别(知识表格):维度全注意力线性注意力KV Cache 压缩稀疏注意力优化对象无计算公式存储(淘汰 token)计算(跳过块)softmax精确近似核精确(剩余 token)精确(选中块)可逆性——不可逆可逆(保留全部 KV)复杂度O ( S 2 ) O(S^2)O(S2)O ( S ) O(S)O(S)O ( S ′ ) O(S')O(S′),S’SO ( S c d o t k c d o t l ) O(S cdot k cdot l)O(Scdotkcdotl)召回质量满分下降下降近满分与压缩关系互斥互斥可叠加可叠加(先稀疏算再压缩存)稀疏分类(知识表格):类型代表选择依据是否内容相关静态/固定模式Longformer/BigBird预定义窗口与全局 token否滑动窗口Mistral/Gemma仅最近 l 个 token否(局部)查询感知推理稀疏Questquery 与块摘要打分是学习式门控稀疏SeerAttention可学习门控预测块重要度是原生可训练稀疏NSA/MoBA训练端到端学习的门控/路由是设计思想:稀疏的不是"模型结构"而是"每次注意力的计算范围",且这个范围由可学习的门控按 query 动态决定 - 既保精确 softmax 又获近线性复杂度NSA:三分支可训练稀疏注意力机制:NSA 为每个 query 并行计算三条注意力分支——压缩分支用块级压缩 K/V 捕获全局粗粒度上下文、选择分支用门控挑出 top-k 重要块做精确注意力、滑窗分支只看最近 l 个 token,再用可学习门控权重 g1/g2/g3 加权融合三路输出三分支数据流(box-drawing 框图):┌──────────────── 输入序列 K/V(按块长 l 切块)────────────────┐ │ 块0 块1 块2 块3 块4 ... 块N-1 │ └───────┬───────────┬───────────────────────────┬─────────────┘ ↓ ↓ ↓ ┌───────────┐ ┌─────────────┐ ┌──────────────────┐ │ 压缩分支 │ │ 选择分支 │ │ 滑窗分支 │ │ 块级池化 │ │ 门控打分 g │ │ 仅取最近 l token │ │ Compress │ │ TopK 选 k 块 │ │ 局部精确注意力 │ │ 粗粒度Attn │ │ 选块精确Attn │ │ │ └─────┬─────┘ └──────┬──────┘ └────────┬─────────┘ ↓ O_cmp ↓ O_slt ↓ O_win └──────────── 门控加权 O = g1·O_cmp + g2·O_slt + g3·O_win ───────────┘ ↓ 最终输出(g1/g2/g3 可学习、softmax 归一)压缩分支(块公式,把每 l 个 token 压成 1 个代表 token 再做注意力):K m a t h r m c m p = m a t h r m C o m p r e s s ( K ) , q u a d V m a t h r m c m p = m a t h r m C o m p r e s s ( V ) , q u a d O m a t h r m c m p = m a t h r m A t t n ( Q , K m a t h r m c m p , V m a t h r m c m p ) K_{mathrm{cmp}} = mathrm{Compress}(K),quad V_{mathrm{cmp}} = mathrm{Compress}(V),quad O^{mathrm{cmp}} = mathrm{Attn}(Q, K_{mathrm{cmp}}, V_{mathrm{cmp}})Kmathrmcmp=mathrmCompress(K),