跳到主要内容
AI 丛编 推理优化 KV Cache

KV Cache:推理的显存核心

prefill 与 decode 两个阶段有什么不同,KV Cache 如何把每步解码从 O(n²) 降到 O(n)。

自回归解码时,第 tt 步要重新计算前 t1t-1 个 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 阶段缓存管理的碎片化问题)。

显存估算

记层数 LL、头数 hh、头维度 dhd_h、序列长 nn、BF16 精度(2 字节), 则缓存大小为:

L×2×h×n×dh×2 字节L \times 2 \times h \times n \times d_h \times 2 \ \text{字节}

以 7B 模型(L=32, h=32, dh=128L=32,\ h=32,\ d_h=128)生成长度 n=4096n=4096 为例: 约 32×2×32×4096×128×2=8 GiB32 \times 2 \times 32 \times 4096 \times 128 \times 2 = 8\ \text{GiB}, 和权重本身一个量级。

为什么不是银弹

  • 显存随序列长度线性增长,长上下文始终受限;
  • 缓存需要逐块分配与释放,容易产生碎片(PagedAttention 的动机);
  • 批处理时不同请求长度不一,缓存大小差异大。

尽管有 GQA/MQA 压缩头数、量化缓存等后续手段,KV Cache 仍是当前 推理系统的地基。

评论