前言:
值得注意的是,只有J5工具链支持PTQ设置Int16量化的功能,接下来本文将介绍如何在PTQ过程中设置部分节点为Int16量化来进行模型的精度调优。
一、选取Int16量化节点
此外我们还提供了3个使用示例帮助您快速上手这个工具,可以查看如下社区文章:
二、开启Int16量化功能
1、配置模型尾部节点输出Int16
支持配置YAML文件中校准参数组的参数optimization,使模型尾部节点以Int16精度输出,如下:
配置完成后可以在输出的“hb_mapper_makertbin.log”文件中验证查看,如下,红框标示的内容表示:输入该节点的数据类型/输出该节点的数据类型。

2、配置单个节点输入输出Int16
支持配置单个节点的输入或者输出采用Int16量化,其中NodeName表示节点名称,多输入的节点支持指定单个输入采用Int16量化(InputType0表示第1个输入,依次类推),多输出的节点不支持指定单个输出的精度,如下:
这里涉及判断输入的次序,方法为在Netron可视化下点开对应节点,在INPUTS栏从上往下数,分别为InputType0、InputType1、......。如下所示:
多输入节点输入顺序配置完成后也可以通过Netron可视化查看model_output路径下生成的calibrated_model和quantized_model来验证配置是否成功:
- calibrated_model
配置“Conv_41”节点输出为Int16前:
配置“Conv_41”节点输出为Int16后:
- quantized_model
配置“Conv_41”节点输出为Int16前:
配置“Conv_41”节点输出为Int16后:
3、配置同类型节点输入输出Int16
此功能仅在OpenExplorer V1.1.62及其之后版本支持。
配置完成后可以在输出的“hb_mapper_makertbin.log”文件中验证查看,配置Conv类型节点输入输出Int16量化前:

配置Conv类型节点输入输出Int16量化后:

三、精度和性能的权衡
如前言部分提到的那样,相比于Int8量化,设置Int16量化能够调优模型精度,但是不可避免地会牺牲模型的性能,体现在FPS的下降。以MobileNetV2在bayes架构下采用O3编译,horizon-nn==0.19.3为例,量化精度损失 = (原浮点模型精度 - 量化后的定点模型精度) / 原浮点模型精度:
量化方式 | FPS | 量化精度损失 |
|---|---|---|
Int8 | 单核:1791.62 | 1.18% |
部分Int16 | 单核:1674.85 | 0.87% |
模型做部分Int16的配置如下:
上述配置仅作为示例,用户可以自己尝试不同的配置来体会Int16量化对模型精度和性能的影响。在实际开发中,需要用户结合第一部分提及的精度Debug工具合理地选择需要进行Int16量化的节点,以达到模型精度和性能的平衡。
总结
通过本文的讲解,相信读者对于如何在后量化中开启Int16量化功能以及Int16量化对于模型性能和精度上的影响有了较为清晰的认识。在实际操作中,还需结合精度Debug工具给出的算子量化余弦相似度等相关信息,以达到合理选择Int16算子的目的,从而能使模型在后量化中取得性能和精度的平衡。
