核心要点

  • KV Cache 显存随「序列长度 × 层数 × 头数 × 批大小」线性增长,长上下文/大批量时常成为推理显存瓶颈。

  • KV Cache 量化:把缓存的 Key/Value 张量从 FP16/BF16 降到 INT8、INT4FP8 存储,显存占用按比特位数成比例下降。

  • 精度控制:用 per-channel 或 per-group(分组)缩放因子,而非单一 per-tensor 缩放,以抑制异常值(outlier)带来的量化误差。

  • K 与 V 敏感度不同:Key 通常存在更强的通道异常值、对量化更敏感,常需更细粒度缩放或保留更高比特。

标准回答

为什么针对 KV Cache

自回归解码时,每生成一个 token 都要复用此前所有 token 的 Key/Value,于是把它们缓存下来(KV Cache)。其显存正比于 序列长度 × 层数 × KV 头数 × batch × 精度位宽——在长上下文或高并发下,KV Cache 往往比权重更吃显存,成为瓶颈。

做法:量化存储 K/V

KV Cache 量化就是把缓存的 Key/Value 从 FP16/BF16 降精度存储:

  • INT8:约省一半显存,精度损失通常很小,最常用。
  • INT4:显存再减半,需更精细的缩放与处理才能保质量。
  • FP8:动态范围更好,对异常值更友好。
    显存随位宽近似线性下降,等价于把可支持的上下文长度或批大小成倍放大。

如何控制误差

  • 细粒度缩放:用 per-channel 或 per-group(分组)缩放因子代替整张张量一个缩放,显著抑制异常值影响。
  • K/V 区别对待:Key 常有更强的通道级 outlier、对量化更敏感,可给 K 用更细粒度或更高比特,对 V 用更激进量化。
  • 解码时反量化回计算精度做注意力,属典型的训练后量化(PTQ),无需重训。详见 LLM 量化实战

常见误区

⚠️ 常见踩坑

别把 KV Cache 量化和权重量化混为一谈——前者压的是随上下文增长的激活缓存,长上下文场景收益尤其大。也别无脑用 per-tensor 单一缩放:K/V(尤其 Key)存在通道异常值,必须 per-channel/group 缩放,否则 INT4 下精度会明显崩坏。

追问

追问 1为什么 KV Cache 量化对长上下文推理尤其重要?

KV Cache 显存随序列长度线性增长,长上下文(数万到数十万 token)时它会远超模型权重的显存占用,直接限制可处理的上下文长度和并发批量。把 K/V 从 16-bit 降到 8/4-bit,可成倍降低这部分显存,从而在同样硬件上支持更长上下文或更大 batch,提升吞吐。

追问 2为什么 Key 通常比 Value 更难量化?

经验上 Key 张量在某些通道存在较大幅度的异常值(outlier channels),它们会拉大量化的动态范围,使其余数值的有效精度下降,且 Key 直接参与注意力打分、误差会被 softmax 放大。Value 分布相对平缓。因此常对 Key 采用更细的 per-channel/group 缩放或保留更高比特,对 Value 可更激进。

追问 3KV Cache 量化和 GQA、PagedAttention 等手段是什么关系?

它们正交、可叠加:GQA(分组查询注意力)通过减少 KV 头数从结构上缩小 KV Cache;PagedAttention 通过分页管理减少显存碎片、提升利用率;KV Cache 量化则降低每个缓存元素的位宽。三者分别从「头数、内存管理、精度」三个维度压缩同一块显存开销,通常组合使用以最大化长上下文吞吐。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。