量化与压缩

返回大模型

将模型权重从高精度(FP32/FP16)转换为低精度(INT8/INT4/NF4)表示,在几乎不损失精度的前提下大幅降低显存占用和推理延迟。量化是本地部署大模型的核心技术。


精度格式对比

格式位数显存占用(7B 模型)典型场景
FP3232 bit~28 GB训练基准
BF1616 bit~14 GB训练/推理标配
FP1616 bit~14 GBGPU 推理
INT88 bit~7 GB量化推理,轻微精度损失
INT44 bit~3.5 GB消费级 GPU,损失略大
NF44 bit~3.5 GBQLoRA 专用,正态分布优化
GGUF Q4_K_M~4.5 bit~4 GBllama.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)

相关文档