引言:为什么需要量化?

大语言模型的参数量和计算量呈指数级增长。一个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年起逐渐成熟的新一代低精度格式,采用浮点数而非整数表示。主流有两种格式:

格式指数位尾数位范围精度
E4M343±448较高精度
E5M252±57344较大范围

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

精度对比:基准测试

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

量化方案MMLUGSM8KHumanEvalMT-Bench平均精度损失
FP16(基线)82.189.376.88.70%
FP8 (E4M3)81.889.076.28.60.4%
INT8 (W8A8)81.388.575.48.51.1%
INT8 (W8A16)81.989.176.58.60.3%
INT4 (GPTQ)79.286.172.38.23.5%
INT4 (AWQ)80.187.473.88.42.3%
INT4 (W4A16)80.587.874.58.41.9%

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

关键发现:

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

推理速度对比

量化方案硬件显存占用吞吐量(tokens/s)加速比
FP16A100 80G144GB(2卡)1,2001.0x
FP8H100 80G72GB(1卡)2,8002.3x
INT8 (W8A8)A100 80G72GB(1卡)2,4002.0x
INT4 (AWQ)A100 80G36GB(1卡)3,5002.9x
INT4 (AWQ)RTX 409036GB(1卡)2,2001.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在边缘部署中仍有不可替代的价值。选择量化方案时,永远记住:先测试你的真实业务数据,而非仅依赖公开基准