难度
进阶
理解 KV Cache 如何减少自回归解码中的重复计算,并系统掌握延迟、吞吐、显存与服务调度之间的权衡。
难度
进阶
阅读时长
约 90 分钟
更新日期
2026/03/23
主题
推理优化 / KV Cache / 系统性能 / PagedAttention
读完这篇教程后,你应该能解释:
如果你已经读过 Transformer 注意力机制入门,这篇文章会帮你把“注意力公式”接到“线上推理系统”。
大模型推理通常是自回归的,也就是每次只生成一个新 token,然后把它接到上下文后面,再继续预测下一个 token。
如果没有任何缓存机制,第 t 步生成时,模型需要重新处理长度为 t 的整段前缀。这样做的问题是:
K/V 会被一遍遍重复计算。从系统角度看,推理并不只是“跑一次前向传播”,而是“对同一段前缀做很多次高度重复的前向传播”。KV Cache 就是专门用来消除这部分浪费的。
在自注意力里,每一层都会把隐藏状态投影成 Q、K、V。对于已经生成过的历史 token 来说:
K/V 在后续步骤不会变化。K/V。因此,我们可以把历史 token 在每一层产生的 K/V 保存下来。下一步生成时:
Q/K/V。K/V 追加到缓存里。Q 去和整段缓存里的 K 做注意力。V。这就是 KV Cache 的核心:历史信息不重算,只增量更新。
如果没有 KV Cache,生成阶段每一步都要对整段前缀重新做投影和层内传播;如果有 KV Cache,历史 token 的大部分中间结果都能复用。
可以粗略理解为:
当然,注意力分数的计算仍然需要让当前 query 看向所有历史 key,所以 decode 阶段的单步开销会随着序列变长而增长。但和“整段前缀完全重算”相比,缓存带来的节省仍然非常可观。
理解 KV Cache 时,一定要区分两个阶段:
模型第一次读入整段 prompt,把所有历史 token 的 K/V 建起来。这一阶段通常并行度高、吞吐高,但计算量大。
模型开始逐 token 生成,每一步只新增一个 token,并反复使用缓存。这一阶段计算粒度小、访存频繁,系统瓶颈与 prefill 很不一样。
现实服务里,很多优化都是分别针对这两个阶段设计的。例如:
KV Cache 的速度收益并不是免费的,它会换来显著的显存开销。一个常见的粗略估算公式是:
memory_bytes ≈ 2 * layers * batch * seq_len * num_kv_heads * head_dim * bytes_per_element
这里的 2 表示要同时存储 key 和 value。
从这个公式可以直接看出,缓存成本会被以下因素线性放大:
所以推理系统里的很多工程问题,本质上都在问:如何在不明显损失效果的前提下,把这块缓存管理得更省、更稳、更灵活。
KV Cache 的体积和注意力头设计密切相关。
传统 Multi-Head Attention 中,每个头都有自己的 K/V,表达能力强,但缓存开销较大。
Multi-Query Attention 让多个 query head 共享同一组 K/V,可以明显减少缓存大小和访存开销,对推理很友好。
Grouped-Query Attention 介于两者之间:若干 query head 共享一组 K/V,在效果和效率之间做平衡。
这也是为什么今天很多面向部署优化的模型,会优先采用 GQA 或 MQA,而不是完全沿用原始 Transformer 的 MHA 设计。
只会缓存还不够,关键是怎么管理缓存。实际服务里,请求长度差异很大,如果直接为每个请求预留一整块连续显存,很容易出现:
PagedAttention 的核心思路,是把 KV Cache 拆成更小的页块来管理,而不是要求每个请求占据一整段连续大内存。这样做的好处是:
这类优化不会改变模型输出逻辑,却能显著提高实际吞吐,是推理系统工程里非常典型的“底层改造换大收益”。
静态 batch 有一个常见问题:你往往要等一批请求都凑齐才能一起算,或者一批里最长的请求拖住其他请求。
连续批处理(continuous batching)的思路是:
这样做能明显提升 GPU 利用率,尤其适合在线服务。代价是调度实现更复杂,对缓存管理、序列状态维护和公平性策略要求更高。
很多人把量化理解成“主要节省模型权重显存”,其实对长上下文推理来说,KV Cache 也同样重要。
因为当序列很长、并发很多时,瓶颈可能不是模型权重,而是缓存本身。此时对缓存做更低比特表示,或者采用更节省空间的头设计,都会直接影响:
当然,量化会带来精度和稳定性的权衡,因此通常要结合任务类型、模型架构和服务目标一起评估。
无论你最后用的是 vLLM、TGI、Ollama,还是自研服务,判断标准都不应只看“能不能跑起来”,而是看它在以下维度上的表现:
产品环境里的推理优化,本质上是一个系统问题,而不是单点算法问题。
如果你负责服务稳定性,建议长期盯住这些指标:
很多性能问题并不是模型太慢,而是缓存分配、batch 调度和请求形态共同作用的结果。
KV Cache 并非无脑开启就完事。下面这些场景要特别小心:
系统优化真正重要的不是“某个技术很先进”,而是“它是否解决了你当前最贵的瓶颈”。
如果你想把这部分知识串起来,建议按这个顺序继续:
这样你会同时理解三件事:注意力怎么工作、长上下文为什么昂贵、以及即便付出了高昂成本,模型也不一定真的会用好这些上下文。
推理优化最容易让人陷入“堆术语”的错觉,但真正有用的判断标准很简单:
你的系统瓶颈,究竟在算力、访存、显存,还是调度?
KV Cache 只是起点。理解了它,你才真正进入大模型系统工程的核心地带。
从相近主题继续深入,建立连续学习链路。