Skip to content
🔗 分享本题
查看我的学习进度 →

KV Cache 动漫知识图:Prefill 建立各层 K/V 缓存,Decode 每步仅为新 Token 计算 Q/K/V,将 K/V 追加并让当前 Q 关注历史缓存,以显存换取更少重复计算

🧠 图解记忆:历史 K/V 可复用,以显存换每步解码速度;点击图片可查看原图。

KV Cache = 把已经算过的历史 Token 的 K(Key)和 V(Value)缓存起来,避免重复计算。

为什么要缓存?(自回归的重复计算问题)

LLM 是自回归生成:每生成一个 Token,都要让所有历史 Token 重新过一遍 Attention。

生成 "我爱吃苹果":
第1步: 输入"我" → 算"我"的 Q/K/V → 预测"爱"
第2步: 输入"我爱" → 重新算"我"+"爱"的 Q/K/V → 预测"吃"  ❌ "我"的K/V白算了一遍
第3步: 输入"我爱吃" → 又重算一遍全部 Q/K/V → 预测"苹" ❌ 重复计算

不缓存: 复杂度 O(n²),生成长度翻倍,计算量翻 4 倍

KV Cache 怎么做?

第1步: 算"我"的 Q/K/V → 把 K、V 存进缓存 → 预测"爱"
第2步: 只算"爱"的 Q/K/V → K、V 追加到缓存 → 用"爱"的Q 和缓存的K/V做Attention → 预测"吃"
第3步: 只算"吃"的 Q/K/V → 追加缓存 → 预测"苹"

带缓存: 每步只算新 Token 的 Q/K/V,复杂度 O(n)(线性)

关键点

问题答案
为什么 Q 不缓存?Q 是"当前查询",每个新 Token 都要重新生成,没有复用价值
代价是什么?显存!KV Cache 随序列长度线性增长
复杂度变化O(n²·d) → O(n·d),长文本下提速明显

KV Cache 显存估算(面试常考)

KV Cache 大小 = 2 × batch × seq_len × n_layers × n_heads × d_head × 字节数

例:LLaMA-7B(32层、32头、d_head=128),batch=1,seq=2048,FP16
= 2 × 1 × 2048 × 32 × 32 × 128 × 2 bytes ≈ 1.07 GB

(进阶:PagedAttention 分页管理、KV Cache 量化、Prefix Caching 跨请求复用 → 见推理优化/推理框架模块)

面试话术:

示例表达(仅在能用本人经历或可复现实验佐证时使用): "KV Cache 是 LLM 推理加速最基础的优化:自回归生成时历史 Token 的 K/V 不会变,缓存后每步只需计算新 Token 的 Q/K/V,复杂度从 O(n²) 降到 O(n)。它的代价是显存——所以长上下文场景要配合 PagedAttention 和 KV 量化。我的项目里多轮对话场景靠它把单 token 生成延迟降了一个数量级。"