核心要点

  • 能点出痛点:自回归解码每步都要读全部历史 token 的 KV-cache,多头注意力下 KV-cache 又大又是访存瓶颈

  • 能讲清 MQA:所有 Query 头共享同一组 K/V,KV-cache 缩小约 head 数倍,但表达力下降、质量可能掉

  • 能讲清 GQA:把 Query 头分成 g 组、每组共享一组 K/V,是 MHA 与 MQA 之间的折中,质量几乎不掉而显存大降

  • 能说出收益:更小 KV-cache → 更长上下文、更大 batch、更高解码吞吐,是当代主流大模型的标配

标准回答

要解决的问题

decode 阶段是访存受限的:每生成一个 token 都要把历史所有 token 的 K、V 从显存读出来做注意力。标准多头注意力(MHA)每个头都有独立的 K/V,KV-cache 随头数、层数、序列长度线性膨胀,既占显存又拖慢解码。

MQA(Multi-Query Attention)

让全部 Query 头共享同一组 K、V。KV-cache 体积大约缩小为原来的 1/头数,解码访存骤降、吞吐显著上升。代价是 K/V 表达力被压缩,模型质量可能有可感知的下降。

GQA(Grouped-Query Attention)

折中方案:把 Query 头分成 g 组,组内共享一组 K/V。g=1 退化为 MQA,g=头数退化为 MHA。通常取 4~8 组,就能在质量几乎无损的前提下把 KV-cache 缩到接近 MQA 的水平,因此 Llama-2/3、Mistral 等主流模型普遍采用。

带来的收益

KV-cache 变小直接换来更长上下文、更大并发 batch 与更高解码吞吐。详见 LLM 推理加速实战

常见误区

⚠️ 常见踩坑

别说 MQA/GQA「减少了 Query 头」——Query 头数量不变,共享的是 K/V 头;也别把它和 FlashAttention 混淆,前者改的是模型结构(KV 头数),后者只改注意力的访存方式。

追问

追问 1已有 MHA 模型能转成 GQA 吗?

可以。常见做法是对每组内的多个 K/V 头做均值池化得到共享的 K/V,再用少量数据继续预训练(uptraining)恢复质量,成本远低于从头训练。

追问 2GQA 的分组数怎么选?

在质量与显存间权衡:组数越少 KV-cache 越小但质量风险越高。实践常取 8 组左右,需结合目标上下文长度、显存预算与下游评测确定。

追问 3MLA 与 GQA 有何不同?

MLA(多头潜在注意力,DeepSeek)把 K/V 压缩成低秩潜在向量缓存,再在用时投影回来,相当于从另一个角度压 KV-cache,压缩率通常更高且对质量影响小。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。