专栏算法工具链【J6】J6EM常见qconfig配置解读与示例

【J6】J6EM常见qconfig配置解读与示例

Jade-self2025-04-04
175
0

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的做法

算法工具链
社区征文征程6杂谈技术深度解析
评论0
0/1000