量化与压缩
→ 返回大模型
将模型权重从高精度(FP32/FP16)转换为低精度(INT8/INT4/NF4)表示,在几乎不损失精度的前提下大幅降低显存占用和推理延迟。量化是本地部署大模型的核心技术。
精度格式对比
| 格式 | 位数 | 显存占用(7B 模型) | 典型场景 |
|---|---|---|---|
| FP32 | 32 bit | ~28 GB | 训练基准 |
| BF16 | 16 bit | ~14 GB | 训练/推理标配 |
| FP16 | 16 bit | ~14 GB | GPU 推理 |
| INT8 | 8 bit | ~7 GB | 量化推理,轻微精度损失 |
| INT4 | 4 bit | ~3.5 GB | 消费级 GPU,损失略大 |
| NF4 | 4 bit | ~3.5 GB | QLoRA 专用,正态分布优化 |
| GGUF Q4_K_M | ~4.5 bit | ~4 GB | llama.cpp,CPU 友好 |
主流量化方案
PTQ(训练后量化)
不需要重新训练,直接对预训练权重做量化,最常用。
| 方法 | 特点 |
|---|---|
| GPTQ | 逐层量化,使用 Hessian 信息最小化误差,INT4 精度最佳 |
| AWQ | 保护激活值大的权重(Activation-aware),精度优于 GPTQ |
| SmoothQuant | 将量化难度从激活值迁移到权重,INT8 友好 |
# 使用 bitsandbytes 加载 4-bit 量化模型
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4", # NF4 格式
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True, # 二次量化,进一步省显存
)
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3-8B",
quantization_config=bnb_config,
device_map="auto",
)QAT(量化感知训练)
在训练阶段模拟量化误差,精度最高但成本最大,适合小模型。
GGUF / llama.cpp 量化
面向 CPU 推理,支持 Q2_K 到 Q8_0 多个精度档:
# 转换并量化为 Q4_K_M
./quantize llama-3-8b-f16.gguf llama-3-8b-Q4_K_M.gguf Q4_K_M精度-速度权衡
FP16 → INT8:精度损失 < 1%,速度提升 1.5-2x,显存减半
INT8 → INT4:精度损失 1-3%,速度再提升,显存再减半
INT4 → INT2:精度损失显著(>5%),不推荐生产使用
其他压缩技术
知识蒸馏(Distillation)
用大模型(Teacher)的输出软标签训练小模型(Student):
Teacher(70B) → 生成软概率分布
Student(7B) → 学习软标签,而非 one-hot 标签
代表:Phi-3-mini(蒸馏自 GPT-4)、Qwen2.5-3B
剪枝(Pruning)
移除对输出影响小的权重或注意力头:
| 类型 | 方法 |
|---|---|
| 非结构化剪枝 | 置零个别权重,需稀疏计算库加速 |
| 结构化剪枝 | 移除整个注意力头/FFN 层,兼容普通硬件 |
LoRA / 低秩分解
不直接压缩基础模型,而是用低秩矩阵表示增量权重:
量化方案选型
| 场景 | 推荐方案 |
|---|---|
| 本地 CPU 推理(笔记本) | GGUF Q4_K_M(llama.cpp / Ollama) |
| 消费级 GPU(8-24 GB) | bitsandbytes INT4 + NF4 |
| 服务器 GPU 推理 | AWQ / GPTQ INT4 或 FP8 |
| 高精度生产推理 | FP16 / BF16,不量化 |
| 微调(显存受限) | QLoRA(4-bit 量化 + LoRA) |