KV Cache 为什么能加速推理,又带来什么代价?
先用自己的话答,再看参考说法
60 秒是练习上限,不是必须凑满。原理题讲清因果,设计题讲清约束,项目题只讲真实证据。
别照着背。参考说法只用于对照;直接回答问题,简单题说清楚就收尾。项目题只用自己的经历和数字。
参考内容当前已显示;开始口述后会暂时隐藏。
面试时怎么答
KV Cache 要从自回归 Decode 的重复计算切入:历史 K/V 可以复用,所以每步计算量下降;与此同时,缓存会随层数、KV Head、序列长度和并发线性增长。把“省算力、耗显存、仍读历史 KV”这三件事讲完整即可,追问时再谈 GQA 或分页管理,不必堆一串线上指标。
可以这样答:
KV Cache 会保存每层历史 Token 的 K 和 V,新 Token 解码时无需重新计算整段历史,因此显著减少重复计算。代价是缓存随层数、KV Head、序列长度和并发近似线性增长,而且每一步仍要读取历史 KV,长上下文下容易转成显存容量和带宽瓶颈。GQA 与分页管理能缓解占用,但不能消除真实长序列的成本。
核心回答
自回归生成时,历史 token 在每一层产生的 Key 和 Value 不会因新 token 到来而改变。KV Cache 保存这些结果,使下一步只计算新 token 在各层的完整表示,而不用重算历史 token 的隐藏状态和 K/V。对没有滑窗、淘汰或压缩的全注意力模型,缓存会随层数、有效序列数和上下文长度线性增长;新 Query 仍要读取并关注历史 Key,因此单 token 延迟不会与上下文长度无关。
展开说明
缓存显存可近似估算为:
2 × 层数 × Batch × 序列长度 × KV Head 数 × Head 维度 × 每元素字节数
其中 2 表示 Key 和 Value,Batch 表示同时保留缓存的有效序列数;Beam Search 会增加有效序列数,张量并行下单卡占用还取决于 K/V 如何分片。MHA 为每个 Query Head 保存 K/V;MQA 共享一组 K/V;GQA 使用少量 KV Head,在质量与缓存大小之间折中。滑动窗口模型的缓存可在窗口长度附近封顶。
KV Cache 解决的是重复计算,不等同于 Prefix Cache。后者尝试在不同请求之间复用相同前缀的缓存,还需要命中判断、隔离和淘汰策略。
工程实践
高并发服务通常结合分页式缓存、连续批处理、长度上限、会话淘汰和 KV 量化。优化时应同时观察 TTFT、单 token 延迟、吞吐、缓存利用率和 OOM,而不是只比较“开启缓存前后”的单请求速度。
常见追问
- 为什么上下文越长,开启 KV Cache 后解码仍会变慢? Cache 只避免重算 K/V;每个新 Token 的注意力仍要读取并计算全部历史 KV,访存量随长度增长。
- GQA 为什么能降低 KV Cache 显存? 多个 Query Head 共享更少的 KV Head,因此每层需要保存的 K/V 数量下降,但 Query 侧计算不会同比消失。
- PagedAttention 解决的是计算问题还是内存管理问题? 核心是把 KV 分页管理,减少预留和碎片并支持非连续分配;它不改变注意力本身的理论计算量。
一句话复习
KV Cache 用显存换取不重复计算历史前缀,但长上下文和高并发会让缓存本身成为瓶颈。
参考资料
评论与补充
评论会直接显示在这道题下面。可以写自己的答法、继续追问或指出错误,不需要 GitHub 账号,也不会跳转到 Issue;内容会公开,请勿填写个人隐私、公司机密或受保密约束的材料。
正在连接站内评论服务…
正在加载评论…
还没有评论,你可以先写下自己的理解或追问。