Skip to content

模型量化 (Quantization)


观察不同量化精度如何影响权重分布和误差。

📉 量化可视化

INT8 (8 bits)
256个离散值
压缩比:4.0x
存储:0.10 KB
权重分布对比
原始 FP32
INT8
FP32
MSE: 0.00e+0
Max: 0.0000
FP16
MSE: 8.86e-8
Max: 0.0005
INT8
MSE: 9.22e-6
Max: 0.0053
INT4
MSE: 2.82e-3
Max: 0.0908
前 10 个权重对比
idxFP32INT8误差
00.1014690.101469~0
10.0179980.0156630.002335
2-0.097147-0.1023200.005172
30.4798160.4768680.002948
40.0808050.0800170.000788
5-0.179686-0.1773990.002286
60.3662090.3696110.003402
70.0455110.0478400.002329
80.6098120.6055760.004235
90.2267970.2301770.003380
💡 量化权衡:
  • INT8: 4x 压缩,精度损失小,适合大多数场景
  • INT4: 8x 压缩,精度损失较大,需要配合校准
  • 量化会将连续值映射到离散值,引入量化误差
  • 实际应用中通常配合量化感知训练 (QAT) 减少精度损失

💡 7B 模型: FP32=28GB, FP16=14GB, INT8=7GB, INT4=3.5GB


一句话定义:量化是将模型权重从高精度(如 FP32/FP16)转换为低精度(如 INT8/INT4)的技术,可以减少内存占用加速推理,同时尽量保持模型性能。

  • FP32: 32位浮点数,标准训练精度
  • FP16/BF16: 16位,混合精度训练常用
  • INT8: 8位整数,推理加速 2-4x
  • INT4: 4位整数,极致压缩,内存减少 8x

原图 (FP32)压缩后 (INT8)极限压缩 (INT4)
10MB PNG2MB JPEG500KB 缩略图
细节完美肉眼几乎无差有点模糊但能用
加载慢快 4x快 8x

量化就像图片压缩:牺牲一点精度,换取更小体积和更快速度。


模型FP32FP16INT8INT4
7B28 GB14 GB7 GB3.5 GB
13B52 GB26 GB13 GB6.5 GB
70B280 GB140 GB70 GB35 GB

INT4 量化让 7B 模型可以在消费级 GPU (4GB) 上运行!

指标提升
内存减少 4-8x
推理速度加速 2-4x
能耗降低 50-75%
精度损失通常 < 1%

将浮点数映射到整数范围:

量化与反量化
xq=round(xzs),xsxq+zx_q = \text{round}\left(\frac{x - z}{s}\right), \quad x \approx s \cdot x_q + z
  • xx: 原始浮点数
  • xqx_q: 量化后的整数
  • ss: 缩放因子 (scale)
  • zz: 零点 (zero point)

缩放因子计算

Scale 计算
s=xmaxxmin2bits1s = \frac{x_{\max} - x_{\min}}{2^{bits} - 1}

例如 INT8: s=xmaxxmin255s = \frac{x_{\max} - x_{\min}}{255}

粒度说明精度开销
Per-tensor整个张量一个 scale
Per-channel每个通道一个 scale
Per-group每 128 个元素一个 scale

Per-group 是 LLM 量化的主流选择(如 GPTQ、AWQ)。

┌─────────────────────────────────────────────────────┐
│ 量化方法分类 │
├─────────────────┬───────────────────────────────────┤
│ 训练后量化 │ 训练感知量化 │
│ (PTQ) │ (QAT) │
├─────────────────┼───────────────────────────────────┤
│ • GPTQ │ • QLoRA │
│ • AWQ │ • LLM-QAT │
│ • SmoothQuant │ │
│ • GGUF/GGML │ │
└─────────────────┴───────────────────────────────────┘
  • 基于 OBS (Optimal Brain Surgeon) 理论
  • 逐层量化,最小化重构误差
  • INT4 精度损失 < 1%
  • 观察到 1% 的权重特别重要
  • 保护重要权重,压缩其他
  • 比 GPTQ 更快更准
  • llama.cpp 使用的格式
  • 支持 CPU 推理
  • 多种量化级别 (Q4_0, Q4_K_M, Q8_0)

from transformers import AutoModelForCausalLM, AutoTokenizer
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
# 1. 配置量化参数
quantize_config = BaseQuantizeConfig(
bits=4, # INT4 量化
group_size=128, # Per-group 粒度
desc_act=False, # 是否降序激活
sym=True, # 对称量化
)
# 2. 加载原始模型
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-7b-hf",
torch_dtype=torch.float16,
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
# 3. 准备校准数据
calibration_data = [
tokenizer(text, return_tensors="pt")
for text in calibration_texts[:128]
]
# 4. 量化
model = AutoGPTQForCausalLM.from_pretrained(model, quantize_config)
model.quantize(calibration_data)
# 5. 保存
model.save_quantized("llama2-7b-gptq-4bit")
# 6. 加载使用
model = AutoGPTQForCausalLM.from_quantized(
"llama2-7b-gptq-4bit",
device_map="auto"
)

方法精度损失速度易用性适用场景
BitsAndBytes⭐⭐⭐⭐⭐快速实验
GPTQ很快⭐⭐⭐⭐生产部署
AWQ最低最快⭐⭐⭐高性能部署
GGUF⭐⭐⭐⭐⭐CPU/边缘设备



GPTQ 论文

Post-Training Quantization for GPT

阅读

AWQ 论文

Activation-aware Weight Quantization

阅读

llama.cpp

CPU 推理 + GGUF 量化

GitHub