GQA:大模型怎样在注意力质量和 KV 缓存之间折中?

TL;DR

GQA 将查询头分组,让组内共享 Key/Value 头,在多头注意力与多查询注意力之间寻找折中。本文说明它如何影响 KV cache,并提醒论文中的质量与速度表现依赖模型和训练条件。

GQA 将查询头分组,让组内共享 Key/Value 头,在多头注意力与多查询注意力之间寻找折中。本文说明它如何影响 KV cache,并提醒论文中的质量与速度表现依赖模型和训练条件。

GQA:大模型怎样在注意力质量和 KV 缓存之间折中?

大语言模型生成每个新 token 时,需要反复参考此前 token 的 Key 和 Value。为了避免每一步都重算,推理系统通常把这些中间状态放进 KV cache。上下文越长、并发用户越多,缓存占用就越明显;而多头注意力(MHA)为每个查询头保存自己的 Key/Value,成本可能很高。

Grouped Query Attention(GQA,分组查询注意力)在 MHA 与 Multi-Query Attention(MQA)之间取了一个折中。MHA 通常让每个查询头拥有一组独立的 Key/Value 头;MQA 则让许多查询头共享同一组 Key/Value;GQA 把查询头分成若干组,每组共享一个或少数几个 Key/Value 头。组数不同,缓存规模和模型表达能力也随之改变。

一个简化例子:如果有 16 个查询头,MHA 可能对应 16 组 Key/Value;MQA 可能让 16 个查询头共同使用 1 组;GQA 则可能分成 4 组,每组查询头共享一组 Key/Value。实际模型的头数和维度各不相同,这只是解释结构的示意。由于 KV cache 与 Key/Value 头数相关,GQA 通常能比 MHA 少存储一部分缓存数据,并减少推理时的内存带宽压力。

为什么不一律使用 MQA?共享得越多,模型需要在有限的 Key/Value 表示中服务更多查询头,可能影响质量。GQA 通过保留多个分组,让模型在缓存效率与表达能力之间寻找平衡。原始研究展示了在特定模型规模、训练和 uptraining 设置下,GQA 能兼顾接近 MHA 的质量与更好的推理速度;这并不等于所有模型、所有任务都必然得到同样收益。

可以把注意力头想成一组记者:每位记者提出不同问题(Query),但需要查阅采访记录(Key/Value)。MHA 给每位记者单独建档,档案精细却占空间;MQA 让所有人共用一本档案,最省空间却可能不够丰富;GQA 则让若干记者共享一套档案,形成中间方案。

GQA 改的是注意力内部 Key/Value 头的组织方式,不是把注意力机制替换成检索,也不意味着缓存消失。实际性能还取决于模型是否按这种结构训练、推理引擎是否优化对应内核,以及硬件瓶颈位于计算还是内存带宽。阅读模型说明时,关注查询头与 KV 头数量的比例,往往就能快速看出它在缓存方面做了怎样的取舍。

来源:Ainslie 等:GQA,EMNLP 2023

KEEP READING