✨ 复制成功!

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

📋 已复制到剪贴板:

什么是 KV Cache?它为什么能加速推理?它带来哪些显存问题?MQA、GQA 如何缓解?

创建时间:2026-09-16 更新时间:2026-09-16 阅读次数:1230 次 分类:模型架构与Transformer

1、什么是 KV Cache

先回顾自回归生成的过程。

生成第 t 个 token 时,模型要计算 Attention:

Attention(Q, K, V) = softmax(QK^T / √d_k) V

其中:

  • Q 来自当前 token
  • K、V 来自所有已生成的 token(包括当前)

关键点:每生成一个新 token,都要和前面所有 token 做 Attention。

如果不缓存:

  • 生成第 1 个 token,算 1 个 token 的 K、V。
  • 生成第 2 个 token,要重新算前 2 个 token 的 K、V。
  • 生成第 t 个 token,要重新算前 t 个 token 的 K、V。

大量重复计算。

KV Cache 的做法:

  • 把每层、每个已生成 token 的 K、V 存起来。
  • 生成新 token 时,只算当前 token 的 Q、K、V。
  • 把当前 K、V 追加到缓存。
  • Attention 时,Q 和缓存里的所有 K、V 计算。

所以 KV Cache 存的不是 Q,而是 K 和 V。

2、为什么能加速推理

(1)避免重复计算 K、V

  • 不缓存:每步都要重算前面所有 token 的 K、V。
  • 有缓存:前面 token 的 K、V 只算一次,后续直接复用。

复杂度对比(生成 n 个 token):

  • 不缓存:O(n² · d) 的 K、V 计算,还有重复的 Attention。
  • 有缓存:K、V 只算一次,Attention 仍需和所有历史 K、V 计算,但省掉了重复投影。

(2)把计算从“平方级重复”变成“线性追加”

  • 每步只算当前 token 的 Q、K、V。
  • 然后和缓存做 Attention。
  • 单步计算量从 O(t · d) 降到 O(t · d)(Attention 本身还是和历史长度相关),但省掉了 K、V 投影的重复计算。

更准确地说:

  • K、V 投影:从每步 O(t · d²) 降到 O(d²)。
  • Attention 计算:仍然要和历史 K、V 交互,是 O(t · d)。
  • 所以主要省的是投影计算和重复前向。

(3)推理从训练模式变成增量模式

  • 训练时可以并行处理整个序列。
  • 推理是自回归,一个一个生成。
  • KV Cache 让推理可以增量进行,只算新 token。

(4)实际加速明显

  • 长序列生成时,KV Cache 能带来数倍加速。
  • 序列越长,收益越大。
  • 这也是所有主流推理框架(vLLM、TensorRT-LLM、TGI)的标配。

3、带来哪些显存问题

(1)显存随序列长度线性增长

KV Cache 大小:

2 · n_layers · n_heads · d_head · seq_len · batch_size · dtype_size

其中:

  • 2:K 和 V

  • n_layers:层数

  • n_heads:头数
  • d_head:每头维度
  • seq_len:序列长度
  • batch_size:批大小
  • dtype_size:每个元素字节数(FP16 是 2)

关键:KV Cache 和序列长度、batch size 成正比。

(2)长上下文下显存爆炸

举例(LLaMA 2 7B,FP16):

  • n_layers = 32
  • n_heads = 32
  • d_head = 128
  • 每 token 每层 KV:2 · 32 · 128 = 8192 个元素
  • 每 token 全部层:32 · 8192 = 262144 个元素
  • FP16:约 0.5 MB / token
  • 32K 序列:约 16 GB
  • batch 8:约 128 GB

这还没算模型权重和激活。所以长上下文 + 大 batch 时,KV Cache 是显存主要占用。

(3)显存碎片和调度问题

  • 不同请求序列长度不同,KV Cache 大小不同。
  • 传统分配方式容易产生碎片。
  • 需要 PagedAttention 等技术管理。

(4)带宽瓶颈

  • 推理时每步都要读整个 KV Cache。
  • 显存带宽成为瓶颈,GPU 算力利用率低。
  • 这叫“memory-bound”。

4、MQA、GQA 如何缓解

核心思路:减少 K、V 的头数,从而减少 KV Cache。

(1)MHA(标准多头注意力)

  • 每个头有独立的 Q、K、V。
  • n_heads 个 K、V。
  • KV Cache 最大。

(2)MQA(Multi-Query Attention)

  • 所有头共享一组 K、V,只有 Q 是多头。
  • K、V 头数从 n_heads 降到 1。
  • KV Cache 减少到 1 / n_heads。
  • 代表:PaLM、Falcon。

优点:

  • KV Cache 大幅减少。
  • 推理显存和带宽下降。

缺点:

  • 效果可能下降。
  • 训练可能不稳定。

(3)GQA(Grouped-Query Attention)

  • 把 Q 头分组,每组共享一组 K、V。
  • 比如 32 个 Q 头,分 8 组,每组 4 个 Q 头共享 1 组 K、V。
  • K、V 头数从 32 降到 8。
  • KV Cache 减少到 1 / 4。
  • 代表:LLaMA 2 70B、LLaMA 3、Mistral。

