✨ 复制成功!

以文会友,打造好学人设!

📋 已复制到剪贴板:

大模型推理时,KV Cache 的作用是什么?它为什么会成为显存和吞吐的瓶颈?常见有哪些优化手段?

创建时间:2026-09-18 更新时间:2026-09-18 阅读次数:1295 次 分类:分布式训练与工程优化

一、核心结论

KV Cache 是大模型自回归推理中最核心的优化之一。

它的核心思想是:在自回归生成时,缓存已经计算过的 Key 和 Value,避免每一步都重新计算历史 token 的 K、V。

没有 KV Cache,生成第 $t$ 个 token 时要把前面 $t-1$ 个 token 全部重新算一遍,计算量随序列长度平方增长。有了 KV Cache,每一步只需要计算当前 token 的 Q、K、V,然后和缓存的 K、V 做注意力。

一句话总结:KV Cache 用显存换计算,把推理从平方复杂度降到近似线性复杂度。

但它也带来新的问题:显存占用随序列长度和 batch size 线性增长,成为长上下文、大并发场景下的主要瓶颈。


二、KV Cache 的作用

1、自回归生成的基本流程

大模型生成是逐 token 进行的:

  • 第 1 步:输入 prompt,生成第 1 个 token;
  • 第 2 步:把第 1 个 token 拼到输入后面,生成第 2 个 token;
  • 第 3 步:再把第 2 个 token 拼上,生成第 3 个 token;
  • 依此类推,直到生成结束。

2、没有 KV Cache 会怎样

在 Self-Attention 中,每个 token 都要计算 Query、Key、Value:

$$ Q = XW_Q,\quad K = XW_K,\quad V = XW_V $$

注意力计算为:

$$ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V $$

如果没有 KV Cache,生成第 $t$ 个 token 时:

  • 需要把前面 $t-1$ 个 token 重新做一遍前向;
  • 重新计算它们的 K、V;
  • 再和当前 token 的 Q 做注意力。

这样每生成一个 token,都要重算历史,计算量随序列长度快速增长。

3、有了 KV Cache 之后

有了 KV Cache:

  • 第 1 步:计算所有 prompt token 的 K、V,并缓存起来;
  • 后续每一步:只计算当前新 token 的 Q、K、V;
  • 把当前 token 的 K、V 追加到缓存;
  • 用当前 Q 和缓存中所有 K、V 做注意力。

这样历史 token 的 K、V 只算一次,后续直接复用。

4、计算复杂度的变化

没有 KV Cache 时,生成 $n$ 个 token 的总计算量约为:

$$ O(n^2) $$

有了 KV Cache 后,总计算量约为:

$$ O(n) $$

这就是 KV Cache 最核心的价值。


三、KV Cache 的显存占用

1、计算公式

KV Cache 的显存占用可以用下面的公式估算:

$$ \text{KV Cache Size} = 2 \times L \times b \times s \times h \times d \times \text{bytes} $$

其中:

  • $2$:表示 K 和 V 两份;
  • $L$:层数;
  • $b$:batch size;
  • $s$:序列长度;
  • $h$:注意力头数;
  • $d$:每个头的维度;
  • $\text{bytes}$:每个数值的字节数,FP16 为 2,INT8 为 1。

也可以写成:

$$ \text{KV Cache Size} = 2 \times L \times b \times s \times d_{\text{model}} \times \text{bytes} $$

其中 $d_{\text{model}} = h \times d$ 是隐藏维度。

2、一个直观例子

假设:

  • $L = 80$ 层;
  • $b = 16$;
  • $s = 4096$;
  • $d_{\text{model}} = 8192$;
  • FP16,每个数值 2 字节。

则 KV Cache 大小约为:

$$ 2 \times 80 \times 16 \times 4096 \times 8192 \times 2 \approx 1.37 \times 10^{11} \text{ bytes} $$

也就是约 137 GB。

这还只是 KV Cache,不包括模型权重本身。可见长上下文、大 batch 下 KV Cache 有多可怕。

3、为什么成为显存瓶颈

KV Cache 成为显存瓶颈,主要有几个原因:

第一,随序列长度线性增长。 序列越长,缓存越大。长上下文场景下,KV Cache 可能超过模型权重。

第二,随 batch size 线性增长。 并发请求越多,每个请求都要一份 KV Cache,显存迅速吃紧。

第三,随层数和隐藏维度线性增长。 模型越大,KV Cache 越大。

第四,显存碎片化。 传统实现中,每个请求的 KV Cache 需要预分配连续显存,长度不一导致碎片严重,利用率低。


四、为什么成为吞吐瓶颈

1、显存带宽限制

自回归解码每一步都要读取整个 KV Cache,计算注意力。

这一步是显存带宽受限的:

  • 计算量不大;
  • 但要读取大量 KV 数据;
  • GPU 算力用不满,瓶颈在显存带宽。

序列越长、batch 越大,读取 KV Cache 的时间越长,吞吐越低。

2、显存容量限制并发

KV Cache 占用大量显存,导致:

  • 能同时处理的请求数减少;
  • batch size 上不去;
  • GPU 利用率下降。

这就是为什么长上下文推理时,吞吐会明显下降。

3、预填充和解码阶段差异

推理分两个阶段:

  • Prefill 阶段:处理 prompt,计算密集,GPU 利用率高;
  • Decode 阶段:逐 token 生成,显存带宽密集,GPU 利用率低。

KV Cache 主要在 Decode 阶段成为瓶颈。


