一、什么是 KV Cache?
KV Cache 是一种用于缓存 Transformer 模型中注意力机制所需 Key 和 Value 向量的结构。其核心思想非常朴素:
历史 token 的 Key 和 Value 在后续生成过程中不会改变,因此可以缓存复用,避免重复计算。
类比理解:查字典 vs. 写便签
想象你在翻译一篇英文文章:
- 不启用 KV Cache:每次遇到生词都要重新翻字典。
- 启用 KV Cache:第一次查完后把释义写在便签上,下次直接看便签。
在 LLM 推理中,“字典”就是模型权重,“便签”就是 KV Cache。
二、为什么需要 KV Cache?——自回归生成的痛点
以生成句子 “The cat sat on the mat.” 为例:
| 步骤 | 输入序列 | 输出 token |
|---|---|---|
| 1 | ["The"] | "cat" |
| 2 | ["The", "cat"] | "sat" |
| 3 | ["The", "cat", "sat"] | "on" |
若不使用 KV Cache,每一步都要重新计算整个输入序列的 Key 和 Value。这意味着:
- 第 2 步重新计算了 “The” 的 K/V;
- 第 3 步又重新计算了 “The” 和 “cat” 的 K/V;
- ……
时间复杂度为 O(n²)(n 为已生成 token 数),对于长文本生成极其低效。
而启用 KV Cache 后:
- 第 1 步:计算并缓存 “The” 的 K₁、V₁;
- 第 2 步:复用 K₁、V₁,仅计算 “cat” 的 K₂、V₂ 并追加缓存;
- 第 3 步:复用 K₁–K₂、V₁–V₂,仅计算 “sat” 的 K₃、V₃;
时间复杂度降至 O(n),推理速度提升 3–10 倍(视模型规模而定)。
三、KV Cache 的工作原理
1. 注意力机制回顾
Transformer 中的标准注意力公式为:
$$ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V $$
其中:
- Q(Query):当前 token 的“查询向量”,每步都不同;
- K(Key) & V(Value):历史 token 的“身份标签”和“内容”,一旦生成即固定。
2. 缓存结构
KV Cache 通常按层、按头组织,形状为:
Key Cache: [batch_size, num_heads, seq_len, head_dim]
Value Cache: [batch_size, num_heads, seq_len, head_dim]
seq_len动态增长(从 prompt 长度开始,逐步增加生成 token);- 每生成一个新 token,就将其 K、V 追加到缓存末尾。
3. 推理流程:Prefill + Decode
- Prefill 阶段(预填充):
一次性处理完整 prompt,计算所有 token 的 K/V 并写入缓存。 - Decode 阶段(解码):
每次只输入一个新 token,计算其 Q、K、V;
用 Q 与缓存中的全部 K/V 计算注意力;
将新 K/V 追加到缓存,循环往复。
关键点:Q 不缓存,因为每个位置的 Q 只用于生成下一个 token,且无法复用。
四、KV Cache 的实际价值
1. 推理速度大幅提升
- LLaMA-7B:启用 KV Cache 后速度提升 3–5 倍;
- GPT-3 175B:生成 1000 token 从“分钟级”压缩至“数十秒”。
2. 显存占用优化(看似矛盾实则合理)
虽然 KV Cache 本身占用显存(约占总显存 40–60%),但避免了重复计算带来的中间激活内存爆炸。实测表明:
- RTX 3090(24G)运行 LLaMA-7B:
- 无 KV Cache:生成 500 token 即 OOM;
- 有 KV Cache:可稳定生成 2000+ token。
3. 支持长上下文与多轮对话
KV Cache 使得模型能高效处理 4K、8K 甚至 32K token 的上下文,是法律文书分析、长程对话等场景的基础。
五、代价与优化策略
KV Cache 并非免费午餐,它带来两个主要挑战:
1. 显存压力
- 每个 token 的 KV 缓存约占用 20KB(以 GPT-3 为例);
- 生成 4096 token ≈ 80MB/样本,批量推理时显存需求线性增长。
优化方案:
- 量化缓存:用 INT8/INT4 存储 K/V,显存减半;
- 滑动窗口:只保留最近 N 个 token 的缓存(如 Llama-2-Chat);
- PagedAttention(vLLM 引擎):借鉴操作系统分页机制,提升显存利用率。
2. 代码复杂度增加
需在模型 forward 中维护 past_key_values 状态,对框架集成提出更高要求。
六、结语
KV Cache 是大模型从“实验室玩具”走向“工业级应用”的关键桥梁。它用空间换时间的朴素思想,巧妙解决了自回归生成中的重复计算问题,让 LLM 在消费级 GPU 上也能流畅运行。
未来,随着 稀疏注意力、动态缓存淘汰、硬件感知调度等技术的发展,KV Cache 将进一步进化,支撑更大、更快、更智能的语言模型落地千行百业。
记住:没有 KV Cache 的 LLM 推理,就像没有缓存的数据库——能用,但没人敢用。