我这里设计了一个双输入双输出的分割模型(一些特殊识别需求),要部署在 RKNN 平台上。这个模型是基于 mobilenetv3 做为backbone 开发的。
这没什么问题,问题出现在量化上。
因为训练很慢,为了快速验证,我拿第一个epoch 来走流程,去验证模型是否可以部署在 rknn 开发板上。
顺序是: pytorch -> onnx -> rknn
在 onnx 转 rknn 的时候,没有任何错误,理论上,按之前的一些经验,没错误基本上没太大的问题,但是为了验证是否对齐,写了一个onnx 和rknn 的对比脚本,也没什么问题:
热力图对比:
ONNX 范围: [0.2439, 0.5265]
RKNN 范围: [0.2369, 0.5236]
平均误差 (MAE): 0.0055
最大误差: 0.1145
分类概率对比:
ONNX prob: 0.5925
RKNN prob: 0.5729
误差: 0.0197
ONNX 判断: 有变化
RKNN 判断: 有变化
理论上这样就比较完美了。
但是诡异的事来了,当训练收敛后,用最好的权重再走一次流程发现:
热力图对比:
ONNX 范围: [0.0000, 0.9991]
RKNN 范围: [0.0000, 0.0291]
平均误差 (MAE): 0.0609
最大误差: 0.9991
分类概率对比:
ONNX prob: 0.9935
RKNN prob: 0.0039
误差: 0.9896
ONNX 判断: 有变化
RKNN 判断: 无变化
✗ 分类判断不一致!
⚠ 热力图精度一般 (MAE < 0.1)
What the *?
流程一模一样,没有任何错误,怎么拿收敛的权重量化就给我干成全是0了?
于是经过漫长的排查,换了好些个大模型给我排查,也没排查出来到底是什么问题。基于模型改了N个方案也还是没解决。
没办法,由于转换日志没有任何错误,只能通过日志一行一行地把警告消除。
直到。。。。。
"W tensor @Relu_/enc3/enc3.1/block/block.2/activation_1/Relu_136:out0 seems to be always 0"
???
???
???
特么的总是 0 ???
这个模块是 mobilenet v3 内部的模块。目前不确定是不是这个问题,但是真的把我搞累了。
先把mobilenet v3 换了先,再走一次来时路。
1 个帖子 - 1 位参与者