首页/AI/大模型部署与运维速查/注意力头结构:KV 规模的关键变量
推理参数与优化50 条

注意力头结构:KV 规模的关键变量

注意力变体直接决定 KV 缓存规模:MHA 每头独立 KV、GQA 多个查询头共享一组 KV、MQA 全部共享一组;共享程度越高,KV 越小、推理越省显存。

结构决定缓存规模

注意力结构的差异直接决定了缓存规模。早期的多头注意力,每个查询头都有自己的一组缓存;分组查询注意力让多个查询头共享一组缓存;多查询注意力则全部共享一组。共享程度越高,缓存越小、推理越省显存,这也是后来的模型普遍采用分组查询结构的原因。

基本信息

适用平台所有基于注意力机制的生成式模型
查看位置模型配置文件里的查询头数与缓存头数字段
判断方式缓存头数小于查询头数,就说明用了共享结构
影响面缓存显存、可并发序列数、解码期的带宽压力

三种结构对照

变体缓存组数缓存显存代表
MHA等于头数高早期模型
GQA少于头数,常见四分之一到八分之一中主流开源模型
MQA一组低部分生成模型

从配置读出系数

从配置读出系数
# 模型目录下的配置文件里查看查询头数与缓存头数
python -c "import json;c=json.load(open('config.json'));print(c['num_attention_heads'], c.get('num_key_value_heads'))"
# 两者相除就是缓存显存的系数来源

典型使用场景

  • 容量估算:按缓存头数而不是查询头数算缓存显存
  • 选型比较:同参数量模型之间,缓存结构差异会改变并发能力
  • 量化配合:结构已经省下的显存,不必再用降精度重复省
  • 排查异常:缓存头数与实现不匹配时,加载阶段就会报形状错误
  • 长文本规划:结构省下的是系数,序列长度仍是独立的一维
选型时看配置里缓存头数与查询头数的比值:它就是缓存显存的系数来源。
共享程度不是越高越好:共享过头会影响效果,实际模型大多落在这两者之间,按评测结果选。
缓存显存与序列长度成正比:结构只决定系数,长上下文场景里长度和结构要一起算。

易错点

  • 只按参数量判断显存友好度:缓存结构差异会让同规模模型的表现相差明显
  • 用查询头数算缓存:算出来的显存偏大好几倍,容量规划全错
  • 忽略推理框架的适配:个别实现只支持特定的缓存结构,上线前先验证
  • 只看结构就推断效果:效果要按评测集实测,不能只凭结构下结论

数据来源与参考

  • GQA 论文(arxiv.org/abs/2305.13245)
  • Hugging Face 模型配置文档(huggingface.co/docs)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