📦 深度学习模型量化全过程(静态量化)笔记
🔹 步骤 1:选择量化方案
- 🎯 目的:决定如何对模型进行量化
- 🛠️ 方法:
- 选择量化策略:
- 静态量化(Post-training Quantization,PTQ)✅
- 动态量化(Dynamic Quantization)
- 量化感知训练(Quantization Aware Training,QAT)
- 本流程重点讲解 静态量化
🔹 步骤 2:准备模型和校准数据
- 🎯 目的:提供真实输入数据,供模型推理时收集激活范围
- 🛠️ 方法:
- 加载训练好的模型,
model.eval()
- 准备
calib_dataloader
(不可打乱:shuffle=False
)
- 自定义
collate_fn
:从 batch 中提取输入 x
🔹 步骤 3:运行模型收集激活分布
- 🎯 目的:收集每一层的输出(激活值)范围
- 🛠️ 方法:
- 遍历
calib_dataloader
,每个 batch 做前向推理
- 在每层添加 hook,记录其输出的
min/max
- 重复
calib_steps
次,确保统计稳定
🔹 步骤 4:计算量化参数(scale 和 zero_point)
- 🎯 目的:确定 float 和 int8 之间的映射关系
- 🛠️ 方法:
🔹 步骤 5:将权重与激活值量化为整数
- 🎯 目的:将模型转换为 int8 表示,降低存储与计算成本
- 🛠️ 方法:
🔹 步骤 6:导出量化模型
- 🎯 目的:生成部署可用的模型格式
- 🛠️ 方法:
- 使用工具导出,如:
- PPQ ➜
.espdl
- PyTorch ➜
.ptq
- TensorFlow ➜
.tflite
- ONNX ➜ 插入 QDQ 节点
- 包含量化参数、int8 权重、计算图结构
🔹 步骤 7:部署与推理
✅ 最终部署模型中包含内容:
内容 |
是否保留 |
说明 |
int8 权重 |
✅ |
用于节省内存和加速运算 |
激活的 scale/zero_point |
✅ |
还原中间计算值 |
权重的 scale/zero_point |
✅ |
精确计算 int8 卷积或线性 |
原始 float32 权重 |
❌ |
已舍弃 |
🧠 总结流程图:
训练模型
↓
校准数据 ➜ 模型前向推理
↓
收集激活 min/max
↓
计算 scale / zero_point
↓
float → int8 映射
↓
保存量化模型
↓
设备部署运行