Skip to content

KV Cache 的压缩和量化

5.5.1 INT8/INT4 量化

KV Cache 量化是减少内存占用的有效手段,通过

INT8量化原理

INT4 量化原理:

量化方案对比:

量化方案压缩率精度损失计算开销适用场景
FP16 (基准)1x0%高精度需求
INT82x<1%通用场景
INT44x2-5%内存受限
INT4-GPTQ4x1-2%极致压缩
AWQ4x<1%高质量需求

5.5.2 FP8 量化

FP8 是NVIDIA H100引入的新数据类型,专为AI工作负载优化:

FP8 在KV Cache中的应用:

python
#   使用FP8存储KV Cache(需要H100和Transformer Engine)
import transformer_engine.pytorch as te


# FP8 KV Cache    存储
key_cache_fp8 = te.fp8_cast_to_fp8(key_cache, te.fp8.FP8Types.E4M3)
value_cache_fp8 = te.fp8_cast_to_fp8(value_cache, te.fp8.FP8Types.E4M3)


# FP8     注意力计算(无需反量化)
output = te.fp8_attention(query, key_cache_fp8, value_cache_fp8)

5.5.3 压缩率与精度trade-off

选择合适的量化方案需要在压缩率和精度之间权衡:

不同量化方案的内存节省(LLaMA-70B, 32K序列):

配置KV Cache大小相对FP16精度影响
FP1620.48 GB100%基准
BF1620.48 GB100%与FP16相当
FP8 (E4M3)10.24 GB50%<0.5%
INT810.24 GB50%<1%
INT45.12 GB25%2-5%
INT4-AWQ5.12 GB25%<1%

量化最佳实践:

  1. 分层量化:不同层使用不同精度
    1. 后期层:使用INT8或FP8(更鲁棒)
  2. 动态量化:根据激活值动态选择scale
  3. 混合精度:Key和Value使用不同精度
    1. Key: INT8(对精度更敏感)
    2. Value: INT4(更鲁棒)
python
#   混合精度KV Cache示例
 class MixedPrecisionKVCache:
   def __init__(self, layer_idx: int):
       #   早期层使用更高精度
       if layer_idx < 10:
            self.key_dtype = torch.float16
            self.value_dtype = torch.float16
       elif layer_idx < 30:
            self.key_dtype = torch.int8
            self.value_dtype = torch.int8
       else:
            self.key_dtype = torch.int8
            self.value_dtype = torch.int4

用心记录,持续成长