Toybrick

标题: 有没有办法获得多输入 rknn 模型 input_list 的 shape [打印本页]

作者: kkkaaa    时间: 2020-5-9 18:34
标题: 有没有办法获得多输入 rknn 模型 input_list 的 shape
正在把 torch 模型 通过 torch->onnx->rknn 做转化
pytorch 模型的输入是一个 list, 由 5 个 tensor 组成,形状如下:
[(1, 64, 64, 64),  # 262144
(1, 64, 32, 32),  # 65536
(1, 64, 16, 16),  # 16384
(1, 64, 8, 8),  # 4096
(1, 64, 4, 4)]  # 1024


转换成 onnx 模型后可以正常推理,且输出一致

可以转换成 rknn 模型,但推理时报错如下:
--> Running model
W RKNNAPI: warning: inputs[0] expected input len is 16384, but actual len is 262144!
W RKNNAPI: warning: inputs[1] expected input len is 1024, but actual len is 65536!
E RKNNAPI: rknn_input_set,  inputs[2].buf wrong, buf = 0x2909b790, size = 65536 (min_size = 262144)!
E Catch exception when setting inputs.
E Traceback (most recent call last):
E   File "rknn/api/rknn_base.py", line 1109, in rknn.api.rknn_base.RKNNBase.inference
E   File "rknn/api/rknn_base.py", line 998, in rknn.api.rknn_base.RKNNBase.set_inputs
E   File "rknn/api/rknn_runtime.py", line 422, in rknn.api.rknn_runtime.RKNNRuntime.set_inputs
E Exception: Set inputs failed. error code: RKNN_ERR_PARAM_INVALID
Traceback (most recent call last):
  File "Regressor_experimanet_rknn_from_onnx_runtime.py", line 52, in <module>
    print('rknn_outputs length: ', len(rknn_outputs))
TypeError: object of type 'NoneType' has no len()


很显然 inputs[0], inputs[1], inputs[2] 的形状和pytorch 模型的输入形状不一致
而且如果给 rknn 模型传入一个 tensor 的话,还会报错说 inputs 需要有5个
所以有两个问题
1. 如何能得到 rknn 模型要求的输入的形状
2. 多输入的情况下, 如何满足 nhwc 的要求

谢谢
真的非常迷茫,研究转换好久了,还是一直有各种问题,不知道是不是方法不对。。。

作者: leok    时间: 2020-5-9 20:07
把原始推理脚本和rknn推理脚本还有模型发出来。
作者: kkkaaa    时间: 2020-5-11 10:12
leok 发表于 2020-5-9 20:07
把原始推理脚本和rknn推理脚本还有模型发出来。

好的
直接回复貌似无法添加附件,我把脚本和每个脚本的功能贴在下楼
谢谢
作者: kkkaaa    时间: 2020-5-11 10:21
本帖最后由 kkkaaa 于 2020-5-11 13:51 编辑
leok 发表于 2020-5-9 20:07
把原始推理脚本和rknn推理脚本还有模型发出来。

链接:https://pan.baidu.com/s/1_zpVA3A-0LkZS2wq02zLLg  密码:et87

regressor/Regressor_experimanet_rknn_from_onnx_runtime.py  -- 包含1)创建 pytorch 模型 2)用 pytorch 模型推理 3)从 pytorch 转 onnx 4)用 onnx 模型推理 5)转 rknn 模型

regressor/Regressor_torch2onnx2rknn_noquant.py -- 用转出的 rknn 模型做推理

