Skip to content

KV 缓存

LLM 推理加速的核心机制


6.1 KV Cache 是什么?

KV 缓存(KV Cache, Key-Value Cache) 是大语言模型(LLM)推理加速的关键技术。

一句话总结

KV Cache = 把历史 token 的 Key / Value 保存下来,以便在解码阶段复用,避免重复计算。

只要你理解了注意力机制,KV Cache 就很好理解——它本质上是在缓存注意力计算中的一部分结果


6.2 为什么需要 KV Cache?

回顾一下注意力机制的计算过程:

  1. 当前 token 生成 Q
  2. 历史 token 生成 K/V
  3. 用 Q × Kᵗ 得到注意力分布
  4. 用 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 的典型工作流程分为 prefilldecode 两个阶段:

两阶段流程

阶段做了什么为什么重要
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