Toybrick

标题: pytorch模型转换问题 [打印本页]

作者: wujialiang    时间: 2020-2-14 15:43
标题: pytorch模型转换问题
使用rknn-toolkit-v1.3.0\examples\pytorch例子转换pytorch模型失败,具体日志如下:
root@169b24048060:/examples/pytorch/resnet18# python test.py
--> config model
done
--> Loading model
/usr/local/lib/python3.5/dist-packages/onnx_tf/common/init.py:87: UserWarning: FrontendHandler.get_outputs_names is deprecated. It will be removed in future release.. Use node.outputs instead.
warnings.warn(message)
./resnet18.pt ********************
WARNING: Token 'COMMENT' defined, but not used
WARNING: There is 1 unused token
Syntax error in input! LexToken(NAMED_IDENTIFIER,'None',5,263)
done
--> Building model
W Genreate input meta fail, please check model.
W External input meta file "/tmp/tmp6iu3la8h/resnet18_inputmeta.yml" is not exists.
Traceback (most recent call last):
File "test.py", line 66, in
ret = rknn.build(do_quantization=True, dataset='./dataset.txt')
File "/usr/local/lib/python3.5/dist-packages/rknn/api/rknn.py", line 238, in build
ret = self.rknn_base.build(do_quantization=do_quantization, dataset=dataset, pack_vdata=pre_compile, batch_size=rknn_batch_size)
File "rknn/api/rknn_base.py", line 719, in rknn.api.rknn_base.RKNNBase.build
File "rknn/api/rknn_base.py", line 2249, in rknn.api.rknn_base.RKNNBase._generate_inputmeta
IndexError: list index out of range
请问是什么问题?谢谢


作者: jefferyzhang    时间: 2020-2-14 16:00
看log这里已经报错了,研究下你的模型这里是什么意思:
Syntax error in input! LexToken(NAMED_IDENTIFIER,'None',5,263)

