常见量化格式:INT8、INT4、FP8、NF4等格式的表示与特点

核心原理:从连续浮点到离散整数的映射

量化本质上是将连续的浮点张量(通常为FP16或BF16)映射到离散的低精度数值空间。不同量化格式的核心差异在于:数值表示范围、精度分布密度以及硬件支持程度。在vLLM推理引擎中,量化格式直接决定了KV Cache的显存占用、矩阵乘法的计算吞吐以及反量化(Dequantization)的开销。

以最基础的对称INT8量化为例,其映射关系可表示为:

scale = max(|x|) / 127
x_int8 = round(x / scale)
x_dequant = x_int8 * scale

这里scale是浮点缩放因子,x_int8是量化后的整数。对称量化将零点固定在0,适合权重分布近似对称的矩阵;而非对称量化额外引入zero_point,能更好地适配激活值分布偏移的场景。

关键认知:量化格式的选择不是“精度越低越好”,而是要在数值动态范围与精度密度之间取得平衡。例如INT8提供256个离散级别,而NF4虽然只有16个级别,但通过非线性分布将更多级别集中在概率密度高的区域。
常见量化格式数值分布对比 -∞ +∞ 数值范围 INT8 -128 ~ 127(256个均匀级别) INT4 -8 ~ 7(16个均匀级别) FP8 E4M3: 最大448 | E5M2: 最大57344(动态范围大) NF4 16个非线性级别(集中在[-1, 1]区间) NF4 级别分布密度(靠近0更密集) -1.0 1.0 0 均匀分布 非线性分布 → 级别越密,量化误差越小

各格式详细特点与适用场景

格式 位宽 表示方式 动态范围 精度特点 典型应用
INT8 8 bit 对称/非对称整数 [-128, 127] 均匀分布,硬件支持最成熟 权重/激活量化,TensorRT-LLM
INT4 4 bit 分组量化(通常group=32/128) [-8, 7] 均匀分布,需分组scale补偿 GPTQ/AWQ权重量化
FP8 8 bit E4M3 / E5M2 E4M3: ±448
E5M2: ±57344
动态范围大,近零精度高 Hopper/Ada GPU训练与推理
NF4 4 bit 非线性浮点(正态分布) [-1, 1] 附近密集 级别集中在零附近,适合权重分布 QLoRA微调,bitsandbytes

方法流程:vLLM中量化格式的选择与配置

在vLLM中启用量化格式通常通过--quantization参数指定,不同格式对应不同的后端实现。以下是典型配置流程:

# INT8 权重量化(使用LLM.int8()方案)
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-2-7b-hf \
    --quantization llm_int8

# FP8 量化(需要Hopper或Ada架构GPU)
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-2-7b-hf \
    --quantization fp8 \
    --kv-cache-dtype fp8_e5m2

# AWQ INT4 量化(需预先用AWQ工具量化模型)
python -m vllm.entrypoints.openai.api_server \
    --model TheBloke/Llama-2-7B-AWQ \
    --quantization awq

选择量化格式时,需要遵循以下判断路径:

  1. 硬件约束优先:检查GPU是否支持FP8(Hopper/Ada)或INT8 Tensor Core(Ampere及以上)。
  2. 精度敏感度评估:对生成质量要求高的任务(如代码生成)优先选择FP8或INT8;对显存极度紧张的场景选择INT4/NF4。
  3. 校准数据准备:INT4和INT8通常需要校准集来确定scale和zero_point,而FP8和NF4的校准相对简单。
  4. 端到端验证:量化后必须用验证集检查困惑度(Perplexity)或下游任务指标,确保损失在可接受范围。

案例:LLaMA-7B在不同量化格式下的显存对比

假设模型权重为FP16(约14GB),KV Cache配置为2048序列长度、40层、32头,每头维度128:

# KV Cache 显存估算(单序列)
kv_cache_bytes = 2 (K和V) × 40层 × 32头 × 128维 × 2048长度 × 2字节(FP16)
              = 2 × 40 × 32 × 128 × 2048 × 2
              = 1,342,177,280 字节 ≈ 1.25 GB

# 若使用FP8 KV Cache(E5M2)
kv_cache_fp8 = 1.25 GB / 2 = 0.625 GB

# 若使用INT8 KV Cache
kv_cache_int8 = 1.25 GB / 2 = 0.625 GB

实际推理时,INT4权重量化(如AWQ)可将权重从14GB压缩至约3.5GB,配合FP8 KV Cache,整体显存占用可降低约60%以上,使得7B模型能在24GB消费级GPU上流畅运行。

常见误区:不要认为“NF4精度最低所以效果最差”。NF4的设计目标正是匹配神经网络权重的近似正态分布——大多数权重集中在零附近,因此NF4在4bit格式中往往能取得比均匀INT4更低的量化误差。但NF4的硬件加速支持较弱,在vLLM中通常需要反量化到FP16后再计算,吞吐量可能低于原生INT4方案。

误区与复盘:量化格式选择的常见陷阱

  • 误区一:盲目追求低位宽。INT4虽然显存减半,但若分组太小(如group=32),scale存储开销会抵消显存收益;若分组太大(如group=256),量化误差增大。需要根据模型尺寸和硬件平衡。
  • 误区二:忽略KV Cache量化。很多用户只量化权重,但KV Cache在长序列推理中占显存比例极高。vLLM支持--kv-cache-dtype fp8_e5m2,能显著降低长上下文场景的显存压力。
  • 误区三:FP8的E4M3与E5M2混用。E4M3精度高但范围小,适合权重和激活;E5M2范围大但精度低,适合梯度或KV Cache。混用时要确保硬件支持两种格式的转换。
  • 复盘建议:在vLLM中做量化实验时,应同时监控显存占用、首token延迟和生成质量三个指标。建议先用小规模数据集跑通流程,再扩展到完整评估集。

总结而言,INT8、INT4、FP8、NF4各有其数学表示和硬件适配的独特定位。在vLLM生产环境中,推荐优先考虑FP8(若硬件支持)作为精度与性能的平衡点;显存极度受限时选择AWQ/INT4;而NF4更适合离线微调场景。理解每种格式的数值分布特性,是做出正确量化决策的基础。