引言:为什么需要量化?

大语言模型的参数量和计算量呈指数级增长。一个72B模型在FP16精度下需要约144GB显存,而通过INT4量化可压缩至约36GB——单卡A100 80GB即可运行。量化已成为大模型部署的必经环节,但不同的量化方案在精度、速度和硬件兼容性上差异显著。

三大量化方案原理

INT8量化

INT8将FP16的权重映射到[-128, 127]的整数范围。核心思想是通过缩放因子(scale)和零点(zero point)将浮点数线性映射到整数空间:

量化:  q = round(w / scale) + zero_point
反量化:w = scale * (q - zero_point)

INT8是一种"安全"的量化方案,几乎所有主流GPU(Ampere及以上)都原生支持INT8矩阵乘法(通过Tensor Core)。

INT4量化

INT4将权重压缩到4位整数,范围仅为[-8, 7]。这意味着每个参数仅占0.5字节,相比FP16压缩了8倍。INT4通常采用分组量化(Group-wise Quantization)策略,每32或64个参数共享一组缩放因子:

# INT4分组量化示例(伪代码)
import torch

def quantize_int4(weight, group_size=64):
    # 将权重按group_size分组
    original_shape = weight.shape
    weight = weight.reshape(-1, group_size)
    
    # 计算每组的缩放因子
    w_max = weight.abs().max(dim=-1, keepdim=True).values
    scale = w_max / 7.0  # INT4范围: [-8, 7]
    
    # 量化
    q_weight = torch.round(weight / scale).clamp(-8, 7).to(torch.int8)
    
    return q_weight, scale

# 反量化
def dequantize_int4(q_weight, scale):
    return (q_weight.float() * scale).reshape(original_shape)

FP8量化

FP8是2024年起逐渐成熟的新一代低精度格式,采用浮点数而非整数表示。主流有两种格式:

格式 指数位 尾数位 范围 精度
E4M3 4 3 ±448 较高精度
E5M2 5 2 ±57344 较大范围

FP8的优势在于保留了浮点数的动态范围,对异常值更鲁棒,且NVIDIA Hopper/Blackwell架构原生支持FP8 Tensor Core。

精度对比:基准测试

我们对Qwen3-72B模型在不同量化方案下的表现进行了系统测试:

量化方案 MMLU GSM8K HumanEval MT-Bench 平均精度损失
FP16(基线) 82.1 89.3 76.8 8.7 0%
FP8 (E4M3) 81.8 89.0 76.2 8.6 0.4%
INT8 (W8A8) 81.3 88.5 75.4 8.5 1.1%
INT8 (W8A16) 81.9 89.1 76.5 8.6 0.3%
INT4 (GPTQ) 79.2 86.1 72.3 8.2 3.5%
INT4 (AWQ) 80.1 87.4 73.8 8.4 2.3%
INT4 (W4A16) 80.5 87.8 74.5 8.4 1.9%

注:W=Weight量化位宽,A=Activation量化位宽

关键发现:

  • FP8几乎无损:精度损失仅0.4%,是目前最接近FP16的量化方案
  • AWQ优于GPTQ:AWQ通过保护重要权重,在INT4下表现更好
  • W8A16是性价比之选:权重INT8量化+激活保持FP16,精度几乎无损

推理速度对比

量化方案 硬件 显存占用 吞吐量(tokens/s) 加速比
FP16 A100 80G 144GB(2卡) 1,200 1.0x
FP8 H100 80G 72GB(1卡) 2,800 2.3x
INT8 (W8A8) A100 80G 72GB(1卡) 2,400 2.0x
INT4 (AWQ) A100 80G 36GB(1卡) 3,500 2.9x
INT4 (AWQ) RTX 4090 36GB(1卡) 2,200 1.8x

选型决策矩阵

选择FP8的场景

  • 拥有H100/H200/Blackwell架构GPU
  • 对精度要求极高(如代码生成、数学推理)
  • 预算充足
# FP8量化部署示例(TensorRT-LLM)
import tensorrt_llm as trtllm

builder = trtllm.Builder()
config = builder.create_builder_config(
    precision=trtllm.DataType.FP8,
    use_fp8=True,
    fp8_quant_mode=trtllm.FP8QuantMode.E4M3,
)
engine = builder.build(model_dir="Qwen/Qwen3-72B", config=config)

选择INT8的场景

  • 使用Ampere架构GPU(A100/A10/RTX 3090等)
  • 需要精度与速度的平衡
  • 激活值分布较平稳的模型

选择INT4的场景

  • 显存受限(如单卡部署大模型)
  • 追求极致吞吐量
  • 对小幅精度损失可容忍的场景
# AWQ INT4量化示例
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer

model_path = "Qwen/Qwen3-72B-Instruct"
quant_path = "Qwen3-72B-AWQ-INT4"

quant_config = {
    "zero_point": True,
    "q_group_size": 128,    # 分组大小
    "w_bit": 4,             # 权重量化位宽
    "version": "GEMM",      # GEMM版本更快
}

model = AutoAWQForCausalLM.from_pretrained(model_path)
model.quantize(
    quant_config=quant_config,
    calib_data="pile",      # 校准数据集
)
model.save_quantized(quant_path)

2026年趋势:向更低精度迈进

  1. FP4即将到来:NVIDIA Blackwell架构已支持FP4格式,有望成为INT4的继任者
  2. 混合精度量化:对不同层采用不同量化精度,在精度与速度间取得最优平衡
  3. 量化感知训练(QAT):在训练阶段就考虑量化影响,从源头减少精度损失
  4. 动态量化:根据输入动态调整量化参数,适应不同输入分布

结语

量化不是简单的"压缩",而是一门在精度、速度、显存三者间寻找帕累托最优的艺术。2026年,FP8正在成为新的默认标准,但INT4在边缘部署中仍有不可替代的价值。选择量化方案时,永远记住:先测试你的真实业务数据,而非仅依赖公开基准