一句话定义
分组查询注意力(Grouped-Query Attention,GQA) 是一种注意力机制的折中设计:把多个 Query 头分成若干组,每组共用同一份 Key 和 Value,从而在几乎不损失效果的前提下,把推理时的 KV 缓存显存占用砍掉一大截。
打个比方:档案柜
想象一个客服中心。
- 多头注意力(MHA):每个客服(Query 头)都配一个自己的档案柜(Key/Value)。查资料最快,但公司要买几十个柜子,占地又费钱。
- 多查询注意力(MQA):全公司只放一个大档案柜,所有人挤过去查。省地方,但高峰期排队严重,而且逼所有人用同一套资料,记性会变差。
- GQA:每 4 个客服共用 1 个柜子。柜子数量降到 1/4,查资料也不至于太挤,效果几乎和一人一柜差不多。
所谓“分组”,就是让若干个 Query 头去共享同一组 Key/Value 头。
具体省在哪里
大模型生成文字是一字一字往外吐的。每吐一个字,都要拿当前状态去和前面所有字做注意力计算。为了不重复算,前面那些字对应的 Key/Value 会被缓存下来,叫做 KV 缓存(KV Cache)。
问题在于:这个缓存随上下文长度、批量大小线性增长。上下文十万字、同时服务几百个用户,缓存会迅速吃掉显存;而且每生成一个 token 都要把整个缓存读一遍,显存带宽也成了瓶颈。
注意力头数量的对比很直观(举例:32 个 Query 头):
| 方案 | Q 头 : KV 头 | KV 缓存规模 | 效果与开销 |
|---|---|---|---|
| MHA | 32 : 32 | 最大 | 效果通常最好,开销最高 |
| GQA | 32 : 8 | 约 1/4 | 接近 MHA,开销明显下降 |
| MQA | 32 : 1 | 最小 | 最省,但效果和训练稳定性容易打折 |
GQA 正好站在 MQA 和 MHA 之间,多数情况下是性价比最高的那一档。
为什么配置里到处都是它
打开现在很多开源大模型的配置文件,你会看到两个参数:num_attention_heads 和 num_key_value_heads。前者是 Query 头数量,后者是 Key/Value 头数量。只要后者小于前者,这个模型用的就是 GQA。
它成为默认选项的原因很实际:
1. 推理成本直接和 KV 缓存挂钩,GQA 用一个几乎无损的改动换来数倍的显存与带宽节省。
2. 支持更长的上下文和更大的并发批量,这两件事恰好是当下应用最缺的。
3. 已有模型可以从 MHA 继续训练(业界俗称 uptraining)平滑切换到 GQA,不必从零重训一遍。
换句话说,它不是学术上的花活,而是被工程账本逼出来的通用做法。
对从业者意味着什么
- 做推理部署时,估算显存必须先算 KV 缓存,而 KV 头数就是关键乘数;看到 GQA 就知道预算能松不少。
- 做模型选型时,不要只看总参数量,KV 头数量和最大上下文长度对服务成本的影响可能更大。
- GQA 通常和分页注意力等缓存管理技术搭配使用,效果叠加。
对普通职场人意味着什么
就是那句体感上的变化:助手能记住更长的对话,还能同时服务更多人,响应也更快。 至于各家的具体实现细节和参数,以官方页面和模型卡为准。
GQA 不改变模型“会不会”,只改变模型“跑不跑得起”。在算力越来越贵的今天,后者的分量常常更重。
