KV 缓存
LLM 推理加速的核心机制
6.1 KV Cache 是什么?
KV 缓存(KV Cache, Key-Value Cache) 是大语言模型(LLM)推理加速的关键技术。
一句话总结
KV Cache = 把历史 token 的 Key / Value 保存下来,以便在解码阶段复用,避免重复计算。
只要你理解了注意力机制,KV Cache 就很好理解——它本质上是在缓存注意力计算中的一部分结果。
6.2 为什么需要 KV Cache?
回顾一下注意力机制的计算过程:
- 当前 token 生成 Q
- 历史 token 生成 K/V
- 用 Q × Kᵗ 得到注意力分布
- 用 V 得到最终上下文
问题来了:在生成第 1000 个 token 时,前 999 个 token 的 K/V 要不要重算?
没有 KV Cache 的情况
在没有 KV Cache 的情况下,每生成一个 token,都要重新计算所有历史 token 的 K/V。这会导致推理速度极慢,尤其是在长文本生成时。
KV Cache 的工程优化
| 优化 | 说明 |
|---|---|
| 每个 token 的 K/V 只算一次 | 后续直接复用 |
| 随着生成,Cache 不断 append | 增量更新 |
| 解码阶段无需重复计算历史部分 | 大幅提升效率 |
这个机制让 LLM 推理速度从"不可用"变为"可用"。
6.3 KV Cache 的工作方式
KV Cache 的典型工作流程分为 prefill 和 decode 两个阶段:
两阶段流程
| 阶段 | 做了什么 | 为什么重要 |
|---|---|---|
| Prefill | 对所有输入 token 计算 K/V(一次) | 长上下文只算一次 |
| Decode | 每个新 token 只算 Q,K/V 从 Cache 读取 | 推理速度爆炸提升 |
阶段详解
Prefill 阶段
- 处理输入提示(prompt)
- 一次性计算所有输入 token 的 K/V
- 填充 KV Cache
Decode 阶段
- 每生成一个新 token
- 只计算当前 token 的 Q
- K/V 直接从 Cache 读取
- 新 token 的 K/V 追加到 Cache
Prefill 解决输入长的问题,Decode 解决输出长的问题。
6.4 没有 KV Cache 会怎样?
没有 KV Cache 的后果
| 问题 | 说明 |
|---|---|
| ❌ 复杂度 O(n²) | 每生成一个 token,都要对所有历史 token 重新计算 K 和 V |
| ❌ 1000 个 token → 重算 1000 次 K/V | 推理速度极慢 |
| ❌ 视频生成、长文生成、代码生成等场景几乎无法落地 | 实际不可用 |
有了 KV Cache 之后
| 优势 | 说明 |
|---|---|
| ✅ 历史 K/V 直接复用 | 无需重复计算 |
| ✅ 复杂度降为 O(n) | 线性增长 |
| ✅ 推理速度提升 10~100 倍 | 实际可用 |
这就是为什么所有推理引擎都在极力优化 KV Cache。
6.5 KV Cache 的结构
显存中的 KV Cache 结构
K Cache: [layer, head, seq_len, head_dim]
↓
随着 token 数增加,维度不断扩展
V Cache: [layer, head, seq_len, head_dim]
↓
decode 阶段只追加 1 个位置的 K/V结构特点
| 特点 | 说明 |
|---|---|
| K Cache 和 V Cache 是两个矩阵 | 分别存储 Key 和 Value |
| 随 token 数增加,维度不断扩展 | 动态增长 |
| decode 阶段只追加 1 个位置的 K/V | 增量更新,无需重算 |
6.6 PagedAttention:最强的 KV Cache 优化
传统 KV Cache 在工程实践中会遇到碎片化、显存分配难、多并发干扰、长上下文浪费显存等问题。
PagedAttention 的创新点
把 KV Cache 切成固定大小的 page,在显存中像虚拟内存一样调度。
这类似于:
- Linux 虚拟内存分页
- Kubernetes Pod 分配固定 size HugePage
- 分布式系统用 page 替代大块连续内存
PagedAttention 显存分配
物理显存
┌─────────────────────────────────┐
│ Page 1 │ Page 2 │ Page 3 │ ... │
└─────────────────────────────────┘
↓ 映射
请求 A → [Page 1, Page 3, Page 5]
请求 B → [Page 2, Page 4]PagedAttention 的优势
| 优势 | 说明 |
|---|---|
| 显存利用率提升 2~3 倍 | 减少碎片浪费 |
| 并发能力提升 10 倍 | 支持更多序列 |
| 动态增长 KV,不浪费空间 | 按需分配 |
| 类似操作系统的"页表"机制 | 成熟的设计思想 |
vLLM 等推理引擎的核心创新正是基于这一机制。
6.7 从 0 到 1 的完整推理流程
LLM 推理时序流程
用户输入
↓
Prefill 阶段
├─ Tokenize 分词
├─ 计算所有输入 token 的 K/V
└─ 填充 KV Cache
↓
Decode 阶段(循环)
├─ 计算当前 token 的 Q
├─ 从 KV Cache 读取历史 K/V
├─ Attention 计算
├─ 生成下一个 token
├─ 追加新 token 的 K/V 到 Cache
└─ 重复直到生成结束符
↓
输出完整文本关键点
| 阶段 | 关键操作 |
|---|---|
| Prefill | 一次构建上下文 |
| Decode | 逐 token 使用 KV Cache,极大提升推理效率 |
6.8 为什么"上下文越长,推理越慢"?
虽然 KV Cache 已经缓存了历史 K/V,但 decode 阶段仍需计算 Q × Kᵗ。
- K 越长,矩阵维度越大
- 计算量线性增加
所以:
- 上下文长度直接影响 decode 阶段的计算量
- 即使有 KV Cache,长上下文仍然会变慢
长上下文的主要瓶颈是算力,而不是内存。
总结
KV 缓存(KV Cache)是对历史注意力计算结果(K/V)的显存级缓存,使得新 token 只需计算 Q,从而将推理复杂度从 O(n²) 降到 O(n)。
更工程化的总结
| 要点 | 说明 |
|---|---|
| 核心瓶颈 | KV Cache 是 LLM 推理性能的核心瓶颈 |
| 优化重点 | 也是所有推理引擎优化的核心点 |
| 最佳方案 | PagedAttention 是最成功的工程优化方案 |
关键数据
| 指标 | 数值 |
|---|---|
| 推理速度提升 | 10~100 倍 |
| 显存利用率提升(PagedAttention) | 2~3 倍 |
| 并发能力提升(PagedAttention) | 10 倍 |
| 复杂度降低 | O(n²) → O(n) |
最后更新:2026-03-23