作者: wujialiang    时间: 2020-2-14 16:06
jefferyzhang 发表于 2020-2-14 16:00
看log这里已经报错了,研究下你的模型这里是什么意思:
Syntax error in input! LexToken(NAMED_IDENTIFIER ...

这个demo,你们有能跑成功吗?里面的代码都没有修改过哦,模型也是按代码的地址下载下来的
作者: jefferyzhang    时间: 2020-2-14 16:08
NPU部门回复如下:

这个应该是pytorch版本问题。
我们建议pytorch使用1.2.0版本,我们的测试都是基于1.2.0来做的,高版本有可能会出现一些未知的错误。
作者: wujialiang    时间: 2020-2-14 16:18
jefferyzhang 发表于 2020-2-14 16:08
NPU部门回复如下:

这个应该是pytorch版本问题。

ok,我先试一下。
torchvision的版本呢?
作者: jefferyzhang    时间: 2020-2-14 16:31
wujialiang 发表于 2020-2-14 16:18
ok,我先试一下。
torchvision的版本呢?

torchvision跟模型无关吧?
作者: wujialiang    时间: 2020-2-14 17:17
jefferyzhang 发表于 2020-2-14 16:31
torchvision跟模型无关吧?

什么时候rknnAPI可以在rk1808上支持c++直接使用pytorch的模型?目前我使用的detectron2训练的mask rcnn 的模型转换不了
作者: jefferyzhang    时间: 2020-2-14 17:23
wujialiang 发表于 2020-2-14 17:17
什么时候rknnAPI可以在rk1808上支持c++直接使用pytorch的模型?目前我使用的detectron2训练的mask rcnn  ...

这个你问反了,得去问pytorch官方啥时候支持我们NPU。
我们不可能把全世界框架都改一遍支持我们NPU,然后还得跟着他们更新去更新。。。
作者: wujialiang    时间: 2020-2-16 17:43
jefferyzhang 发表于 2020-2-14 17:23
这个你问反了,得去问pytorch官方啥时候支持我们NPU。
我们不可能把全世界框架都改一遍支持我们NPU,然后 ...

我的意思是,为什么在pc上的rknn-toolkit1.3可以直接支持pytorch或者tensorflow的模型直接载入,然后再rknnapi的c的api上却不支持呢?要先转成rknn格式的,发现不是所有模型都能顺利做转换
作者: jefferyzhang    时间: 2020-2-16 19:42
wujialiang 发表于 2020-2-16 17:43
我的意思是,为什么在pc上的rknn-toolkit1.3可以直接支持pytorch或者tensorflow的模型直接载入,然后再rk ...

rknn-toolkit存在的目的就是倒入其他格式模型,转换成rknn。
rknn-toolkit pc版和arm版功能几乎是一样的,开发版上也有rknntoolkit。
rknnapi是c的推理引擎库,相互关系请看基础教程。

能不能转换成功要看不同格式模型的op,op一直在更新,NPU那边也很难做,但是我们开放了自定义OP功能,所有因为op不支持而无法转换的模型都是可以通过你自定义op来实现转换的。具体请参看下文档说明。
作者: wujialiang    时间: 2020-2-17 11:06
jefferyzhang 发表于 2020-2-16 19:42
rknn-toolkit存在的目的就是倒入其他格式模型,转换成rknn。
rknn-toolkit pc版和arm版功能几乎是一样的 ...

这个目前对我来说难度比较高,我也不断在研究。
请问您们是否有 tensorflow或者pytorch框架maskRcnn的模型转换方案和demo呢?
作者: wujialiang    时间: 2020-2-17 17:01
jefferyzhang 发表于 2020-2-16 19:42
rknn-toolkit存在的目的就是倒入其他格式模型,转换成rknn。
rknn-toolkit pc版和arm版功能几乎是一样的 ...

请问可以帮我确定一下tensorflow下预训练的mask_rcnn_inception_v2_coco模型的input和output节点吗?
作者: xsky    时间: 2020-2-20 20:43
本帖最后由 xsky 于 2020-2-21 09:48 编辑
jefferyzhang 发表于 2020-2-14 16:00
看log这里已经报错了,研究下你的模型这里是什么意思:
Syntax error in input! LexToken(NAMED_IDENTIFIER ...

RKNN v1.3, Pytorch v1.2

只一个FC层,使用.load_pytorch载入也是出现这样的错误,该从哪分析

  1. import torch
  2. import numpy as np

  3. from rknn.api import RKNN

  4. if __name__ == '__main__':

  5.     ic = 128
  6.     oc = 128
  7.     m = torch.nn.Linear(ic, oc)
  8.     m.eval()
  9.     m.float()

  10.     x = torch.full((1, ic), fill_value=0.1, dtype=torch.float)
  11.     pt = torch.jit.trace(m, x)
  12.     pt_file = "fc{128x128}.pt"

  13.     rknn = RKNN(verbose=True)
  14.     rknn.config(batch_size=1, channel_mean_value='0 0 0 1', reorder_channel='0 1 2',
  15.                 epochs=1)  # asymmetric_quantized-u8,  quantized_dtype='dynamic_fixed_point-16'

  16.     rknn_file = pt_file + '.rknn'
  17.     pt.save(pt_file)
  18.     rknn.load_pytorch(model=pt_file, input_size_list=[[1, ic]])

  19.     onnx_file = pt_file + '.onnx'
  20.     # torch.onnx.export(m, x, onnx_file,
  21.     #                   export_params=True,  # store the trained parameter weights inside the model file
  22.     #                   # do_constant_folding=True,  # whether to execute constant folding for optimization
  23.     #                   opset_version=9,  # the ONNX version to export the model to
  24.     #                   input_names=['input'],  # the model's input names
  25.     #                   output_names=['output']  # the model's output names
  26.     #                   # dynamic_axes={'input' : {0 : 'batch_size'},    # variable lenght axes
  27.     #                   #              'output' : {0 : 'batch_size'}}
  28.     #                   )
  29.     # rknn.load_onnx(model=onnx_file)

  30.     ret = rknn.build(do_quantization=False, dataset='./dataset.txt')
  31.     rknn.export_rknn(rknn_file)

  32.     rknn.release()
复制代码

代码中,如果导出.onnx,再load_onnx是可以正常build的,load_pytorch后bulid报错和楼主应该是一样的消息
  1. fc{128x128}.pt ********************
  2. WARNING: Token 'COMMENT' defined, but not used
  3. WARNING: There is 1 unused token
  4. !!!!! Illegal character '"'
  5. Syntax error in input! LexToken(NAMED_IDENTIFIER,'fc',1,27)
  6. !!!!! Illegal character '"'
  7. D import clients finished
  8. 2020-02-20 20:40:13.391282: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
  9. I Build fc{128x128} complete.
  10. D Optimizing network with force_1d_tensor, swapper, merge_layer, auto_fill_bn, resize_nearest_transformer, auto_fill_multiply, merge_avgpool_conv1x1, auto_fill_zero_bias, proposal_opt_import
  11. D Optimizing network with conv2d_big_kernel_size_transform
  12. W Genreate input meta fail, please check model.
  13. W External input meta file "C:\Users\dm\AppData\Local\Temp\tmpyqrr_3bz\fc128x128_inputmeta.yml" is not exists.
  14. Traceback (most recent call last):
  15.   File "E:/Work/_Code/dmax/test/lstm/fc.py", line 39, in <module>
  16.     ret = rknn.build(do_quantization=False, dataset='./dataset.txt')
  17.   File "D:\Program Files\Python\Python36\lib\site-packages\rknn\api\rknn.py", line 238, in build
  18.     ret = self.rknn_base.build(do_quantization=do_quantization, dataset=dataset, pack_vdata=pre_compile, batch_size=rknn_batch_size)
  19.   File "rknn\api\rknn_base.py", line 719, in rknn.api.rknn_base.RKNNBase.build
  20.   File "rknn\api\rknn_base.py", line 2249, in rknn.api.rknn_base.RKNNBase._generate_inputmeta
  21. IndexError: list index out of range
复制代码
load_pytorch没报错,在build时报的错:
W Genreate input meta fail, please check model.
W External input meta file "C:\Users\dm\AppData\Local\Temp\tmpszyfyeur\lstm1414_inputmeta.yml" is not exists.


rknn.config 中的参数  channel_mean_value='0 0 0 1', reorder_channel='0 1 2'  是三通道的,如果像这个,输入只是一个向量的,这里该怎么设置, channel_mean_value='0 0 1', reorder_channel='0 1 ' 么?但这里即便按chw三个维度设置,fc的输入输出均是[1,x]向量,onnx格式也能正常导出rknn。


作者: jefferyzhang    时间: 2020-2-21 08:42
xsky 发表于 2020-2-20 20:43
RKNN v1.3, Pytorch v1.2

只一个FC层,使用.load_pytorch载入也是出现这样的错误,该从哪分析

这个问题我报告给NPU部门了,等他们答复我会回你
作者: xsky    时间: 2020-2-21 09:48
jefferyzhang 发表于 2020-2-21 08:42
这个问题我报告给NPU部门了,等他们答复我会回你

好的谢谢啊
作者: jefferyzhang    时间: 2020-2-22 16:19
xsky 发表于 2020-2-21 09:48
好的谢谢啊

NPU部门回复:
pytorch模型必须继承自torch.nn.Module,1个fc层的pytorch示例可以参考test.py:

  1. import torch

  2. from rknn.api import RKNN

  3. import numpy as np

  4. def export_pytorch_model():

  5.     class MyNet(torch.nn.Module):
  6.         def __init__(self):
  7.             super(MyNet, self).__init__()
  8.             self.fc = torch.nn.Linear(224*224, 10)

  9.         def forward(self, x):
  10.             x = x.view(1,-1)
  11.             return self.fc(x)

  12.     net = MyNet()
  13.     dummy_input = torch.randn([1, 1, 224, 224])

  14.     trace_model = torch.jit.trace(net, dummy_input)
  15.     pt_save_path = './test.pt'
  16.     trace_model.save(pt_save_path)

  17.     return pt_save_path


  18. if __name__ == '__main__':

  19.     pt_model = export_pytorch_model()
  20.     input_size_list = [[1, 224, 224]]

  21.     # Create RKNN object
  22.     rknn = RKNN()

  23.     # pre-process config
  24.     print('--> config model')
  25.     rknn.config(channel_mean_value='0 1', reorder_channel='0 1 2')
  26.     print('done')

  27.     # Load pytorch model
  28.     print('--> Loading model')
  29.     ret = rknn.load_pytorch(model=pt_model, input_size_list=input_size_list)
  30.     if ret != 0:
  31.         print('Load pytorch model failed!')
  32.         exit(ret)
  33.     print('done')

  34.     # Build model
  35.     print('--> Building model')
  36.     ret = rknn.build(do_quantization=False, dataset='./dataset.txt')
  37.     if ret != 0:
  38.         print('Build pytorch failed!')
  39.         exit(ret)
  40.     print('done')

  41.     # Set inputs
  42.     img = np.random.randn(224,224,1).astype(np.float32)

  43.     # init runtime environment
  44.     print('--> Init runtime environment')
  45.     ret = rknn.init_runtime()
  46.     if ret != 0:
  47.         print('Init runtime environment failed')
  48.         exit(ret)
  49.     print('done')

  50.     # Inference
  51.     print('--> Running model')
  52.     outputs = rknn.inference(inputs=[img])
  53.     print('rknn output:')
  54.     print(outputs[0])

  55.     # pytorch inference
  56.     pt_i = np.expand_dims(img, axis=0)
  57.     pt_i = np.transpose(pt_i, [0,3,1,2])
  58.     pt_i = torch.from_numpy(pt_i)
  59.     model = torch.jit.load(pt_model)
  60.     pt_o = model(pt_i).detach().numpy()
  61.     print('pytorch output:')
  62.     print(pt_o)

复制代码


作者: xsky    时间: 2020-2-22 22:43
jefferyzhang 发表于 2020-2-22 16:19
NPU部门回复:
pytorch模型必须继承自torch.nn.Module,1个fc层的pytorch示例可以参考test.py:

好的谢谢,我试下
作者: rlgl    时间: 2020-4-2 17:54
jefferyzhang 发表于 2020-2-14 16:08
NPU部门回复如下:

这个应该是pytorch版本问题。

你好,请问rknn_toolkit_v1.3.0支持pytorch中的nn.pixelshuffle()模块吗,我的pytorch模型中包括该模块,rknn.load_pytorch报"aten::pixel_shuffle"


作者: jefferyzhang    时间: 2020-4-2 18:02
rlgl 发表于 2020-4-2 17:54
你好,请问rknn_toolkit_v1.3.0支持pytorch中的nn.pixelshuffle()模块吗,我的pytorch模型中包括该模块,r ...

pytorch1.2
如果转换报错,那就是那个op不支持,可以把模型和转换脚本发给我们,
NPU部门是会慢慢去支持的,急的话自己可以写自定义OP来支持的。
详细参看文档
作者: rlgl    时间: 2020-4-3 09:15
jefferyzhang 发表于 2020-4-2 18:02
pytorch1.2
如果转换报错,那就是那个op不支持,可以把模型和转换脚本发给我们,
NPU部门是会慢慢去支持 ...

怎么发给你们呢,这个模型的构建代码比较复杂,我今天先自己重新构建下,把代码搞简单点,然后发给您看看
作者: jefferyzhang    时间: 2020-4-3 09:27
rlgl 发表于 2020-4-3 09:15
怎么发给你们呢,这个模型的构建代码比较复杂,我今天先自己重新构建下,把代码搞简单点,然后发给您看看 ...

原始模型+你写的转换脚本,打包放到百度网盘,发链接给我
作者: rlgl    时间: 2020-4-3 11:36
jefferyzhang 发表于 2020-4-2 18:02
pytorch1.2
如果转换报错,那就是那个op不支持,可以把模型和转换脚本发给我们,
NPU部门是会慢慢去支持 ...

另外,请问有没有文档可以看到现在的rknn_toolkit_v1.3.0支持pytorch的那些模块
作者: jefferyzhang    时间: 2020-4-3 11:57
rlgl 发表于 2020-4-3 11:36
另外,请问有没有文档可以看到现在的rknn_toolkit_v1.3.0支持pytorch的那些模块

没有这样的文档,一直都在更新,不支持的也可以自己写自定义OP来支持,并且pytorch还有subgraph这样的层,没办法写全。。。
作者: rlgl    时间: 2020-4-3 14:30
jefferyzhang 发表于 2020-4-2 18:02
pytorch1.2
如果转换报错,那就是那个op不支持,可以把模型和转换脚本发给我们,
NPU部门是会慢慢去支持 ...

关于转换pytorch中nn.ConvTranspose2d()模块的bug,rknn和pytorch输出的维度对不上
  1. import numpy as np
  2. from rknn.api import RKNN
  3. import torch


  4. def export_pytorch_model():
  5.         class simplepose(nn.Module):
  6.                 def __init__(self):
  7.                         super(simplepose, self).__init__()
  8.                         self.preact = nn.ConvTranspose2d(3, 64, kernel_size=4,stride=2, padding=1)

  9.                 def forward(self, x):
  10.                         x = self.preact(x)
  11.                         return x

  12.         net = simplepose()
  13.         dummy_input = torch.randn([1, 3, 224, 224])

  14.         trace_model = torch.jit.trace(net, dummy_input)
  15.         pt_save_path = './simplepose.pt'
  16.         trace_model.save(pt_save_path)
  17.         return pt_save_path

  18. if __name__ == '__main__':

  19.         pt_model = export_pytorch_model()
  20.         input_size_list = [[3, 224, 224]]

  21.         # Create RKNN object
  22.          rknn = RKNN()

  23.          # pre-process config
  24.          print('--> config model')
  25.          rknn.config(channel_mean_value='0 0 0 1', reorder_channel='0 1 2')
  26.          print('done')

  27.          # Load pytorch model
  28.          print('--> Loading model')
  29.          ret = rknn.load_pytorch(model=pt_model, input_size_list=input_size_list)
  30.          if ret != 0:
  31.                   print('Load pytorch model failed!')
  32.                   exit(ret)
  33.          print('done')

  34.          # Build model
  35.          print('--> Building model')
  36.          ret = rknn.build(do_quantization=False, dataset='./dataset.txt')
  37.          if ret != 0:
  38.                   print('Build pytorch failed!')
  39.                   exit(ret)
  40.          print('done')

  41.          # Set inputs
  42.          img = np.random.randn(224, 224, 3).astype(np.float32)

  43.          # init runtime environment
  44.          print('--> Init runtime environment')
  45.          ret = rknn.init_runtime()
  46.          if ret != 0:
  47.                   print('Init runtime environment failed')
  48.                   exit(ret)
  49.          print('done')

  50.          # Inference
  51.          print('--> Running model')
  52.          outputs = rknn.inference(inputs=[img])
  53.          print('rknn output:')
  54.          print(outputs[0].shape)

  55.          # pytorch inference
  56.          pt_i = np.expand_dims(img, axis=0)
  57.          pt_i = np.transpose(pt_i, [0, 3, 1, 2])
  58.          pt_i = torch.from_numpy(pt_i)
  59.          model = torch.jit.load(pt_model)
  60.          pt_o = model(pt_i).detach().numpy()
  61.          print('pytorch output:')
  62.          print(pt_o.shape)

  63.          rknn.release()
复制代码





作者: gyq_    时间: 2020-4-3 14:42
rlgl 发表于 2020-4-3 14:30
关于转换pytorch中nn.ConvTranspose2d()模块的bug,rknn和pytorch输出的维度对不上

我也遇见了一样的问题,你看http://t.rock-chips.com/forum.ph ... page%3D1&page=2
作者: rlgl    时间: 2020-4-3 15:15
gyq_ 发表于 2020-4-3 14:42
我也遇见了一样的问题,你看http://t.rock-chips.com/forum.php?mod=viewthread&tid=1330&extra=page%3D1 ...

非常感谢,先收藏,我现在先用没pixelshuffle的模型,您那边如果解决了这个问题麻烦告知一下,非常感谢!
作者: rlgl    时间: 2020-4-3 15:32
jefferyzhang 发表于 2020-4-3 11:57
没有这样的文档,一直都在更新,不支持的也可以自己写自定义OP来支持,并且pytorch还有subgraph这样的层 ...

您好,在只使用一个卷积层和bn层的情况下,使用相同的输入,pytorch模型的输出和rknn模型(由pytorch模型转换而来)的输出,差异很大,代码上传到百度云中

链接:https://pan.baidu.com/s/1blN8xltCmt408RBt1QyxpA
密码:fpff



作者: gyq_    时间: 2020-4-3 15:50
rlgl 发表于 2020-4-3 15:15
非常感谢,先收藏,我现在先用没pixelshuffle的模型,您那边如果解决了这个问题麻烦告知一下,非常感谢! ...

版主发了个新版本,我这边可以正常转换了。
作者: jefferyzhang    时间: 2020-4-3 16:31
rlgl 发表于 2020-4-3 15:32
您好,在只使用一个卷积层和bn层的情况下,使用相同的输入,pytorch模型的输出和rknn模型(由pytorch模型 ...

你先试下beta7版本,他们同样的问题已经解决了。还有差异最好在不量化时候也测试下

链接:https://pan.baidu.com/s/1DuLeBawfoBP62mu0ADNGAA
提取码:qtys
作者: rlgl    时间: 2020-4-5 15:33
jefferyzhang 发表于 2020-4-3 16:31
你先试下beta7版本,他们同样的问题已经解决了。还有差异最好在不量化时候也测试下

链接:https://pan.ba ...

您好,beta7版本nn.Transpose2d输入输出维度正常。但另一个问题:在使用相同输入情况下,pytorch模型输出和rknn模型输出差异较大,模型为一个卷积层+一个bn层,代码
https://pan.baidu.com/s/1blN8xltCmt408RBt1QyxpA,密码fpff

作者: jefferyzhang    时间: 2020-4-6 08:26
rlgl 发表于 2020-4-5 15:33
您好,beta7版本nn.Transpose2d输入输出维度正常。但另一个问题:在使用相同输入情况下,pytorch模型输出 ...

不量化差异大么?
如果不量化差异也大,就要dump出每一层看下哪层有问题。
如果量化差异大,那就用混合量化,把差异大的层改成不量化
作者: rlgl    时间: 2020-4-9 19:25
问个与本问题无关的问题,如何将模型运行在与pc相连的rk3399pro上,我看到Rockchip_User_Guide_RKNN_Toolkit_V1.3.0_CN.pdf文档的3.2.2节写道:“确保开发板的 USB OTG 连接到 PC,并且正确识别到设备,即在 PC 上调用 RKNN-Toolkit的 list_devices 接口可查询到相应的设备”。
请问这个USB OTG 连接到 PC是什么意思,是通过开发板上的那个接口与pc连接
作者: top123    时间: 2020-8-21 11:32
wujialiang 发表于 2020-2-14 17:17
什么时候rknnAPI可以在rk1808上支持c++直接使用pytorch的模型?目前我使用的detectron2训练的mask rcnn  ...

请问你转mask rcnn有转成功吗  我用pytorch自带的mask rcnn都没转成功
作者: top123    时间: 2020-8-21 11:46
jefferyzhang 发表于 2020-2-16 19:42
rknn-toolkit存在的目的就是倒入其他格式模型,转换成rknn。
rknn-toolkit pc版和arm版功能几乎是一样的 ...

有在pytorch1.2中将torchvision.models.detection.maskrcnn_resnet50_fpn的maskrcnn模型转换示例吗




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