1. 引言
在工具链用户手册《量化感知训练(QAT)-开发指南-QConfig详解》章节专门介绍了在J6EM上 qconfig是怎么回事,从经历看,大家可能会存在看了依旧不懂,或懂了不知道怎么配置的情况,特别是一些OE包中示例没有的配置,例如固定某节点scale、配置linear weight int16等操作。
qconfig控制了模型所有节点的量化类型,例如是采用int8还是int16量化,是固定校准阶段的scale去qat还是不固定scale去qat。
提供的模板可分为三类:基础模板、敏感度模板、自定义模板。本文将常见配置通过示例方式进行呈现。
2. 基础模板
基础模板中 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。
3. 敏感度模板
敏感度模板有三个:
三者的区别和基础模板中三者的区别类似,也是分别用于校准,不固定activation scale qat 训练,固定 activation scale qat 训练。
敏感度模板的第一个输入是精度 debug 工具产生的敏感度结果,第二个参数可以指定 ratio 或 topk,敏感度模板会根据配置,将量化敏感度最高的 topk 个算子设置为 int16。搭配固定模板,可以实现混合精度调优。
若模型有多个输出,每个输出都会产生一个敏感度表,您可以设置多个敏感度模版。示例如下:
4. 自定义模板
自定义模板为 ModuleNameQconfigSetter,需要传入模块名和对应自定义的 qconfig,一般用于设置 fixed scale、配置linear weight int16等特殊需求,可以和固定模板,敏感度模板搭配使用。示例如下:
放在一块简单示例如下:
5. 可运行的示例
将网络中linear2的weight配置为int16量化、输入配置为int8量化、输出配置为int16量化,其他算子激活使用int16量化,weight使用int8量化。
配置add单算子输入和输出均使用固定scale
6. 冻结部分网络结构qat的配置
补充常见冻结网络结构,去进行qat的做法

