LLM中分组查询注意力机制(Grouped-Query Attention, GQA)
模式全称结构 (Q : KV)显存占用效果 (智商)代表模型MHA1 : 1(很多头对很多KV)巨大 (贵)⭐⭐⭐⭐⭐MQAN : 1(很多头对1个KV)极小 (省)⭐⭐⭐StarCoderGQAN : M(分组共享)适中⭐⭐⭐⭐✨LLaMA-2/3, MistralGQA 就是在**“效果”和“速度/显存”**之间找到的最佳平衡点。现在的开源大模型如果不发 GQA,出门都不好意思跟人打招呼。
分组查询注意力机制(Grouped-Query Attention, GQA)
这位同学,你这个问题提得非常**“紧跟时事”**!
如果你去读现在最火的大模型(比如 LLaMA-2, LLaMA-3, Mistral)的技术报告,你会在显著位置看到 GQA (Grouped-Query Attention) 这个词。
它不是一个新的架构,而是一个**“省钱省内存”的极致优化技巧**。
简单说:它是为了解决**“大模型推理速度太慢、显存不够用”**这个问题而诞生的。
我们用一个**“点菜”**的例子,来对比三种注意力机制,你就秒懂了。
第一阶段:MHA (Multi-Head Attention) —— 传统的“土豪”模式
这是最早 Transformer (BERT, GPT-2) 用的标准模式。
场景模拟:
假设有 8 个顾客(8 个 Query 头)来餐厅吃饭。
-
配置: 餐厅给这 8 个顾客,每人配备了 1 个专属服务员(Key)和 1 份专属菜单(Value)。
-
比例: 8 个 Q 配 8 组 KV。(1:1)
-
优点: 服务极其周到,每个人想吃啥都能精准匹配,脑子清楚(效果最好)。
-
缺点: 太浪费资源了!
- 在大模型推理时,我们需要把这些 K 和 V 都存在显存里(这叫 KV Cache)。
- 如果是 MHA,显存很快就被这些重复的 KV 填满了,导致你很难处理长文章,或者生成速度变慢。
第二阶段:MQA (Multi-Query Attention) —— 极端的“省钱”模式
为了解决显存爆炸的问题,有人(Google 2019年)提出了 MQA。
场景模拟:
还是 8 个顾客(8 个 Query 头)。
-
配置: 餐厅为了省钱,只雇了 1 个服务员(Key)和 1 份菜单(Value),让这 8 个顾客共享。
-
比例: 8 个 Q 配 1 组 KV。(N:1)
-
优点: 极其省显存! 速度飞快。
-
缺点: 脑子容易乱。
- 大家共用一套信息,细节容易丢失,模型的智商(效果)会明显下降,稍微复杂点的问题就回答不好了。
第三阶段:GQA (Grouped-Query Attention) —— 完美的“中庸之道”
这就是 LLaMA-2 引入的主角。它觉得 MHA 太贵,MQA 太傻,于是折中了一下。
场景模拟:
还是 8 个顾客(8 个 Query 头)。
-
配置: 我们把顾客分成 4 个小组(Group),每组 2 个人。
-
分配: 每 1 个小组,共享 1 个服务员和 1 份菜单。
-
比例: 8 个 Q 配 4 组 KV。(2:1,或者 4:1,看具体设置)
-
优点:
- 省显存: 比 MHA 省了很多(KV 数量变成了原来的 1/2 或 1/4)。
- 效果好: 比 MQA 聪明很多,几乎和 MHA 的效果一样好。
- 速度快: 推理速度大幅提升。
技术细节:为什么要这么做?(KV Cache)
你可能会问:“只是少存几个矩阵,有那么重要吗?”
非常重要!
在 GPT 这种生成式模型里,每生成一个字,都要回顾之前所有的字。为了不重复计算,我们会把之前算好的 K 和 V 矩阵存在显存里,这就叫 KV Cache。
- 对于 70B 这样的大模型:
- 如果是 MHA,KV Cache 巨大无比,一张 A100 显卡可能光存这些“记忆”就存满了,根本没空间算新东西。
- 如果是 GQA,KV Cache 的大小直接缩小为原来的 1/8(假设分了8组),这意味着:
- 你可以输入更长的 Prompt(比如几十万字的书)。
- 你可以用更便宜的显卡跑大模型。
- 生成的速度更快(因为从显存搬运数据的时间少了)。
总结一张表
| 模式 | 全称 | 结构 (Q : KV) | 显存占用 | 效果 (智商) | 代表模型 |
|---|---|---|---|---|---|
| MHA | Multi-Head Attention | 1 : 1 (很多头对很多KV) | 巨大 (贵) | ⭐⭐⭐⭐⭐ | BERT, GPT-3 |
| MQA | Multi-Query Attention | N : 1 (很多头对1个KV) | 极小 (省) | ⭐⭐⭐ | StarCoder |
| GQA | Grouped-Query Attention | N : M (分组共享) | 适中 | ⭐⭐⭐⭐✨ | LLaMA-2/3, Mistral |
一句话总结:
GQA 就是在**“效果”和“速度/显存”**之间找到的最佳平衡点。现在的开源大模型如果不发 GQA,出门都不好意思跟人打招呼。
GQA不是窗口注意力吧
完全正确!你的直觉非常敏锐。
GQA(分组查询注意力) 和 Window Attention(窗口注意力/滑窗注意力) 根本就是两码事。
它们虽然都是为了“省资源”,但省的方向完全不同。
为了让你一辈子忘不了,我们用一个**“复习考试”**的例子来打比方。
1. GQA (Grouped-Query Attention) —— 是在“精简笔记”
- 痛点: 显存(KV Cache)不够用。
- 做法:
- 本来每门课(每个 Query 头)都要配一本单独的教科书(Key/Value)。
- GQA 说:“太占地方了!咱们几门课共用一本教科书吧。”
- 比如:语文和历史共用“文科书”,数学和物理共用“理科书”。
- 关键点: 它的视野依然是全局的。 只要你把书存下来,哪怕是这学期第一天学的知识,GQA 依然能回头查到。
- 本质: 压缩的是通道数(Heads),是为了省显存。
2. Window Attention (Sliding Window Attention) —— 是在“只看重点”
- 痛点: 文章太长,计算量爆炸(O(N2)O(N^2)O(N2)),算不过来。
- 做法:
- Window Attention 说:“别复习第一天学的内容了,肯定考不到。我们只复习最近一周的内容!”
- 这就好比拿着一个手电筒在长长的卷轴上移动,你只能看见光圈(窗口)里的字。
- 比如:你在写第 10000 个字的时候,只能回头看见第 6000 到第 9999 个字。第 1 个字早就忘光了。
- 关键点: 它的视野是局部的。 超过窗口大小的旧信息,它就看不见了(或者需要用其他技巧间接看)。
- 本质: 限制的是序列长度(Sequence Length),是为了省计算量(把复杂度从平方级降到线性级)。
3. 为什么容易混淆?(罪魁祸首:Mistral)
之所以很多人会把这两个搞混,是因为著名的开源模型 Mistral 7B。
Mistral 7B 这个模型是个“缝合怪”(褒义),它同时用了这两个技术:
- 它用了 GQA:为了让 7B 的模型能在小显卡上跑,且推理快。
- 它用了 SWA (Sliding Window Attention):为了能处理比较长的上下文,但又不至于算得太慢。
所以大家在看 Mistral 的技术报告时,经常看到这两个词挨在一起,就容易觉得它们是一回事。其实它们是两个独立的“优化插件”。
4. 终极对比表
| 特性 | GQA (分组查询注意力) | Window Attention (窗口注意力) |
|---|---|---|
| 核心动作 | 几个人共用一份资料 (KV共享) | 只看最近的资料 (视野限制) |
| 被砍掉的是啥 | 砍掉了KV Head的数量 (通道维度) | 砍掉了太久远的记忆 (时间维度) |
| 视野范围 | Global (全局) 理论上能看到所有以前的词 |
Local (局部) 只能看到窗口内的词 |
| 主要解决 | 显存爆炸 (KV Cache占用) | 计算太慢 (Attention矩阵太大) |
| 典型代表 | LLaMA-2, LLaMA-3 | Longformer, Mistral (它俩都用了) |
一句话总结:
- GQA 是为了让你的书包(显存)能装下更多书,但书的内容不减。
- Window Attention 是为了让你阅读速度变快,强行规定只准读最近的几页。
这下分得清清楚楚了吧?
更多推荐



所有评论(0)