一句话定义
GQA 与 MQA 是 MHA 的变体:Q 头数量不变,但多个 Q 头共享同一组 K/V。MQA 让所有 Q 头共享一组,GQA 把 Q 头分成若干组、每组共享一组。
为什么需要它们
长上下文推理时,KV Cache 的显存和带宽会随层数、头数、序列长度线性增长。减少 K/V 的份数,就能直接缩小缓存;Q 头仍然可以保留多个,维持一定的表达能力。
怎么工作
- MHA:每个 Q 头都有独立的 K/V,KV Cache 份数 = Q 头数。
- MQA:所有 Q 头共享一组 K/V,缓存最小,但表达压缩最狠。
- GQA:每 g 个 Q 头共享一组 K/V;g 介于 1 和 Q 头数之间,是质量和显存的折中。
注意力公式本身不变,只是 K/V 的来源从“每头一份”变成“每组一份”。缓存大小约为 2 × 层数 × K/V 组数 × 头维度 × 序列长度 × batch。
关键取舍
- MQA 最省显存和带宽,但质量可能下降;GQA 通常更平衡。
- 组数越少越省,越多越接近 MHA;要结合模型规模、上下文长度和评测选。
- 组数 g 常取 2–8;具体要看模型规模、上下文长度和 KV Cache 预算。
- 省的是 KV Cache,不是注意力计算量;训练和推理的收益要分开看。
常见误区
- GQA/MQA 不是“减少 Q 头”,Q 头数量通常不变。
- 它们不改变注意力的语义公式,只改变 K/V 的共享方式。
- 省显存不等于一定更快;还要看算子、batch 和硬件。
用在哪里
- 长上下文 LLM 推理、批量服务、显存受限的部署。
- 需要在质量和 KV Cache 之间折中时,优先试 GQA;极端省显存才用 MQA。
- 看开源模型配置时,
num_key_value_heads往往就是 GQA 的组数。