1. 常规情况
基础知识:
考虑到模型输出位置量化损失对模型精度的影响较大,工具链推荐模型以linear/conv结尾,此时支持高精度int32输出(在quantized.onnx中,转定点为int32,在前面calib+qat阶段都是float32),这几乎可以做到无损。
J6工具链量化setter模板支持自动设置高精度输出,前提是conv输出直接 接dequant,不作为其他node的输入。
输出位置结构示意图:

全流程代码如下:
查看quantized.onnx,可以看到最后一个conv确实是int32高精度输出

2. 输出又输入
如果conv1,既作为模型输出,又作为后续conv2的输入,此时应该怎么办?

关键代码如下:
注意,y_out = self.dequant(y)是必须要添加的,否则无法实现该效果。
全流程代码如下:
查看quantized.onnx,linear2符合预期,确实是int32高精度输出。

新加入的dequant与quant会变成rescale

以上是J6EM的默认做法,如果使用的是J6PH,conv like算子输出直接就是float32,在既作为输出,又作为下一阶段输入时,会存在vpu的quantize(float32->int16/int8),如下图所示

如果想依旧沿用J6EM的方式,可进行如下配置:
具体选择哪种方式可实测latency(建议考虑将模型conv like算子c++反量化的耗时减少也加进去对比)
