结构决定缓存规模
注意力结构的差异直接决定了缓存规模。早期的多头注意力,每个查询头都有自己的一组缓存;分组查询注意力让多个查询头共享一组缓存;多查询注意力则全部共享一组。共享程度越高,缓存越小、推理越省显存,这也是后来的模型普遍采用分组查询结构的原因。
基本信息
| 适用平台 | 所有基于注意力机制的生成式模型 |
|---|---|
| 查看位置 | 模型配置文件里的查询头数与缓存头数字段 |
| 判断方式 | 缓存头数小于查询头数,就说明用了共享结构 |
| 影响面 | 缓存显存、可并发序列数、解码期的带宽压力 |
三种结构对照
| 变体 | 缓存组数 | 缓存显存 | 代表 |
|---|---|---|---|
| MHA | 等于头数 | 高 | 早期模型 |
| GQA | 少于头数,常见四分之一到八分之一 | 中 | 主流开源模型 |
| MQA | 一组 | 低 | 部分生成模型 |
从配置读出系数
从配置读出系数
# 模型目录下的配置文件里查看查询头数与缓存头数
python -c "import json;c=json.load(open('config.json'));print(c['num_attention_heads'], c.get('num_key_value_heads'))"
# 两者相除就是缓存显存的系数来源典型使用场景
- 容量估算:按缓存头数而不是查询头数算缓存显存
- 选型比较:同参数量模型之间,缓存结构差异会改变并发能力
- 量化配合:结构已经省下的显存,不必再用降精度重复省
- 排查异常:缓存头数与实现不匹配时,加载阶段就会报形状错误
- 长文本规划:结构省下的是系数,序列长度仍是独立的一维
选型时看配置里缓存头数与查询头数的比值:它就是缓存显存的系数来源。
共享程度不是越高越好:共享过头会影响效果,实际模型大多落在这两者之间,按评测结果选。
缓存显存与序列长度成正比:结构只决定系数,长上下文场景里长度和结构要一起算。