Skip to content

模型量化

量化是把模型参数从高精度(FP16/BF16)压缩到低精度(INT8/INT4)的技术。显存减半,速度翻倍,精度几乎不降。

Llama-7B 的参数:

  • FP16:7B × 2 字节 = 14 GB 显存
  • INT4:7B × 0.5 字节 = 3.5 GB 显存

一张 RTX 3060 (12GB) 就能跑 7B 模型。

flowchart LR
A[FP16 权重<br/>2 字节/参数] -->|量化| B[INT4 权重<br/>0.5 字节/参数]
B -->|推理时反量化| C[FP16 计算]

量化公式:

q=round(xoffsetscale)q = \text{round}\left(\frac{x - \text{offset}}{\text{scale}}\right)
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
import torch
# 4-bit 量化配置
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4", # 4-bit NormalFloat
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True, # 双重量化,进一步压缩
)
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.2-3B",
quantization_config=bnb_config,
device_map="auto",
)
print(f"显存: {model.get_memory_footprint() / 1e9:.1f} GB")
方法精度速度特点
GPTQINT4/INT8需要校准数据,一次性量化
AWQINT4保护重要权重通道
bitsandbytesINT4/INT8动态量化,即插即用
GGUFINT4-INT8llama.cpp 格式,CPU 友好
# 模拟量化误差
import torch
x = torch.randn(1000) * 3 # 原始数据
# 模拟 INT4 量化(16 个值)
scale = (x.max() - x.min()) / 15
x_quant = torch.round(x / scale) * scale
error = (x - x_quant).abs().mean()
print(f"平均量化误差: {error:.4f}")
print(f"相对误差: {error / x.abs().mean() * 100:.1f}%")
  • 本地跑大模型:bitsandbytes 4-bit(最简单)
  • 部署到生产:GPTQAWQ(更快)
  • 边缘设备/CPU:GGUF(llama.cpp)
  • KV Cache — 量化和 KV Cache 是显存优化的两大支柱
  • 模型部署 — 部署中的量化实践