优点:

  • 在 MHA 和 MQA 之间折中。
  • 效果接近 MHA,显存接近 MQA。
  • 训练更稳定。

缺点:

  • 需要训练时适配。
  • 不是所有模型都支持。

(4)对比总结

类型Q 头数K、V 头数KV Cache效果代表
MHAhh最大最好原始 Transformer
MQAh1最小可能下降PaLM、Falcon
GQAhg(1<g<h)居中接近 MHALLaMA 2/3、Mistral

(5)其他缓解方法(补充)

  • KV Cache 量化:INT8/INT4 压缩,显存减半或更多。
  • PagedAttention:分页管理,减少碎片,vLLM 用。
  • Prefix Caching:共享相同前缀的 KV Cache。
  • KV Cache 驱逐/压缩:丢弃不重要的历史 token。
  • 滑动窗口注意力:只保留最近窗口的 KV。
  • 投机解码:减少生成步数,间接减少 KV Cache 增长。

5、一句话总结

KV Cache 缓存已生成 token 的 K、V,避免重复计算,加速自回归推理。代价是显存随序列长度和 batch 线性增长,长上下文下成为瓶颈。MQA 让所有头共享 K、V,GQA 分组共享,都是在效果和显存之间折中。此外还有量化、PagedAttention、Prefix Caching 等优化。

6、这道面试题的质量点评

优点

  • 逻辑闭环:是什么 → 为什么快 → 代价 → 优化,四步完整。
  • 区分度好:
    • 初级:能说“缓存 K、V,避免重复计算”。
    • 中级:能说显存线性增长、MQA/GQA。
    • 高级:能说 PagedAttention、量化、Prefix Caching、memory-bound。
  • 贴近工程:KV Cache 是大模型推理优化的核心,必考。
  • 有追问空间:可以追问 PagedAttention、量化、投机解码、Prefix Caching。

缺点

  • 第四问偏窄:只提 MQA/GQA,没提量化、PagedAttention 等。
  • 容易背结论:可能只答“KV Cache 省计算,MQA/GQA 省显存”。
  • 缺少场景:没问“你实际部署时怎么优化 KV Cache?”
  • 显存计算偏细节:如果面试官不追问,候选人可能不展开。

总体评价

质量:上。 适合中高级岗位,能有效区分“知道 KV Cache 概念”和“真正做过推理优化”的人。建议追问:

  • “KV Cache 具体存什么?为什么不存 Q?”
  • “PagedAttention 解决什么问题?”
  • “KV Cache 量化怎么做?掉点吗?”
  • “Prefix Caching 适合什么场景?”
  • “为什么说推理是 memory-bound?”

7、怎么回答才是最好的

回答原则

  • 先给定义:缓存 K、V,不缓存 Q。
  • 讲加速原理:避免重复计算 K、V 投影。
  • 说显存问题:随序列和 batch 线性增长。
  • 讲 MQA/GQA:共享 K、V,减少头数。
  • 主动提其他优化:量化、PagedAttention、Prefix Caching。
  • 结合实践:说“我们用 vLLM + GQA”。

推荐回答结构

“KV Cache 是自回归生成时缓存已生成 token 的 K 和 V。每生成一个新 token,只算当前 token 的 Q、K、V,把 K、V 追加到缓存,Attention 时 Q 和缓存里所有 K、V 计算。”

“它加速的原因是避免重复计算。不缓存的话,每步都要重算前面所有 token 的 K、V;有缓存后,K、V 只算一次,后续复用,省掉大量投影计算。序列越长,收益越大。”

“代价是显存。KV Cache 大小和层数、头数、序列长度、batch size 成正比。长上下文 + 大 batch 时,显存占用非常大。比如 LLaMA 2 7B,32K 序列单条就要十几 GB。而且推理每步要读整个缓存,是 memory-bound。”

“MQA 让所有头共享一组 K、V,KV Cache 降到 1/n_heads;GQA 分组共享,比如 32 个 Q 头分 8 组,KV Cache 降到 1/4,效果接近 MHA。LLaMA 2/3 用 GQA。”

“除了 MQA/GQA,还有 KV Cache 量化、PagedAttention、Prefix Caching、滑动窗口等。我们实际部署用 vLLM + GQA,PagedAttention 管理显存碎片,效果不错。”

加分点

  • 提到 只缓存 K、V,不缓存 Q。
  • 提到 KV Cache 大小公式、线性增长、memory-bound。
  • 提到 MQA/GQA 对比、代表模型。
  • 提到 PagedAttention、量化、Prefix Caching、滑动窗口。
  • 结合真实部署经验。

减分点

  • 说“缓存 Q、K、V”。
  • 只说“省计算”,不解释。
  • 不知道显存随序列线性增长。
  • 不知道 MQA/GQA 区别。
  • 不知道 PagedAttention 等工程优化。

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

评论专区

评论加载中...