要解决的问题

自回归解码时,每一层都要保存之前所有 token 的键(K)和值(V),这就是 KV 缓存。它随序列长度和并发数线性增长,占用大量显存和带宽,是长上下文与高并发服务的关键瓶颈。

核心方法

从两个层面入手:

  • 架构层面:减少需要缓存的内容
    • 多查询注意力(MQA):所有注意力头共享同一组 K 和 V。
    • 分组查询注意力(GQA):注意力头分组,每组共享一组 K 和 V,在 MQA 与标准多头注意力之间折中。
    • 多头潜在注意力(MLA):通过训练得到 K/V 的低秩联合潜在表示,并在计算中吸收部分投影。DeepSeek-V2 的实现还需缓存解耦的 RoPE 键分量,并非只存一个完全不含位置信息的向量;也不是对任意现成模型直接套一次有损压缩。
  • 推理层面:对已有缓存做压缩或取舍
    • 驱逐:只保留重要的 token,例如累计注意力得分高的 token。
    • 注意力汇聚点(attention sink):保留开头少量 token 与最近窗口,支持有界 KV 缓存下的长时间流式生成。被驱逐的中间 token 已不可直接访问,不能等同于拥有无限长可检索上下文。
    • 量化:把 KV 缓存存成低比特。

代表工作

  • MQA(2019):出自 Fast Transformer Decoding: One Write-Head is All You Need,大幅降低解码时的显存带宽需求。
  • GQA(2023):在质量与速度之间折中,并给出从多头模型转换过来的方法,被大量主流模型采用。
  • MLA(2024):由 DeepSeek-V2 提出,通过低秩压缩大幅缩小 KV 缓存。
  • H2O(2023):按累计注意力得分保留「重要」token,其余驱逐。
  • StreamingLLM(2023):发现注意力汇聚点现象,保留开头 token 与最近窗口即可稳定地流式生成。

开放问题

  • 压缩和驱逐对长距离精确召回的影响。
  • 与投机解码、分布式 KV 缓存的联合设计。

参考资料

相关专题