一个关于量化模型神奇的事儿

我这里设计了一个双输入双输出的分割模型(一些特殊识别需求),要部署在 RKNN 平台上。这个模型是基于 mobilenetv3 做为backbone 开发的。 这没什么问题,问题出现在量化上。 因为训练很慢,为了快速验证,我拿第一个epoch 来走流程,去验证模型是否可以部署在 rknn 开发板上。...
一个关于量化模型神奇的事儿
一个关于量化模型神奇的事儿

我这里设计了一个双输入双输出的分割模型(一些特殊识别需求),要部署在 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 位参与者

阅读完整话题

来源: linux.do查看原文