标准回答
为什么针对 KV Cache
自回归解码时,每生成一个 token 都要复用此前所有 token 的 Key/Value,于是把它们缓存下来(KV Cache)。其显存正比于 序列长度 × 层数 × KV 头数 × batch × 精度位宽——在长上下文或高并发下,KV Cache 往往比权重更吃显存,成为瓶颈。
做法:量化存储 K/V
KV Cache 量化就是把缓存的 Key/Value 从 FP16/BF16 降精度存储:
- INT8:约省一半显存,精度损失通常很小,最常用。
- INT4:显存再减半,需更精细的缩放与处理才能保质量。
- FP8:动态范围更好,对异常值更友好。
显存随位宽近似线性下降,等价于把可支持的上下文长度或批大小成倍放大。
如何控制误差
常见误区
⚠️ 常见踩坑
别把 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 可更激进。
追问 3:KV Cache 量化和 GQA、PagedAttention 等手段是什么关系?
它们正交、可叠加:GQA(分组查询注意力)通过减少 KV 头数从结构上缩小 KV Cache;PagedAttention 通过分页管理减少显存碎片、提升利用率;KV Cache 量化则降低每个缓存元素的位宽。三者分别从「头数、内存管理、精度」三个维度压缩同一块显存开销,通常组合使用以最大化长上下文吞吐。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。