本文基于 horizon_plugin_pytorch 量化工具链,详细介绍多输出网络的量化配置策略、HistogramObserver使用、混合精度设置及校准流程。
1. 模型结构设计
1.1 多输出网络示例
1.2 关键设计说明
组件 | 作用 |
|---|---|
QuantStub | 量化入口,将FP32输入转换为量化域 |
DeQuantStub | 量化出口,将量化值还原为FP32输出 |
多 DeQuantStub | 多输出网络需为每个输出配置独立的反量化节点 |
2. QConfig配置策略
2.1 Observer选择建议
推荐使用 HistogramObserver,原因如下:
特性 | MinMaxObserver | HistogramObserver |
|---|---|---|
统计方式 | 仅记录min/max | 构建完整直方图 |
分布感知 | 否 | 是(完整分布) |
多方法支持 | 否 | 是(mse/percentile/kl等) |
离群值处理 | 敏感 | 自动处理 |
核心优势:HistogramObserver 将收集与计算分离,在不改变网络结构/权重/校准数据,一次校准后可通过 reset_scale 切换不同计算方法,无需重新跑校准。
2.2 配置示例:激活HistogramObserver + 权重MinMaxObserver
适用场景:常规量化任务,权重分布稳定用MinMaxObserver即可,激活分布复杂用HistogramObserver精细处理。
注意:根据敏感节点配置int16时,无需重新校准!权重channel min/max会被记录下来、直方图信息也会被记录下来。
3. QconfigSetter与Template配置
3.1 完整QconfigSetter配置
3.2 Template执行顺序与优先级
3.3 SensitivityTemplate参数说明
4. 校准流程详解
4.1 标准校准流程
4.2 FakeQuantState状态说明
状态 | 作用 | 适用阶段 |
|---|---|---|
CALIBRATION | 统计激活分布,不进行伪量化 | 校准阶段 |
VALIDATION | 启用伪量化,模拟量化推理 | 验证/导出阶段 |
QAT | 启用伪量化,支持梯度回传 | QAT训练阶段 |
5. HistogramObserver高级用法
5.1 校准后切换计算方法
HistogramObserver 的核心优势:校准后可切换不同计算方法,无需重新跑校准数据。
重要提示:通过 reset_scale 重新计算 scale 后,scale 会保存在 state_dict 中。如果需要保存量化模型,请在 scale 更新后重新保存 state_dict:
5.2 支持的计算方法
方法 | 说明 | 适用场景 |
|---|---|---|
mse | 最小化量化误差 | 正态分布,默认推荐 |
percentile | 百分位截断 | 长尾分布、存在离群值 |
kl | 最小化KL散度 | 分布差异敏感场景 |
5.3 方法对比实验
6. 混合精度配置
重要提示:reset_dtype 会修改 dtype/scale,修改后需要重新保存 state_dict:
6.1 整个模块配置int16
6.2 单个节点配置int16
7. 完整可运行示例
7.1 示例:激活HistogramObserver + 权重MinMaxObserver
7.2. 常见问题与解决方案
Q1: AttributeError: 'NoneType' object has no attribute 'reset_dtype'
原因:部分模块(如ReLU、BatchNorm)的 activation_post_process 为 None。
解决:
Q2: 敏感节点配置未生效
原因:Template优先级问题,或节点名称不匹配。
解决:
Q3: HistogramObserver无需重复校准?
分析:在浮点结构/权重未修改、校准数据相同的情况下,无需重复校准
使用方法:使用HistogramObserver激活+MinMaxObserver权重
使用方法:使用HistogramObserver激活+MinMaxObserver权重
校准后通过reset_scale尝试不同方法
校准后通过reset_dtype配置敏感int16
8. 总结
本文系统介绍了J6平台的量化配置与校准流程:
阶段 | 关键配置 |
|---|---|
QConfig | HistogramObserver推荐 |
QconfigSetter | Template优先级、SensitivityTemplate |
校准流程 | CALIBRATION -> forward -> reset_scale -> VALIDATION -> export |
混合精度 | reset_dtype批量/单节点配置 int16,无需重新校准 |
推荐实践:
校准阶段优先使用 HistogramObserver
- 利用 reset_scale 对比不同计算方法(mse/percentile/kl)
- 敏感节点使用 reset_dtype 配置int16
