深入理解 KV Cache:大模型推理的空间换时间优化

KV Cache 通过缓存历史 token 的 Key/Value 向量,将大模型自回归推理的重复计算降至最低,以显存换速度。
KV Cache 是大语言模型推理阶段的核心优化技术。在自回归生成中,模型逐词预测输出,若不做缓存,每生成一个新词都需对全部历史 token 重复计算 Key 和 Value 向量,随序列增长造成巨大算力浪费。KV Cache 的做法是将已计算过的 K、V 向量保存在显存中,每步仅需计算新词自身的 Q、K、V 后与缓存拼接完成注意力运算,将每步计算量从完整序列压缩为单个词。这一优化使时间复杂度显著下降,但代价是显存占用随层数、注意力头数和序列长度线性增长,成为长上下文推理的核心瓶颈,也催生了 PagedAttention、GQA 等后续进阶优化方案。
什么是 KV Cache
KV Cache(键值缓存)是大语言模型推理阶段的一项核心优化技术,本质上是一种空间换时间的策略。在自回归(autoregressive)生成场景下,模型逐词预测输出,每生成一个新的 token 都需要计算注意力(Attention)。如果不做任何缓存,每一轮都会对已经生成过的全部 token 重复计算它们的 Key 和 Value 向量,这在长序列生成时会造成巨大的算力浪费。
KV Cache 的做法很直接:将已经计算过的 token 所对应的 K 和 V 向量缓存在显存中,后续每生成一个新词时,只需计算这个新词自身的 Q、K、V,再与缓存中的历史向量拼接完成注意力计算即可,从而避免每轮的重复计算。
无缓存状态下的计算流程
要理解 KV Cache 的价值,先要看清楚不做缓存时发生了什么。回顾注意力机制的基本流程:模型有 Q、K、V 三组权重矩阵,输入词经过这三组权重投影得到对应的 Query、Key、Value 向量。计算注意力时,用 Query 与所有 Key 做点积得到相关性权重,权重经过 softmax 归一化后,再去加权求和对应的 V 向量,得到该词经过注意力聚合后的新表示,最后再做一次线性变换调整维度输出。

问题在于自回归的逐词生成。假设已经生成了 5 个词,现在要生成第 6 个词 X6,模型会计算 Q6、K6、V6,然后让 Q6 分别与 K1 到 K6 做点积计算权重。但关键在于——前面 X1 到 X5 这些词的 K 和 V 向量在之前的轮次里其实已经计算过一次了,并且没有发生任何变化。每加一个新词就把已有词的注意力全部重算一遍,正是浪费所在。
自回归(autoregressive)生成是当前主流大语言模型(如 GPT 系列)的核心解码范式:模型每次只生成一个 token,然后将该 token 追加到输入序列末尾,再用扩展后的序列预测下一个 token,如此循环直到遇到终止符。这种串行、逐步扩展的机制天然地引入了大量重复计算——随着序列增长,每步需要参与注意力计算的历史 token 线性增加。相比之下,非自回归(Non-Autoregressive)模型尝试并行生成所有词,但在质量上通常逊色于自回归方法。正因为自回归生成难以避免,KV Cache 才成为 Transformer 推理加速的标配手段。
缓存的具体实现方式
既然历史 token 的投影结果是可复用的,那就把它们保存下来。可以把整个序列的投影计算划分为两个部分:从第 1 步到第 T-1 步的历史部分,以及新增的第 T 个词。
对于 Query 矩阵,其维度是 N×D_k,其中 N 是序列长度,D_k 是每个表征的向量维度。输入 X(维度为 T×D_m)乘以权重矩阵 W_Q(维度 D_m×D_k),得到 T×D_k 的 Q 矩阵。这里有个重要特性:投影计算对每个词是独立可分的——单个词 X_i(维度 1×D_m)乘以 W_Q 就得到该词的 1×D_k 输出。正因为可以逐词独立计算,才能把历史结果缓存起来。

Key 和 Value 同理,每个新来的词计算完后就保存进缓存。这样,历史部分的 K、V 已经存在显存中,不需要再算。
新词进来时如何计算
当新词 X_T 到来时,流程被大幅简化:
- 计算新词的 Q_T,得到一个 1×D_k 的向量(相当于在 Q 矩阵上新增一行);
- 计算新词的 K_T 和 V_T,各一行;
- 将新的 K_T、V_T 与缓存中的历史 K、V 拼接;
- 用新算出的 Q_T 与拼接后的所有 K 做点积,得到一个 1×T 维的权重向量,表示当前词与历史每个位置的相关性;
- 对这个权重做 softmax 归一化(注意 softmax 只对当前这一行算一遍,历史部分无需重算);
- 归一化后的权重乘以拼接后的 V(T×D_v),最终得到 1×D_v 的输出,作为第 T 个词的注意力结果。

