GQA(分组查询注意力)
一种多头注意力的变体,将多个查询头分组共享同一个键值头,大幅减少 KV 缓存大小,是 MHA 和 MQA 的中间方案,已成为 2023-2024 年大模型的标准配置。
标准多头注意力(MHA)每个注意力头都有独立的 K、V、Q 投影。MQA(Multi-Query Attention)让所有头共享同一组 K、V。GQA 取中间:将 Q 头分为若干组,每组共享一组 K、V 头。
例如 Llama 2 70B:64 个 Q 头,8 个 KV 头 → 每 8 个 Q 头共享 1 组 KV。KV 缓存减少 8×。
- 推理效率:KV 缓存是自回归推理的主要内存瓶颈。GQA 以极小的质量代价大幅减少 KV 缓存
- 实际效果:Llama 2 34B/70B 引入 GQA,相比 MHA 推理吞吐显著提升;Mixtral/Qwen2/Llama 3 全部采用
- 质量损失极小:相比 MQA(所有头共享 KV),GQA 保留了更多的 KV 表达能力
因此 KV 缓存缩小为原来的 ,即减少 倍。
若 、,常见的连续分组是 Q 头 1–4 使用 KV 头 1,Q 头 5–8 使用 KV 头 2,以此类推。每个 Q 头的 Q 投影和注意力权重仍独立;共享的是同一 KV 投影及其缓存,不是对 K/V 或 Q 做平均。
代码中,K/V 投影层只输出 个头。教学实现可将 K/V 沿 head 维按 次逻辑展开;生产实现应由支持 GQA 的 attention 内核按组读取,避免真的复制张量。FlashAttention 与 GQA 可叠加:前者减少 attention 的 HBM I/O,后者减少 KV Cache 的大小。
| 方法 | KV 头数 | 方案 | 代表 |
|---|---|---|---|
| MHA | = Q 头数 | 每头独立 KV | 原始 Transformer、GPT-3 |
| MQA | = 1 | 所有头共享 KV | PaLM |
| GQA | = G 组 | Q 头分 G 组共享 KV | Llama 2/3、Mixtral、Qwen2 |
| MLA | 低秩潜向量 | KV 压缩到潜空间 | DeepSeek-V2 |
- “GQA 和 MQA 差不多” — GQA 比 MQA 质量好得多,仅比 MHA 略低
- “GQA 只影响推理” — GQA 训练时也减少了 K/V 计算量,加速训练
来自 personal chatgpt 课程的源码例
Section titled “来自 personal chatgpt 课程的源码例”第 21 讲在 Llama 源码中使用:
将每个 KV head 逻辑服务于 个 Q heads。repeat_kv 的教学实现通过 reshape/expand 得到 attention 期望的 head 维;共享的是 K/V 投影和 cache,不是对多个 Q 做平均。
第 29 讲的 Llama 3 8B 算例为 32 个 Q heads、8 个 KV heads,即 4:1 分组。它同时减少 K/V 投影参数和 KV Cache,但 Q/O 投影不按 4 倍缩小。