分组查询注意力(Grouped Query Attention,GQA)是大模型注意力机制的一种变体:它把多个查询头分成若干组,每组共用同一对键和值,只保留各自的查询。2023年,Ainslie等人在论文中把它作为多查询注意力的推广提出,目的是在推理时少存、少搬键值缓存,换取更低的显存占用和更快的生成速度,同时尽量保住多头注意力的表达能力。
分组查询注意力是怎么省下显存的?
大模型逐词生成时,会把前面每个词元的键和值存进KV缓存,下一步直接复用,不必重算。多头注意力给每个查询头各配一对键值头,缓存随查询头数增长;分组查询注意力只给每组配一对,缓存大小跟着键值头数走。32个查询头分成8组、只用8个键值头时,缓存大约是原来的四分之一。查询头仍各算各的注意力权重,只是共用同一组键值去比对、取值,分组越少省得越多,表达空间也越受挤压。
| 方式 | 键值头 | 缓存 |
|---|---|---|
| 多头注意力 | 与查询头一样多 | 最大 |
| 分组查询注意力 | 按组共享,介于两者之间 | 居中 |
| 多查询注意力 | 只有1个 | 最小 |
分组查询注意力容易被误解成什么?
它不是训练后的压缩手段,也不是量化或剪枝:分组方式在模型结构里就定好了,训练时就按分组共享键值学习;已有模型也可合并键值头、继续训练一小段时间转成分组形式,论文称只需原预训练约5%的算力。它也不等于压缩缓存:多头潜在注意力是把键值压成低维潜向量再还原,省的是每个头的存量;分组查询注意力省的是头的个数,两条路可以并存,但不能互相替代。更不能指望它延长上下文窗口、减少幻觉或提升推理能力,窗口由训练和位置编码决定,答案质量仍取决于模型本身,它只是在相近质量下让推理更省。
什么时候值得看重分组查询注意力?
长上下文、大批量并发、对显存敏感的部署最受益:缓存随上下文和并发数放大,分组省下的显存会直接变成能接的请求数或能跑的上下文。短对话、单用户、小模型上,省下的量有限,不必为它换模型。选模型时别只看参数量,看配置里的查询头数与键值头数:键值头明显少于查询头,就是用了分组或多查询思路;两者相等,一般仍是标准多头注意力。Llama 3的8B版本用32个查询头配8个键值头,是常见的分组实例。