引言
模型越大越准,但「装得下、跑得起」才是生产现实——手机、边缘设备、高并发服务都吃不下一个完整的大模型。模型压缩用四种武器把模型变小变快而尽量不掉点:量化(少用位)、剪枝(删冗余参数)、知识蒸馏(让大模型教小模型)、低秩分解(拆矩阵)。本文讲清每种方法的原理、落地方案与效果度量,帮你按场景选型。
前置:/ml-model-deployment/(ONNX 导出与部署)、/ml-neural-networks-basics/(网络结构)、/ml-deep-learning-advanced/(训练调参)。
目录
- 1. 为什么要压缩:推理是资源战
- 2. 量化原理:用更少的位表达权重
- 3. PTQ 与 QAT:两种量化落地
- 4. 剪枝:删掉不重要的参数
- 5. 结构化剪枝与通道剪枝
- 6. 知识蒸馏:大模型教小模型
- 7. 低秩分解与矩阵近似
- 8. 压缩效果度量与选型
- 9. 生产落地:量化感知的部署链路
- 10. 速查表与一句话记忆
- 延伸阅读
1. 为什么要压缩:推理是资源战
1.1 模型的成本在推理
训练是一次性的,推理是持续的——每一次用户请求都要跑一遍模型。模型越大:延迟越高、显存/内存越大、单机并发越低、电费越高。压缩让同一块硬件服务更多请求。
1.2 压缩的收益维度
| 维度 | 收益 |
|---|---|
| 模型体积 | 存储/下载/加载更快(边缘设备装得下) |
| 推理延迟 | 单次预测更快(用户感知) |
| 吞吐 | 同一硬件并发更多(服务成本) |
| 能耗 | 边缘设备续航(IoT/手机) |
记忆:推理是持续成本——压缩换体积、延迟、吞吐、能耗四维收益;「模型越大越好」在生产里要让位于「够用且跑得起」。
2. 量化原理:用更少的位表达权重
2.1 量化的直觉
训练用 FP32(32 位浮点),但权重分布往往集中在某个小范围——用 INT8(8 位整数) 表达同样信息,体积立刻减到 1/4,且整数运算在硬件上更快:
FP32 权重 0.5 → 缩放映射到 INT8 区间
q = round(r / s) + z
r ≈ (q - z) · s
s:缩放因子(从权重分布统计),z:零点偏移
2.2 动态范围与精度损失
量化是有损压缩——把连续值塞进离散格子会丢精度。损失大小取决于:权重分布是否集中、量化粒度(per-tensor / per-channel)、是否在敏感层。
2.3 常见精度
| 精度 | 位数 | 用途 |
|---|---|---|
| FP32 | 32 | 训练基线 |
| FP16/BF16 | 16 | 训练加速、显存减半 |
| INT8 | 8 | 推理主流,体积/速度最优 |
| INT4/INT3 | 4/3 | 大模型量化(精度风险高) |
记忆:量化用缩放+零点把连续权重映射到低精度整数——INT8 是推理主流(体积 1/4、运算更快);是有损压缩,损失取决于分布集中度与量化粒度。
3. PTQ 与 QAT:两种量化落地
3.1 PTQ:训练后量化(省事)
训练完模型,收集少量校准数据统计权重/激活分布,直接量化:
PTQ(Post-Training Quantization)
✓ 无需重训,流程简单
✓ 用校准集统计 s、z
✗ 精度损失略大(尤其小模型/敏感层)
3.2 QAT:量化感知训练(保精度)
在训练时就模拟量化误差(前向量化、反向不量化),让权重学会「抗量化」:
QAT(Quantization-Aware Training)
✓ 精度损失小
✗ 需要重训 + 数据
典型场景:精度敏感的部署、小模型、INT4 极端量化
3.3 PyTorch 快速对照
import torch
# PTQ:先训练,后量化
model = torch.quantization.quantize_dynamic(model, {torch.nn.Linear}, dtype=torch.qint8)
# QAT:训练中用 fake quant 模拟
model.qconfig = torch.quantization.get_default_qat_qconfig("fbgemm")
torch.quantization.prepare_qat(model, inplace=True)
train(model) # 正常训练
torch.quantization.convert(model, inplace=True) # 转成真量化
记忆:PTQ 训练后直接量化(省事但掉点多)、QAT 训练中模拟量化误差(保精度但要重训);精度敏感用 QAT,一般部署 PTQ 起步。
4. 剪枝:删掉不重要的参数
4.1 剪枝的直觉
网络中大量权重接近 0、大量神经元冗余——把它们删掉,模型几乎不掉点。
| 类型 | 粒度 | 效果 |
|---|---|---|
| 非结构化剪枝 | 单个权重置 0 | 稀疏度高但难利用硬件加速 |
| 结构化剪枝 | 整行/整通道/整层删除 | 直接减小矩阵,好加速 |
4.2 非结构化剪枝示例
import torch.nn.utils.prune as prune
prune.l1_unstructured(conv_layer, name="weight", amount=0.3) # 砍 30% 最小幅度权重
稀疏矩阵需专用库(如 torch.sparse、oneAPI)才真正提速,否则只是「体积变小」。
记忆:剪枝删冗余参数——非结构化(置零单个权重)稀疏度高但难加速,结构化(删整通道/整层)直接加速但可能掉点多。
5. 结构化剪枝与通道剪枝
5.1 通道剪枝:删掉不重要的特征图
对卷积层,按通道权重范数/BN 缩放因子评估每个通道的重要性,删掉最不重要的:
# 思路:按每通道权重 L2 范数排序,删除尾部通道
channel_norm = conv.weight.abs().sum(dim=(1, 2, 3))
keep_idx = channel_norm.argsort()[n_keep:]
删除通道后下一层的输入维度要同步裁剪——剪枝要跨层联动,这也让结构化剪枝的工程复杂度更高。
5.2 迭代剪枝 + 微调
# 一次性砍太多掉点明显 → 迭代剪枝
# 训练 → 剪 10% → 微调 → 再剪 10% → 再微调 …
# 每次剪后微调恢复精度,比一刀切效果好
记忆:通道剪枝按通道范数评估重要性、跨层联动裁剪;迭代剪枝(剪一点→微调→再剪)比一次砍到位更稳。
6. 知识蒸馏:大模型教小模型
6.1 蒸馏的直觉
小模型直接学硬标签(0/1),学不到「猫和狗有多像」这样的软知识。蒸馏让教师模型输出软概率(用温度 T 软化),小模型从软概率里学到类别间的关系:
# 教师输出 logits → 用温度 T 软化:p_i = exp(z_i / T) / Σ exp(z_j / T)
# 学生损失 = 蒸馏损失(对齐教师软概率)+ 任务损失(对齐真实标签)
# T 越大分布越平滑,软知识越丰富
6.2 为什么要蒸馏
# 小模型直接训练:数据有限,学不到细腻决策边界
# 蒸馏:教师已经把"世界的规律"压缩在软概率里,学生白嫖教师经验
# 收益:同样体积的学生模型,蒸馏后比直接训练更准
6.3 典型应用
- 大模型 → 小模型:BERT 蒸馏成 TinyBERT 快 10 倍
- 集成 → 单模型:多个教师融合成一个小模型
- LLM → 小模型:GPT-4 输出蒸馏成专用小模型(对齐数据)
记忆:蒸馏让教师模型的软概率(温度 T 软化)教学生——学生学到类别间关系而非只学硬标签;同样的体积,蒸馏的学生比直接训练更准。
7. 低秩分解与矩阵近似
7.1 权重矩阵可能是低秩的
全连接/卷积的权重矩阵常可以用低秩近似表达——大矩阵拆成两个小矩阵相乘,参数大减:
W (m×n) ≈ U (m×r) · V (r×n),r << min(m, n)
参数从 m·n 降到 r·(m+n)
7.2 应用与局限
# 典型:全连接层 SVD 分解、卷积核低秩分解
# 优点:无重训也能用、直接减参
# 局限:加速依赖具体实现,有些硬件不明显
# 常与剪枝/量化组合使用
记忆:低秩分解把大权重矩阵拆成两个小矩阵相乘(SVD 近似),参数从 m·n 降到 r·(m+n);无重训可用,常与其他压缩方法组合。
8. 压缩效果度量与选型
8.1 度量四个指标
| 指标 | 含义 |
|---|---|
| 压缩率 | 原体积 / 压缩后体积 |
| 加速比 | 原延迟 / 压缩后延迟 |
| 精度损失 | 压缩前后准确率/AUC 差值 |
| 吞吐收益 | 同一硬件并发数提升 |
8.2 选型矩阵
| 场景 | 首选方法 |
|---|---|
| 尽快上线、精度不敏感 | PTQ 量化 |
| 精度敏感(医疗/风控) | QAT 或蒸馏 |
| 边缘/手机端 | 量化 + 结构化剪枝 |
| 大模型部署 | INT8/INT4 量化 + 蒸馏 |
| 极致性能追求 | 量化 + 剪枝 + 低秩组合 |
记忆:压缩四度量「压缩率、加速比、精度损失、吞吐收益」;选型——求快用 PTQ、求精度用 QAT/蒸馏、边缘端组合拳。
9. 生产落地:量化感知的部署链路
9.1 完整链路
1) 训练 FP32 基线(记录评估分数)
2) 用校准集做 PTQ → 评估精度损失
3) 若损失超标 → 转 QAT / 加蒸馏
4) 导出 ONNX(含量化算子)或直接用推理框架量化
5) 目标端验证:延迟/吞吐/体积实测(别只看理论压缩率)
6) A/B 灰度:压缩模型与基线模型对比线上指标
9.2 关键注意点
✓ 校准集要代表真实分布(校准集偏差 = 量化误差放大)
✓ 敏感层(首层/输出层)可保留高精度混合部署
✓ 量化后一定在目标硬件实测(不同硬件量化支持不同)
✓ 留回滚:压缩版本劣化立即切回 FP32
记忆:落地走「FP32 基线→PTQ 评估→超标转 QAT/蒸馏→ONNX/推理框架导出→目标端实测→A/B 灰度」链路;校准集代表性、敏感层混合精度、目标硬件实测是三大纪律。
10. 速查表与一句话记忆
| 方法 | 原理 | 一句话 |
|---|---|---|
| 量化 | 低位数表达权重 | INT8 主流,体积 1/4 |
| PTQ | 训练后量化 | 省事、掉点多 |
| QAT | 训练中模拟量化 | 保精度、要重训 |
| 非结构化剪枝 | 单个权重置零 | 稀疏难加速 |
| 结构化剪枝 | 删通道/层 | 直接加速 |
| 知识蒸馏 | 大模型教小模型 | 小模型更准 |
| 低秩分解 | 矩阵拆两个小矩阵 | 减参、组合用 |
一句话记忆:模型压缩四件套——量化用低位数表达权重(INT8 推理主流,PTQ 省事掉点多、QAT 保精度要重训)、剪枝删冗余参数(非结构化稀疏难加速、结构化删通道直接提速但要跨层联动+迭代微调)、知识蒸馏让教师软概率教学生(同体积更准,大模型→小模型的标配)、低秩分解把大矩阵拆成两个小矩阵(减参常组合用);度量看压缩率/加速比/精度损失/吞吐收益;落地走「FP32 基线→PTQ→超标转 QAT/蒸馏→ONNX 导出→目标硬件实测→A/B 灰度」,校准集要代表真实分布、敏感层混合精度、随时留回滚——「装得下、跑得起、不掉点」才是压缩的及格线。
延伸阅读
- /ml-model-deployment/ — ONNX 导出、FastAPI 部署与监控
- /ml-deep-learning-advanced/ — 模型结构与训练调参
- /ml-neural-networks-basics/ — 网络基础与损失函数
- /ml-model-evaluation/ — 精度损失的评估口径
- [[ai-ml]] — 大规模推理优化与分布式部署
- PyTorch 量化文档
- ONNX 模型量化指南
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。