Attention 架构演化:从多头注意力(MHA)到 GQA、MLA
用 KV 共享、表示压缩、访问稀疏和递推状态四条路线理解现代 LLM Attention
现代 LLM 没有沿一条路线简单“替代 MHA”。更稳定的理解方式是看四个控制点:存几份 KV、每份表示多大、每步访问多少历史,以及是否仍保存逐 token KV。
- 一句话:Attention 演化是在表达能力、KV 容量、历史扫描和硬件效率之间重新分配成本。
- 三个判断:MQA/GQA 减少 KV 份数;MLA 压缩 KV 表示;稀疏/局部与递推结构分别减少访问范围和逐 token 历史存储。
- 核心模型:
KV 共享 → 表示压缩 → 访问稀疏 → 递推状态是四条正交坐标,可被组合而非互斥替代。 - 边界:FlashAttention 主要改变精确 attention 的实现;GQA、MLA、稀疏和递推结构改变模型参数化或可见区域,不能都称为“等价加速”。
1. 基线:缩放点积注意力与 MHA
单头缩放点积注意力为:
Query 表示“当前在找什么”,Key 用于匹配,Value 是匹配后取回的内容。MHA 用多组投影并行学习不同表示子空间:
逻辑上的多个 head 通常由融合 GEMM 一次生成 Q/K/V 后再 reshape;它不意味着物理上执行许多独立小矩阵乘法。W^O 是输出投影,也不是 softmax attention weight。
MHA 的服务成本集中在三处:
| 阶段 | 主要成本 | 随上下文增长 |
|---|---|---|
| Prefill | Query 与可见 Key 的交互 | dense causal attention 约为 |
| Decode | 每步读取历史 K/V | 每步约为 |
| 常驻资源 | 每层、每 token 的 K/V | 容量约为 |
2. 四条演化路线
| 路线 | 控制点 | 代表结构 | 主要收益 | 主要代价 |
|---|---|---|---|---|
| KV 共享 | 存几份 K/V | MQA、GQA | 降低 cache 容量与读取量 | 约束 KV 参数化 |
| 表示压缩 | 每份 KV 多大 | MLA | 降低 bytes/token | 需要专用投影、layout 和 kernel |
| 访问稀疏 | 每步看多少历史 | Sliding Window、Block/Routed Sparse | 降低长上下文交互 | 可能漏掉远距离信息 |
| 递推状态 | 是否保存逐 token KV | Linear/Recurrent Attention | decode 读写固定状态 | 有限状态会压缩历史细节 |
这些路线可以混合。例如一套模型可以在多数层使用局部或递推结构,在少数层保留完整 GQA/MLA,并在系统层继续做分页和量化。
3. MQA 与 GQA:减少 KV 份数
设 Query heads 数为 ,KV heads 数为 :
| 架构 | Query heads | KV heads | 共享方式 |
|---|---|---|---|
| MHA | 每个 Q head 有独立 K/V | ||
| GQA | ,且 | 一组 Q heads 共享一组 K/V | |
| MQA | 所有 Q heads 共享一组 K/V |
缓存元素数由 KV heads 决定:
MQA 共享最强,GQA 是 MHA 与 MQA 之间的折中。这里不展开 cache 总量与分页,统一见 KV Cache。
4. MLA:压缩表示
MLA 先把 hidden state 压到共享 latent:
它主要缓存 latent KV 与小型 RoPE 分支,而不是按多个 KV heads 保存完整 K/V。矩阵吸收又让 decode 可以避免显式恢复全部历史向量。因此它与 GQA 的作用点不同:
GQA / MQA:减少独立 KV 的份数
MLA: 压缩 KV 共同依赖的表示
低秩结构、RoPE 解耦、矩阵吸收和 serving 边界见 DeepSeek MLA。
5. 局部与稀疏注意力:减少“看谁”
局部或稀疏注意力直接改变访问范围:
- Sliding Window 只看最近 个 token。
- Local/Global Hybrid 让多数层看局部、少数层看全局。
- Block/Routed Sparse 根据 Query 选择少量历史块。
它们减少计算和访存,但选择机制可能漏掉远距离关键信息;优化的是可见区域,不是 KV 表示。CSA/HCA 是一个仍待主来源核验的具体案例,见 CSA/HCA 注意力。
6. 递推式注意力:用状态概括历史
递推结构不要求每步读取完整逐 token KV,而是更新有限状态:
这样 decode 成本不再随完整 KV 序列同样增长;代价是历史被压缩进有限状态,prefill 还需要 scan、chunk 或三角矩阵等并行化。真实 kernel 中的 chunk 与 scheduler 的 chunk 不是同一概念,见 GDN 与 Chunked Prefill。
7. “精确”必须分层判断
| 技术 | 是否与完整 MHA 数学等价 | 改变了什么 |
|---|---|---|
| FlashAttention | 是,忽略浮点舍入顺序差异 | tiling、online softmax 与 IO |
| MQA / GQA | 否 | K/V 参数化和共享约束 |
| MLA | 否;可保留完整历史 softmax 访问 | KV 表示的低秩约束 |
| 局部/稀疏注意力 | 否 | 一部分 token 对不参与计算 |
| 线性/递推式注意力 | 通常否 | 用新算子或有限状态替代完整 softmax |
“不与 MHA 数学等价”不等于模型一定更差:这些结构通常从训练开始适应自身约束。系统评估时应分别验证模型质量、可见区域、cache bytes/token 和目标硬件上的 kernel 路径。
8. 如何读混合架构
面对新架构,依次回答四个问题:
- 每层保存的是完整 K/V、共享 K/V、latent,还是固定状态?
- Query 能访问完整历史、局部窗口,还是选出的块?
- Prefill 与 decode 是否走不同 kernel/layout?
- 哪些结论来自架构定义,哪些只是某个引擎或版本的实现?
这样可以把模型机制与 serving 实现分开,也能避免只凭名称推断 KV 容量或复杂度。
相关页面
- Token Flow 与 Hidden State — Attention 在单步模型数据流中的位置。
- KV Cache — 容量公式、分页和生命周期。
- DeepSeek MLA — latent KV、RoPE 解耦与矩阵吸收。
- CSA/HCA 注意力 — 压缩与稀疏访问案例及核验边界。
- GDN 与 Chunked Prefill — 递推状态与 kernel chunk。
← 被以下页面引用(10)
- CSA/HCA 注意力:DeepSeek-V4 的混合压缩稀疏机制ai-systems · synthesis
- DeepSeek MLA:低秩 KV Cache 与推理效率ai-systems · synthesis
- Kimi K3:架构、训练与推理系统研究ai-systems · synthesis
- LLM 推理系统全栈地图ai-systems · synthesis
- Prefill Trace:Worker 供给、DSA/MLA 与 Chunked Prefillai-systems · synthesis
- 推理 Kernel / Runtime 优化:少搬、少启、少等ai-systems · concept
- Causal Attention:为什么 KV hit 后 Attention 按 1 - h² 缩放ai-systems · concept
- GDN 与 Chunked Prefill:为什么 prepare_chunk_indices 会出现在 trace 里ai-systems · concept
- KV Cache:推理性能的命根子ai-systems · concept
- Token Flow 与 Hidden State:从 Attention 到 LM Headai-systems · concept
修改历史2 次提交
- docs: refine LLM inference knowledge systemxiaocheng··
f8756b9 - docs(wiki): map modern attention evolutionxiaocheng··
90df777