已完成

KV 缓存

没有 KV Cache,LLM 推理速度会慢 100 倍。它是现代推理引擎的核心加速机制,也是工程优化的主战场。

KV Cache 是什么?

KV 缓存(KV Cache, Key-Value Cache)是大语言模型(LLM, Large Language Model)推理加速的关键技术。它的核心思想是:把历史 token 的 Key / Value 保存下来,在解码阶段复用,避免重复计算。

一句话总结:

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

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

为什么需要 KV Cache?

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

  • 当前 token 生成 Q
  • 历史 token 生成 K/V
  • 用 Q × Kᵀ 得到注意力分布
  • 用 V 得到最终上下文

问题来了:

在生成第 1000 个 token 时,前 999 个 token 的 K/V 要不要重算?

在没有 KV Cache 的情况下,每生成一个 token,都要重新计算所有历史 token 的 K/V。这会导致推理速度极慢,尤其是在长文本生成时。

KV Cache 的工程优化如下:

  • 每个 token 的 K/V 只算一次,后续直接复用
  • 随着生成,Cache 不断 append
  • 解码阶段无需重复计算历史部分

这个机制让 LLM 推理速度从“不可用”变为“可用”。

KV Cache 的工作方式

下图展示 KV Cache 的典型工作流程,分为 prefill 和 decode 两个阶段:

图 1: KV Cache 推理流程
图 1: KV Cache 推理流程

在这个流程中,Prefill 阶段对所有输入 token 计算 K/V(一次性),Decode 阶段每个新 token 只算 Q,K/V 从 Cache 读取,极大提升推理效率。

下表总结了两阶段的核心区别:

阶段做了什么为什么重要
Prefill对所有输入 token 计算 K/V(一次性)长上下文只算一次
Decode每个新 token 只算 Q,K/V 从 Cache 读推理速度爆炸提升
表 1: KV Cache 两阶段对比

一句话总结:

Prefill 解决输入长的问题,Decode 解决输出长的问题。

工程师类比:KV Cache = 分布式存储中的“写一次、多读多”

你可以把 KV Cache 理解为分布式存储中的“只读数据块”:

  • K/V 就像一段已经算好的只读数据
  • Cache 就像挂在 GPU 显存中的“Append-only 日志”
  • Decode 阶段读取 K/V = 只读查询
  • 追加新的 K/V = 日志追加

这类似于:

  • 分布式存储的 WAL(Write-Ahead Log)
  • Kafka partition append-only log
  • Envoy filter chain 中的缓存结构

随着生成,Cache 越写越长,但历史部分无需重算。

没有 KV Cache 会怎样?

如果没有 KV Cache:

  • 每生成一个 token,都要对所有历史 token 重新计算 K 和 V,复杂度 O(n²)
  • 1000 字 token → 重算 1000 次 K/V,推理速度极慢
  • 视频生成、长文生成、代码生成等场景几乎无法落地

有了 KV Cache 后:

  • 历史 K/V 直接复用
  • 复杂度降为 O(n)
  • 推理速度提升 10~100 倍

这就是为什么所有推理引擎都在极力优化 KV Cache。

KV Cache 的结构

下图展示了 KV Cache 在显存中的典型结构:

图 2: KV Cache 显存结构
图 2: KV Cache 显存结构

在这个结构中:

  • K Cache 和 V Cache 是两个矩阵
  • 随 token 数增加,维度不断扩展
  • decode 阶段只追加 1 个位置的 K/V

PagedAttention:最强的 KV Cache 优化

传统 KV Cache 在工程实践中会遇到碎片化、显存分配难、多并发干扰、长上下文浪费显存等问题。

PagedAttention 的创新点在于:

把 KV Cache 切成固定大小的 page,在显存中像虚拟内存一样调度。

这类似于:

  • Linux 虚拟内存分页
  • Kubernetes Pod 分配固定 size HugePage
  • 分布式系统用 page 替代大块连续内存

下图展示了 PagedAttention 的显存分页机制:

图 3: PagedAttention 显存分页机制
图 3: PagedAttention 显存分页机制

PagedAttention 的优势:

  • 显存利用率提升 2~3 倍
  • 并发能力提升 10 倍
  • 动态增长 KV,不浪费空间
  • 类似操作系统的“页表”机制

vLLM 等推理引擎的核心创新正是基于这一机制。

从 0 到 1 的完整推理流程

下图用时序图展示了 LLM 推理全流程,帮助你理解 KV Cache 的实际作用:

图 4: LLM 推理完整流程
图 4: LLM 推理完整流程

通过这个流程可以看到:

  • Prefill 阶段一次性构建上下文
  • Decode 阶段逐 token 使用 KV Cache,极大提升推理效率

为什么“上下文越长,推理越慢”?

虽然 KV Cache 已经缓存了历史 K/V,但 decode 阶段仍需执行 Q × Kᵀ,K 越长,矩阵维度越大,计算量线性增加。

所以:

长上下文的主要瓶颈是算力,而不是内存。

总结

KV 缓存(KV Cache, Key-Value Cache)是对历史注意力计算结果(K/V)的显存级缓存,使得新 token 只需计算 Q,从而将推理复杂度从 O(n²) 降到 O(n)。

更工程化的总结:

  • 它是 LLM 推理性能的核心瓶颈
  • 也是所有推理引擎优化的核心点
  • PagedAttention 是最成功的工程优化方案

文章导航

章节内容

这是章节的内容页面。

章节概览