04. MHA、MQA、GQA 有什么区别?各自适合什么场景?

整理 MHA、MQA、GQA 的差异、权衡与适用场景。

简单回答

MHA(Multi-Head Attention)每个 head 有独立的 Q、K、V,表达能力最强但 KV Cache 最大。MQA(Multi-Query Attention)所有 head 共享一套 K、V,KV Cache 最小但可能损精度。GQA(Grouped Query Attention)是折中方案,将 head 分组,组内共享 K、V。主流大模型普遍用 GQA,因为它在推理效率和模型质量之间取得了最好的平衡。

详细解释

MHA:标准方案

MHA 全称 Multi-Head Attention,是原始 Transformer 的设计。假设模型有 h 个 head,每个 head 有独立的 ,分别投影到 维。各 head 并行计算 attention,最后把输出 concat 起来再过一个线性层。

优点是表达能力最强,每个 head 可以学到完全不同的注意力模式。缺点是 KV Cache 大——推理时每一层每个 head 都要缓存 K 和 V,总缓存量为 (L 层,h 个 head,n 个 token)。当模型很大、序列很长时,KV Cache 往往成为显存瓶颈。

MQA:极端压缩

MQA 全称 Multi-Query Attention,由 Noam Shazeer 在 2019 年提出。它的做法非常激进:所有 head 共用同一套 K 和 V,只有 Q 是每个 head 独立的。

KV Cache 从 h 份缩减为 1 份,压缩了 h 倍(如果 h=32,就是 32 倍)。推理速度提升非常显著,尤其在 batch 大或序列长的场景。

代价是精度可能有损——所有 head 看到完全相同的 K 和 V,不同 head 对上下文的"视角"只能通过 Q 的差异来区分,多样性受限。在较小的模型上精度损失更明显,大模型上差距较小。

GQA:折中方案

GQA 全称 Grouped Query Attention,由 Ainslie et al. (2023) 提出,被 LLaMA 2/3 采用后成为主流。

做法是把 h 个 head 分成 g 组,每组内共享一套 K、V。比如 32 个 head 分成 8 组,每组 4 个 head 共享 K、V。KV Cache 从 h 份减少为 g 份。

GQA 可以看成 MHA 和 MQA 的连续谱:当 g = h 时,就是 MHA(每个 head 独立);当 g = 1 时,就是 MQA(所有 head 共享)。实际中 g 通常取 4 或 8。

论文里的实验表明,GQA 在质量上非常接近 MHA,在效率上接近 MQA,是目前公认的最佳权衡。

各自适合什么场景?

MHA 适合对质量要求极高、推理成本不是主要瓶颈的场景,或者模型较小(KV Cache 本身不大)的情况。实际上新训的大模型已经很少用标准 MHA 了。

MQA 适合对推理延迟极度敏感、且模型足够大(大模型下精度损失小)的场景。一些 Google 的模型(如 PaLM)用了 MQA。

GQA 是目前的主流选择。LLaMA 2/3、Mistral、Qwen 2 等都用 GQA。在几乎所有实际场景中,GQA 都是最优选。

和 MLA 的关系

DeepSeek 的 MLA(Multi-head Latent Attention)是另一种思路。它不是简单地让多个 head 共享 K、V,而是把 K 和 V 联合压缩到一个低维的 latent 向量,推理时只缓存这个 latent 向量,用的时候再解压。MLA 的压缩比可以做到比 GQA 还高,同时每个 head 解压出的 K、V 是不同的,理论上表达能力不损失。但实现复杂度更高,对硬件优化也有额外要求。

KV Cache 大小对比

假设模型有 32 个 head,以单层为单位:MHA 需要缓存 32 套 KV;GQA(8 组)缓存 8 套 KV,压缩 4 倍;MQA 缓存 1 套 KV,压缩 32 倍。对于 70B 级别的模型处理 128K 上下文,GQA 可以把 KV Cache 从上百 GB 降到几十 GB,这个差距直接决定了能不能跑得起来。

面试时可以这样答

MHA、MQA、GQA 的区别核心在 KV 的共享程度。MHA 是标准方案,每个 head 有独立的 Q、K、V,表达能力最强但 KV Cache 最大。MQA 走极端,所有 head 共享一套 K 和 V,KV Cache 压缩了 h 倍,推理很快,但精度可能有损。GQA 是折中,把 head 分成若干组,组内共享 KV。

实际效果上,GQA 质量非常接近 MHA,效率接近 MQA,所以现在主流大模型基本都用 GQA。LLaMA 2/3、Mistral、Qwen 都是这个方案。

从工程角度看,选择 MHA 还是 GQA 最直接的考量就是 KV Cache 大小。32 个 head 的模型,GQA 8 组可以把 KV Cache 压缩 4 倍,在长上下文场景下这个差距决定了能不能实际部署。

另外可以提一下 DeepSeek 的 MLA,它走了一条和 GQA 完全不同的路——不是共享 KV,而是把 KV 联合压缩到低维 latent 空间,压缩比更高,理论上表达能力也不损失,但实现更复杂。

常见追问

  1. GQA 的分组数 g 怎么选?有没有最优的经验值?
  2. 已经训好的 MHA 模型能不能转成 GQA?怎么做?
  3. MLA 相比 GQA 在实际推理延迟上有优势吗?它的额外开销在哪?