引言:为什么需要量化?
大语言模型的参数量和计算量呈指数级增长。一个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年趋势:向更低精度迈进
- FP4即将到来:NVIDIA Blackwell架构已支持FP4格式,有望成为INT4的继任者
- 混合精度量化:对不同层采用不同量化精度,在精度与速度间取得最优平衡
- 量化感知训练(QAT):在训练阶段就考虑量化影响,从源头减少精度损失
- 动态量化:根据输入动态调整量化参数,适应不同输入分布
结语
量化不是简单的"压缩",而是一门在精度、速度、显存三者间寻找帕累托最优的艺术。2026年,FP8正在成为新的默认标准,但INT4在边缘部署中仍有不可替代的价值。选择量化方案时,永远记住:先测试你的真实业务数据,而非仅依赖公开基准。