Toybrick

有没有办法获得多输入 rknn 模型 input_list 的 shape

kkkaaa

中级会员

积分
203
楼主
发表于 2020-5-9 18:34:22    查看: 7278|回复: 7 | [复制链接]    打印 | 只看该作者
正在把 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

版主

积分
894
沙发
发表于 2020-5-9 20:07:02 | 只看该作者
把原始推理脚本和rknn推理脚本还有模型发出来。
回复

使用道具 举报

kkkaaa

中级会员

积分
203
板凳
 楼主| 发表于 2020-5-11 10:12:46 | 只看该作者
leok 发表于 2020-5-9 20:07
把原始推理脚本和rknn推理脚本还有模型发出来。

好的
直接回复貌似无法添加附件,我把脚本和每个脚本的功能贴在下楼
谢谢
回复

使用道具 举报

kkkaaa

中级会员

积分
203
地板
 楼主| 发表于 2020-5-11 10:21:08 | 只看该作者
本帖最后由 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

中级会员

积分
203
5#
 楼主| 发表于 2020-5-11 19:52:37 | 只看该作者
本帖最后由 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

版主

积分
894
6#
发表于 2020-5-12 17:44:00 | 只看该作者
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

中级会员

积分
203
7#
 楼主| 发表于 2020-5-12 20:15:49 | 只看该作者
leok 发表于 2020-5-12 17:44
mysterious_rknn_input_list = [rknn_input_list[1],
                                  rknn_input_lis ...

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

使用道具 举报

kkkaaa

中级会员

积分
203
8#
 楼主| 发表于 2020-5-13 14:43:16 | 只看该作者
leok 发表于 2020-5-12 17:44
mysterious_rknn_input_list = [rknn_input_list[1],
                                  rknn_input_lis ...

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

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表