KV Cache 为什么能加速逐 Token 生成?

旧 Token 的 K、V 不再重算;新 Query 仍要看历史

目录

  模型收到“法国的首都是”,回答出“巴黎”。如果还要继续生成句号,它会再次处理当前上下文。问题是:前面的“法国、的、首都、是”早已算过,为什么每多生成一个 Token,还要把它们的 Key 和 Value 再算一遍?

KV Cache 保存历史 Token 在每一层 Attention 中的 K、V。下一个 Token 到来时,只为它生成新的 Q、K、V,并让新 Q 查询缓存中的历史 K、V。

提示词预填充后,KV Cache 随逐 Token 生成增长

从 Prefill 到 Decode:旧 K/V 复用,新 K/V 追加。点击查看原始 SVG

一段话为什么会被重复计算

  自回归生成一次只决定下一个 Token。若每一步都把完整前缀重新送进模型,第 1 次处理 4 个 Token,第 2 次处理 5 个,第 3 次处理 6 个;前面位置的表示和 K/V 又跟着计算。对因果 Attention 而言,旧位置不会看到未来新 Token,所以只要模型权重、位置和掩码等条件不变,旧位置算好的 K/V 就可以复用。

  这也是“缓存”二字的含义:不是提前猜好答案,而是避免重复做已经做过的工作。

生成轮次 本次输入的前缀 不缓存:送入模型的位置数 缓存:新送入的位置数
首次预测 法国 / 的 / 首都 / 是 4 4(Prefill)
继续预测 上述前缀 / 巴黎 5 1(巴黎)
再继续 上述前缀 / 巴黎 / 。 6 1(。)

  表中的 4、5、6 对比 4、1、1,只是在数“本轮重新送入模型的位置”。它不是运行时间或 FLOPs 的比例。有缓存时,新 Query 仍要读取历史 K/V,并与越来越长的前缀做 Attention。

缓存到底保存了什么

  在每个 Transformer 层,新 Token 的当前表示分别投影出 Query、Key、Value。Query 用来发问;Key 用来匹配;Value 提供被汇总的信息。对之后的生成步骤,旧 Token 的 Key 和 Value 还会被新 Query 用到,所以按层保存。每来一个新 Token,就在每层缓存末尾追加它的 K/V。

  要特别注意“按层”:第 1 层的 K/V 不能拿去充当第 2 层的 K/V。每层输入表示和投影权重不同,缓存也各有一份。

  缓存并没有省掉新 Token 与历史的相关性计算,也没有把长上下文的注意力变成常数成本。它省的是旧 Token 的重复前向计算;生成越往后,读取历史缓存的开销仍会增长。增量解码中的 K/V 带宽也是后来 MQA、GQA 等结构要解决的问题。[1]

跟着生成过程走两步

教学示意:方块代表“每一层中对应位置的一组 K/V”,不是实际向量内容。这里只画单条请求,不画多层、多头维度。

为什么不保存历史 Q

  继续生成时,新的 Query 只关心“我现在该看哪些历史信息”。旧 Token 的 Query 已经在它们自己的步骤使用过;后面的新 Token 不会拿旧 Query 再发一次问。因此通常不为 Decode 持久保存历史 Q。这里说的是持久的增量推理缓存;训练和 Prefill 的临时张量另当别论。

省下计算后,付出什么代价

  缓存会占显存,而且随上下文和并发增长。对一种常见的 K/V 存储布局,可以先用下面的近似式估算原始张量大小:

\[M_{KV}\approx 2\times L\times B\times S\times H_{KV}\times d_{head}\times b\]

  $L$ 是层数,$B$ 是请求批量,$S$ 是缓存长度,$H_{KV}$ 是每层 K/V 头数,$d_{head}$ 是每头维度,$b$ 是每个元素的字节数;开头的 2 对应 K 和 V。比如 $L=32$、$B=1$、$S=4096$、$H_{KV}=8$、$d_{head}=128$、FP16 的 $b=2$,仅这些原始 K/V 张量就约 512 MiB。真实占用还会受内存分配、分页、量化、位置编码实现等影响。

  并发多、上下文长时,KV Cache 可能成为显存与带宽瓶颈。MQA/GQA 通过减少 K/V 头数降低每 Token 的缓存量;PagedAttention 着重改善缓存的内存管理与共享,减少碎片和重复副本。它们解决的是相邻但不同的问题。[2][3]

什么时候不能直接复用

  复用的前提是:旧位置算 K/V 时所依据的内容和条件仍相同。改了提示词中间的内容、位置编号、Attention 掩码或模型权重,就不能盲目沿用受影响位置及其后续的缓存。完全相同的前缀在支持前缀共享的服务系统里可以复用,但需要正确匹配模型、位置与其他计算条件。[3]

  把本课收束成一句话:旧 K/V 不重算,新 Q 仍读历史;拿显存与带宽换掉重复的前向计算。

约 90 秒讲解视频

参考文献(References)

  1. Shazeer, N. “Fast Transformer Decoding: One Write-Head is All You Need.” arXiv preprint arXiv:1911.02150, 2019.↩
  2. Ainslie, J., Lee-Thorp, J., de Jong, M., et al. “GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints.” EMNLP, 2023. arXiv:2305.13245.↩
  3. Kwon, W., Li, Z., Zhuang, S., et al. “Efficient Memory Management for Large Language Model Serving with PagedAttention.” SOSP, 2023. arXiv:2309.06180.↩

第十八课复习总图

KV Cache 第十八课复习总图

保存什么、为何加速、付出什么代价,一页回顾。点击查看原始 SVG

  下一课把推理拆成 Prefill 与 Decode:为什么两个阶段的性能瓶颈不同?