⚙️ 系统工程 · 8 分钟
KV Cache:让 LLM 推理快 10 倍的秘密
LLM 每生成一个新 token,会重复算所有之前 token 的注意力——除非用 KV Cache。
左边是没有 cache 的暴力版,右边是用 cache 的高效版。点击"生成下一个"看差异。
已生成 tokens
总共生成 0 个 token
❌ 没有 KV Cache
每次都从头算
每生成 1 个新 token,需要重算所有之前 token 的 K/V:
生成 n 个 token 的总计算复杂度 = O(n²)
✅ 有 KV Cache
只算新的
之前 token 的 K/V 已缓存,本轮只算新 token:
生成 n 个 token 的总计算复杂度 = O(n)
⚠️ KV Cache 不是免费的
KV Cache 大幅减少了计算,但代价是显存占用快速增长。
长对话越后面越慢、显存压力越大 —— 这是 PagedAttention(vLLM 核心创新)想解决的问题。
🧠
为什么 K, V 可以缓存
每个 token 的 K = x · W_k 和 V = x · W_v 仅依赖该 token 本身——
生成新 token 时它们不会变。
而 Q = x · W_q 在每生成新 token 时只需要新算 1 行(新 token 的 Q)。
📉
从 O(n²) 到 O(n)
生成 1000 个 token:
- · 没缓存: 1+2+3+...+1000 = 500,500 次
- · 有缓存: 1000 次
- · 提速: 500×
这就是为什么所有 LLM 推理框架(vLLM, TGI, llama.cpp)都默认开 KV Cache。
📝 演示说明: 这里的"计算次数"是简化模型——实际 LLM 推理还有 FFN、LayerNorm 等其它运算。
但 attention 的 O(n²) → O(n) 优化是核心思想,理解了这一点就理解了 LLM 推理优化的起点。详见 L7-03 推理优化。