📦 深度学习模型量化全过程(静态量化)笔记


🔹 步骤 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 之间的映射关系
  • 🛠️ 方法
    • 对每层计算:
      scale = (max_val - min_val) / (quant_max - quant_min)
      zero_point = round(-min_val / scale) + quant_min
      
    • quant_min/quant_max 对于 int8 一般是 0 ~ 255-128 ~ 127

🔹 步骤 5:将权重与激活值量化为整数

  • 🎯 目的:将模型转换为 int8 表示,降低存储与计算成本
  • 🛠️ 方法
    • 使用:
      q_val = round(float_val / scale) + zero_point
      
    • 权重通常使用 per-channel 量化
    • 激活通常使用 per-tensor 量化

🔹 步骤 6:导出量化模型

  • 🎯 目的:生成部署可用的模型格式
  • 🛠️ 方法
    • 使用工具导出,如:
      • PPQ ➜ .espdl
      • PyTorch ➜ .ptq
      • TensorFlow ➜ .tflite
      • ONNX ➜ 插入 QDQ 节点
    • 包含量化参数、int8 权重、计算图结构

🔹 步骤 7:部署与推理

  • 🎯 目的:在设备上运行量化模型
  • 🛠️ 方法
    • 加载模型,读取 scalezero_point
    • 所有输入先量化:
      q_input = round(input / scale) + zero_point
      
    • 推理后输出再反量化:
      output = (q_output - zero_point) * scale
      

✅ 最终部署模型中包含内容:

内容 是否保留 说明
int8 权重 用于节省内存和加速运算
激活的 scale/zero_point 还原中间计算值
权重的 scale/zero_point 精确计算 int8 卷积或线性
原始 float32 权重 已舍弃

🧠 总结流程图:

训练模型
↓
校准数据 ➜ 模型前向推理
↓
收集激活 min/max
↓
计算 scale / zero_point
↓
float → int8 映射
↓
保存量化模型
↓
设备部署运行