KV Cache:推理的显存核心
prefill 与 decode 两个阶段有什么不同,KV Cache 如何把每步解码从 O(n²) 降到 O(n)。
自回归解码时,第 步要重新计算前 个 token 的 K、V—— 这是平方级的重复劳动。KV Cache 的思路很简单:算过的键值对存下来,不再重算。
Prefill 与 Decode
- Prefill(预填充):一次性输入整段 prompt,并行计算全部 K、V 并写入缓存。 瓶颈是计算,GPU 利用率高。
- Decode(逐 token 解码):每步只算新 token 的 Q、K、V,注意力只需与 新 token 的 Q 及缓存中的 K、V 交互。瓶颈是显存带宽,GPU 利用率低。
两个阶段特性相反,工程上常常分开优化(PagedAttention 就诞生于 decode 阶段缓存管理的碎片化问题)。
显存估算
记层数 、头数 、头维度 、序列长 、BF16 精度(2 字节), 则缓存大小为:
以 7B 模型()生成长度 为例: 约 , 和权重本身一个量级。
为什么不是银弹
- 显存随序列长度线性增长,长上下文始终受限;
- 缓存需要逐块分配与释放,容易产生碎片(PagedAttention 的动机);
- 批处理时不同请求长度不一,缓存大小差异大。
尽管有 GQA/MQA 压缩头数、量化缓存等后续手段,KV Cache 仍是当前 推理系统的地基。