对比来看,无缓存时每轮 Q 投影要算 N×D_k 的完整矩阵,而使用 KV Cache 后每轮只需计算 1×D_k,计算量的差异随序列变长而急剧拉大。
时间复杂度对比
从时间复杂度角度更能看清收益。设输入 token 长度为 N,隐藏维度为 D(为便于分析令 D_m 与 D_k 相等)。
无缓存的情况:投影计算(X 乘 W_Q 得到 T×D 的 Q 矩阵)的复杂度约为 T·D²;自注意力计算中 Q(T×D)与 K 转置(D×T)相乘得到 T×T,复杂度约为 T²·D。对整个 N 步生成累加,总量级大致为 N²·D² + N³·D 这一量级。

使用 KV Cache 后,每一步只计算单个新词而非整段序列,投影部分从 T 降为常数 1,注意力计算也只涉及新词与历史的拼接,整体复杂度显著下降到更低量级。序列越长、生成越多,KV Cache 相对无缓存的加速比越可观。
显存开销的估算
用时间换来的代价是显存占用。KV Cache 的显存开销可以用一个大致公式估算:
Memory_cache ≈ 2 × 层数(L) × 注意力头数 × 每头维度 × 序列长度 × 精度字节数
其中系数 2 来自需要同时缓存 K 和 V 两份。以一个典型配置举例:层数 L=32,注意力头数 32,每头维度 128(隐藏维度 4096 ÷ 32 头 = 128),序列长度为 S。把这些数值代入公式,再乘以数值精度所占的字节数,即可算出缓存 K、V 所需的显存占用。
可以看到,显存开销与层数、头数、每头维度、序列长度成正比。这也解释了为什么长上下文推理会成为显存瓶颈——序列越长,KV Cache 占用的显存线性增长,成为大模型部署时必须权衡的关键因素。
以 LLaMA-2 7B 为具体参考:L=32 层,32 个注意力头,每头维度 128,若使用 FP16(2 字节)精度,序列长度为 2048 时,KV Cache 约占 2 × 32 × 32 × 128 × 2048 × 2 ≈ 1.07 GB 显存。当上下文扩展到 32K token 时,这一数字膨胀至约 16 GB,接近单张消费级 GPU 的全部显存。这也是为什么工业界发展出 PagedAttention(vLLM)、Multi-Query Attention(MQA)、Grouped-Query Attention(GQA)等针对 KV Cache 的显存压缩技术——MQA 将所有注意力头共享同一组 K、V 投影,GQA 则让多个头共享分组后的 K、V,均可在显存占用与模型表达能力之间取得更好的平衡。
小结
KV Cache 是大模型推理阶段绕不开的基础优化:通过缓存历史 token 的 Key、Value 向量,把每步的重复计算削减为仅针对新词,用显存空间换取生成速度。理解它不仅有助于把握 Transformer 推理的性能瓶颈,也为后续深入 PagedAttention、量化缓存等进阶优化打下基础。而它带来的显存压力,正是长上下文场景下工程优化的核心战场。
相关推荐

微软官宣10月7日Windows与Surface发布会:本地AI成主角
微软宣布将于10月7日在旧金山举办Windows与Surface发布会,时隔两年再度重磅亮相,核心议题聚焦本地AI如何塑造Windows的未来,或深化AI PC产品形态。

Meta 推出 WhatsApp Business MCP 服务器,让 AI 代理接管繁琐配置
Meta 推出全新 WhatsApp Business MCP 服务器,让开发者可借助 Claude、Cursor、Codex、ChatGPT 等 AI 编程代理自动处理平台配置、消息模板、测试与故障排查,大幅降低接入门槛。

Claude Code v2.1.273更新详解:修复权限漏洞与远程控制增强
Claude Code v2.1.273 版本更新详解,涵盖权限检查安全修复、远程控制会话分叉、MCP 重连、错误提示优化及 Slack 集成与代码审查改进,帮助开发者了解升级要点。