一、引言
在工具链用户手册《量化感知训练(QAT)-开发指南-QConfig 详解》章节专门介绍了在 J6EM 上 qconfig 是怎么回事,从经历看,大家可能会存在看了依旧不懂,或懂了不知道怎么配置的情况,特别是一些 OE 包中示例没有的配置,例如固定某节点 scale、配置 linear weight int16 等操作。
qconfig 控制了模型所有节点的量化类型,例如是采用 int8 还是 int16 量化,是固定校准阶段的 scale 去 qat 还是不固定 scale 去 qat。
提供的模板可分为三类:基础模板、敏感度模板、自定义模板。本文将常见配置通过示例方式进行呈现。
二、基础模板
基础模板中 calibration / qat / qat_fixed_act_scale 区别在于使用的 observer 类型和 scale 更新逻辑,分别用于校准,不固定 activation scaleqat 训练,固定 activation scale qat 训练。
default 模板 ( default_calibration_qconfig_setter / default_qat_qconfig_setter / default_qat_fixed_act_qconfig_setter ) 会做三件事:
- 首先,将可以设置的高精度输出都设置上,对于不支持高精度的输出将给出提示;
- 然后,从 grid sample 算子的 grid 输入向前搜索,直到出现第一个 gemm 类算子或者 QuantStub,将中间的所有算子都设置为 int16。根据经验这里的 grid 一般表达范围较宽,int8 有较大可能不满足精度需求;
- 最后,将其余算子设置为 int8。
int16 模板 ( qat_8bit_weight_16bit_act_qconfig_setter / qat_8bit_weight_16bit_fixed_act_qconfig_setter / calibration_8bit_weight_16bit_act_qconfig_setter ) 会做两件事:
- 首先,将可以设置的高精度输出都设置上,对于不支持高精度的输出将给出提示;
- 其次,将其余算子设置为 int16。
from horizon_plugin_pytorch.quantization.qconfig_template import (
default_calibration_qconfig_setter,
default_qat_qconfig_setter,
default_qat_fixed_act_qconfig_setter,
qat_8bit_weight_16bit_act_qconfig_setter,
qat_8bit_weight_16bit_fixed_act_qconfig_setter,
calibration_8bit_weight_16bit_act_qconfig_setter,
)
qat_or_calib_model = prepare(
float_model,
example_inputs=example_inputs, # 用来感知图结构
qconfig_setter=(
default_qat_qconfig_setter, # 根据需要配置setter模板
),
)
三、敏感度模板
敏感度模板有三个:
sensitive_op_calibration_8bit_weight_16bit_act_qconfig_setter
sensitive_op_qat_8bit_weight_16bit_act_qconfig_setter
sensitive_op_qat_8bit_weight_16bit_fixed_act_qconfig_setter
三者的区别和基础模板中三者的区别类似,也是分别用于校准,不固定 activation scale qat 训练,固定 activation scale qat 训练。
敏感度模板的第一个输入是精度 debug 工具产生的敏感度结果,第二个参数可以指定 ratio 或 topk,敏感度模板会根据配置,将量化敏感度最高的 topk 个算子设置为 int16。搭配固定模板,可以实现混合精度调优。
若模型有多个输出,每个输出都会产生一个敏感度表,您可以设置多个敏感度模版。示例如下:
from horizon_plugin_pytorch.quantization.qconfig_template import (
default_calibration_qconfig_setter,
sensitive_op_qat_8

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



