模型压缩与推理优化实战:量化、剪枝与知识蒸馏

模型压缩与推理优化实战:为什么大模型要压缩、量化原理(PTQ/QAT、INT8/FP16)、剪枝(非结构化/结构化)、知识蒸馏(软标签/温度)、低秩分解、混合部署与量化感知训练、压缩的效果度量与选型、生产落地与常见陷阱。

引言

模型越大越准,但「装得下、跑得起」才是生产现实——手机、边缘设备、高并发服务都吃不下一个完整的大模型。模型压缩用四种武器把模型变小变快而尽量不掉点:量化(少用位)、剪枝(删冗余参数)、知识蒸馏(让大模型教小模型)、低秩分解(拆矩阵)。本文讲清每种方法的原理、落地方案与效果度量,帮你按场景选型。

前置:/ml-model-deployment/(ONNX 导出与部署)、/ml-neural-networks-basics/(网络结构)、/ml-deep-learning-advanced/(训练调参)。


目录


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 常见精度

精度位数用途
FP3232训练基线
FP16/BF1616训练加速、显存减半
INT88推理主流,体积/速度最优
INT4/INT34/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 模型量化指南

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「ml」更多文章

  1. 强化学习入门实战:MDP、Q-learning 与 DQN 概览
  2. 多分类与多标签学习实战:OvR、softmax 与多输出评估
  3. 模型监控与数据漂移检测:PSI、KS 与概念漂移实战