五、常见优化手段

1、减少 KV Cache 大小

(1)量化 KV Cache

把 KV Cache 从 FP16 量化到 INT8 或 INT4:

  • FP16 每数值 2 字节;
  • INT8 每数值 1 字节;
  • INT4 每数值 0.5 字节。

显存直接减半甚至更多,但可能带来精度损失。

(2)MQA(Multi-Query Attention)

让所有注意力头共享同一组 K、V:

  • 原本每个头都有自己的 K、V;
  • MQA 中所有头共用一份 K、V。

KV Cache 减少到原来的 $1/h$。

(3)GQA(Grouped-Query Attention)

折中方案:

  • 把注意力头分组;
  • 每组共享一组 K、V。

KV Cache 减少到原来的 $1/g$,$g$ 是分组数。

LLaMA 2、LLaMA 3 等模型都采用 GQA。

(4)MLA(Multi-Head Latent Attention)

DeepSeek 提出的方法:

  • 把 K、V 压缩到低维潜空间;
  • 推理时再投影回来。

能大幅压缩 KV Cache,同时保持较好效果。

2、优化显存管理

(1)PagedAttention

vLLM 的核心技术:

  • 把 KV Cache 分成固定大小的 block;
  • 像操作系统分页一样管理;
  • 不需要预分配连续显存;
  • 显存碎片大幅减少,利用率提升。

(2)Prefix Caching

如果多个请求有相同的前缀,比如相同的 system prompt:

  • 可以共享这部分 KV Cache;
  • 避免重复计算和重复存储。

(3)动态分配和回收

请求结束后及时回收 KV Cache,提高显存复用率。

3、减少计算和传输

(1)FlashAttention

通过分块计算和重排,减少显存读写:

  • 不显式存储完整的注意力矩阵;
  • 减少 HBM 读写;
  • 提升注意力计算效率。

(2)连续批处理(Continuous Batching)

不同请求的生成进度不同:

  • 传统 batch 要等最慢的请求结束;
  • 连续批处理动态加入新请求、移除已完成请求;
  • GPU 利用率大幅提升。

(3)投机解码(Speculative Decoding)

用一个小模型快速生成多个候选 token,再用大模型验证:

  • 减少大模型的前向次数;
  • 提升解码速度。

4、架构层面的优化

(1)滑窗注意力(Sliding Window Attention)

只保留最近 $w$ 个 token 的 KV:

  • KV Cache 大小固定为 $O(w)$;
  • 不再随序列长度增长。

Mistral 等模型采用这种方式。

(2)稀疏注意力

只计算部分注意力连接,减少 KV 需求。

(3)线性注意力、状态空间模型

用固定大小的状态代替 KV Cache,从根本上避免缓存增长。

比如 Mamba 等架构。


六、优化手段对比

优化手段 优化目标 核心思想 代表工作
KV 量化 减少显存 降低数值精度 INT8/INT4 KV
MQA/GQA 减少显存 共享 K、V LLaMA、PaLM
MLA 减少显存 低维潜空间压缩 DeepSeek
PagedAttention 显存管理 分页管理 vLLM
Prefix Caching 减少重复计算 共享前缀 vLLM、SGLang
FlashAttention 减少读写 分块计算 FlashAttention
连续批处理 提升吞吐 动态调度 vLLM、TensorRT-LLM
投机解码 提升速度 小模型草稿 Speculative Decoding
滑窗注意力 控制缓存 只留最近窗口 Mistral
线性注意力 消除缓存 固定状态 Mamba

七、简单评价这道面试题

1、这道题的价值

  • 这是大模型推理优化中非常核心的一道题;
  • 一道题能考察 KV Cache 原理、显存计算、吞吐瓶颈和多种优化手段;
  • 区分度好,初级可能只知道 KV Cache 能加速,中级能说清显存占用,高级能讲清 PagedAttention、GQA、MLA 等;
  • 贴近实战,vLLM、TensorRT-LLM、SGLang 等推理框架都围绕这些优化展开。

2、这道题的不足

  • 题目偏综合,如果候选人没有推理部署经验,容易答得空泛;
  • 没有具体场景约束,比如“多长上下文、多大 batch、什么硬件”;
  • 对量化精度损失、投机解码正确性等细节考察不够;
  • 没有涉及分布式推理中的 KV Cache 管理。

3、建议的追问方向

  • 给定模型配置,如何估算 KV Cache 大小?
  • PagedAttention 具体怎么解决显存碎片?
  • GQA 和 MQA 的区别是什么?为什么 GQA 更常用?
  • MLA 是怎么压缩 KV Cache 的?
  • Prefill 和 Decode 阶段分别瓶颈在哪里?如何优化?
  • 长上下文推理时,KV Cache 放不下怎么办?

4、总体评价

这是一道很好的大模型推理优化面试题,适合考察候选人对 KV Cache 和推理性能瓶颈的理解。它既能考察基础原理,也能延伸到工程优化和架构设计。如果候选人能把 KV Cache 的作用、显存计算公式、吞吐瓶颈来源以及常见优化手段都讲清楚,基本可以判断其具备大模型推理优化的扎实基础。


📌 面试天下网:一款服务于大一新生的口袋书,让大家在无聊的公共课上可以学习大模型技术!
📌 网站公告:【悬赏 200 元/篇】寻找“大模型面试战场”的一手回忆录
📌 网站公告:【大模型/Agent面试陪练1V1指导】正式启动......

评论专区

评论加载中...