目录
自回归生成每次只多一个 Token。若每一步都重新计算整段历史的 K、V,大量工作会重复。KV Cache 把已经算过的结果保留下来。
KV Cache 不缓存下一个答案,它缓存的是历史 Token 在每一层 Attention 中的 K 与 V。
1、没有缓存会怎样
生成第 n 个 Token 时,模型需要关注前 n−1 个 Token。若重新把完整序列送入模型,前面 Token 的 K、V 每一步都重复计算,序列越长浪费越明显。
2、缓存保存什么
对每层 Attention,历史 Token 的 K 与 V 在生成过程中不会改变,可以按层缓存。新 Token 到来时,只计算它自己的 Q、K、V,再用新 Q 与缓存中的全部 K 做相关性计算。
3、为什么 Q 不缓存
后续每一步使用的是当前新 Token 的 Q 去查询全部历史 K。过去 Token 的 Q 不会再次作为当前查询使用,因此通常无需为 Decode 保存历史 Q。
4、缓存怎样增长
每生成一个 Token,就把它在各层产生的新 K、V 追加到缓存。缓存大小大致随层数、KV Head 数、Head 维度、上下文长度、Batch 与数据类型线性增长。
5、速度与显存的交换
KV Cache 减少了重复投影计算,却持续占用显存和内存带宽。长上下文、高并发下,缓存可能比模型权重更快成为容量瓶颈。GQA、MQA、MLA、量化与 PagedAttention 都在缓解这个问题。
6、什么时候缓存失效
如果修改了历史 Token、Attention Mask、位置编号或模型权重,相关缓存通常不能直接复用。多个请求共享完全相同前缀时,可以在支持的系统中复用前缀缓存,但必须正确管理边界。
容易混淆的三件事
- KV Cache 不保存最终答案。
- 通常不缓存历史 Q。
- 修改前缀后旧缓存不能盲目复用。
记住这 5 件事
- 缓存每层历史 K 与 V
- 当前 Token 的 Q 现算
- 每步追加新 K、V
- 用显存换重复计算
- 缓存随上下文线性增长
参考资料
第十八课复习总图
下一课把推理拆成 Prefill 与 Decode:为什么两个阶段的性能瓶颈完全不同?