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 | 效果 | 代表 |
|---|
| MHA | h | h | 最大 | 最好 | 原始 Transformer |
| MQA | h | 1 | 最小 | 可能下降 | PaLM、Falcon |
| GQA | h | g(1<g<h) | 居中 | 接近 MHA | LLaMA 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 等工程优化。
评论专区
评论加载中...登录后即可发表评论