1. 背景
新旧 qconfig 模板在 int16 节点配置上存在一些差异,本文将详细分析新旧 qconfig 模板在 int16 节点配置上的区别。
2. 新旧qconfig配置int16差异
在旧模板中,如果配置 conv1-module 输出为 int16,则 conv2-module 与 conv3-module 的输入都会被自动配置为 int16。这种自动传导机制简化了配置,但缺乏灵活性。

随着功能变化,特别是浮点 (fp) 计算的引入和对性能的极致把控需求,新版 qconfig 模板对这种逻辑进行了修改,允许对 "input"、"output"、"weight"、"activation" 进行精准控制。
无论新旧 qconfig 模板,如果 conv1 输出 激活敏感 ,则会按照 conv1-output、conv2-input、conv3-input 均为 int16 的方式配置。具体来说,当使用敏感度模板 (SensitivityTemplate) 配置时,设置 conv1 output 为 int16,则 conv2 和 conv3 输入也会自动变为 int16。
2.1 SensitivityTemplate示例
SensitivityTemplate 用于通过量化敏感度表提升算子类型精度,将敏感算子配置为 int16,支持激活敏感和 weight 敏感算子分别配置int16。
对于旧模板中手动配置 "某 op" 输出 int16 的场景,在新模板中需要使用 SensitivityTemplate 来替代实现相同效果。新模板下使用方式如下图

可运行的代码示例如下:
2.2 ModuleNameTemplate示例
ModuleNameTemplate 主要针对 module 的 input/output/weight 进行配置,注意module input/output 和 activation 不是一回事。示例如下

注意:虽然越往后优先级越高,但示例中backbone.conv1的output依旧为int8。这是因为在ConvDtypeTemplate中有配置conv的input为int8,从工具角度看,conv2的输入是int8就够了,那么conv1输出配置为int8也应该行。这和上面介绍的激活敏感是两码事。

全流程示例代码如下:
