rockchip-linux / rknn-toolkit

BSD 3-Clause "New" or "Revised" License
771 stars 175 forks source link

分割模型量化精度损失大 #435

Open steven-spec opened 5 months ago

steven-spec commented 5 months ago

使用smp(https://github.com/qubvel/segmentation_models.pytorch/tree/v0.0.1),训练的模型使用rknn-toolkit转rknn时量化精确度损失大(使用rknn-toolkit2量化精度损失很小每层都0.999以上),测试了很多量化配置 量化环境:rknn_toolkit1.7.3 1、mmse 量化精度损失小于0.97的也有二十几层 2、使用mmse混合量化将精度损失小于0.97的层设置为i16类型量化,精度损失基本满足检测需求,但是推理时间过长单张图需要200ms左右 3、使用normal-i16 检测结果满足要求,推理时间过长300ms左右 其他几种量化配置精度损失也很大 mmse-opt3.txt mmse-混合i16.txt normal-i16.txt normal-u8.txt normal-混合量化i16.txt

这是量化图 quant_table.zip 这是onnx模型 链接:https://pan.baidu.com/s/1iHVMoza7sdxHolFoaKuSZQ 提取码:kqdv 量化配置: rknn.config(mean_values=[[123.675, 116.28, 103.53]], std_values=[[58.395, 57.12, 57.375]], reorder_channel='2 1 0') 请问有什么方法能让量化精度损失提高且推理时间和normal-u8(60ms左右)的时间差不多么

steven-spec commented 5 months ago

error_analysis.txt 这是rknn-toolkit2量化精度损失

steven-spec commented 5 months ago

@airockchip

eRaul commented 4 months ago

rknpu2支持per-channel的量化方式,这种量化方式可以在通道维度上对量化参数做更精细的控制,但rknpu1没有这个功能。 建议做QAT训练,可能可以解决你提到的问题。

steven-spec commented 4 months ago

rknpu2支持per-channel的量化方式,这种量化方式可以在通道维度上对量化参数做更精细的控制,但rknpu1没有这个功能。 建议做QAT训练,可能可以解决你提到的问题。

谢谢! 我试了用quantize_fx做qat量化,在之前未使用qat训练得到pth的基础上再训练了几十个epoch然后得到一个qat模型,模型大小比未使用qat的小的很多,但是用来做推理预测结果不对。我之前没有用过qat,不知道是没用对还是训练次数太少了

steven-spec commented 4 months ago

rknpu2支持per-channel的量化方式,这种量化方式可以在通道维度上对量化参数做更精细的控制,但rknpu1没有这个功能。 建议做QAT训练,可能可以解决你提到的问题。 QAT.zip 这是我的qat训练代码,能麻烦你看下写对了么,之前没用过qat, 谢谢!