-----------------------
另外我发现在板卡上跑,和在服务器上跑,是不一样的。
板卡上:
--> Running model
W RKNNAPI: warning: inputs[0] expected input len is 16384, but actual len is 262144!
W RKNNAPI: warning: inputs[1] expected input len is 1024, but actual len is 65536!
E RKNNAPI: rknn_input_set,  inputs[2].buf wrong, buf = 0xf8d37a0, size = 65536 (min_size = 1048576)!
E Catch exception when setting inputs.
E Traceback (most recent call last):
E   File "rknn/api/rknn_base.py", line 1109, in rknn.api.rknn_base.RKNNBase.inference
E   File "rknn/api/rknn_base.py", line 998, in rknn.api.rknn_base.RKNNBase.set_inputs
E   File "rknn/api/rknn_runtime.py", line 422, in rknn.api.rknn_runtime.RKNNRuntime.set_inputs
E Exception: Set inputs failed. error code: RKNN_ERR_PARAM_INVALID
Traceback (most recent call last):
  File "Regressor_experimanet_rknn_from_onnx_runtime.py", line 50, in <module>
    print('rknn_outputs length: ', len(rknn_outputs))
TypeError: object of type 'NoneType' has no len()

服务器上:
done
--> Init runtime environment
done
--> Running model
W [rknn_inputs_set:1272] warning: inputs[0] expected input len is 16384, but actual len is 262144!
W [rknn_inputs_set:1272] warning: inputs[1] expected input len is 1024, but actual len is 65536!
W [rknn_inputs_set:1272] warning: inputs[2] expected input len is 262144, but actual len is 16384!
W [rknn_inputs_set:1272] warning: inputs[3] expected input len is 65536, but actual len is 4096!
W [rknn_inputs_set:1272] warning: inputs[4] expected input len is 4096, but actual len is 1024!
rknn_outputs length:  1
(1, 49104, 4)
done

服务器上居然能推理出结果更新:
服务器上,rknn模型虽然能给出推理结果,但是与 torch/onnx 模型的推理结果差距很大,element-wise 最大差:3199.9265
---------------------
希望能指点一下,非常感谢

作者: kkkaaa    时间: 2020-5-11 19:52
本帖最后由 kkkaaa 于 2020-5-11 20:49 编辑
leok 发表于 2020-5-9 20:07
把原始推理脚本和rknn推理脚本还有模型发出来。

另外,我看到了帖子 http://t.rock-chips.com/forum.ph ... 1308&extra=page%3D9

这个帖子也有说 pytorch-onnx-rknn 的时候多输入顺序会乱

另外,我试了 pytorch 直接转 rknn, 可以正常推理,而且 cos 距离在1e-7, 应该是没有问题
再补充一点,
这个模型中有另一部分用 pytorch->rknn 转化不成功,用pytorch->onnx->rknn 成功。所以还是得用 pytorch->onnx->rknn 这条路线,但是现在看起来 onnx->rknn 有点问题。。。我发现的另一个 onnx->rknn 的问题在这个帖子:http://t.rock-chips.com/forum.ph ... 1562&extra=page%3D1 麻烦也看一下 谢谢



作者: leok    时间: 2020-5-12 17:44
kkkaaa 发表于 2020-5-11 19:52
另外,我看到了帖子 http://t.rock-chips.com/forum.ph ... 1308&extra=page%3D9

这个帖子也有说 pytorch ...

mysterious_rknn_input_list = [rknn_input_list[1],
                                  rknn_input_list[4],
                                  rknn_input_list[3],
                                  rknn_input_list[2],
                                  rknn_input_list[0]]
rknn_outputs = rknn.inference(inputs=mysterious_rknn_input_list)

试试。
作者: kkkaaa    时间: 2020-5-12 20:15
leok 发表于 2020-5-12 17:44
mysterious_rknn_input_list = [rknn_input_list[1],
                                  rknn_input_lis ...

嗯嗯 试过了,而且调换顺序后pytorch 和 rknn 输出的张量cos 距离很小

作者: kkkaaa    时间: 2020-5-13 14:43
leok 发表于 2020-5-12 17:44
mysterious_rknn_input_list = [rknn_input_list[1],
                                  rknn_input_lis ...

但是 onnx->rknn 的问题还是存在的,因为
1. 每次跑这个流程,扰乱后的输入的顺序都不一样
2. 这一部分网络是更大的网络的一部分,无法通过手动调整顺序解决这个问题

不知道有没有办法从根源上解决 onnx -> rknn 的问题呢?谢谢




欢迎光临 Toybrick (https://t.rock-chips.com/) Powered by Discuz! X3.3