🧠 图解记忆:历史 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 生成延迟降了一个数量级。"
