Toybrick

标题: pytorch一个模型转化过程中的报错 [打印本页]

作者: luxiaofei    时间: 2020-3-12 16:59
标题: pytorch一个模型转化过程中的报错
本帖最后由 luxiaofei 于 2020-3-12 17:03 编辑

pytorch等版本都是正确的,可以运行官方pytorch转rknn的demo

出错部分的代码:
net = SiamRPN()
net.load_state_dict(torch.load(join(realpath(dirname(__file__)), 'SiamRPNVOT.model')))
net.eval()

net2 = torch.jit.trace(net, (torch.Tensor(1,3,271,271),torch.Tensor(1,3,127,127)))
net2.save('./net2.pt')

model = './net2.pt'
input_size_list = [[3, 271, 271], [3, 127, 127]]

rknn = RKNN()

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

# Load pytorch model
print('--> Loading model')
ret = rknn.load_pytorch(model=model, input_size_list=input_size_list)
if ret != 0:
    print('Load pytorch model failed!')
    exit(ret)
print('done')

# Build model
print('--> Building model')
ret = rknn.build(do_quantization=False)
if ret != 0:
    print('Build pytorch failed!')
    exit(ret)
print('done')

报错部分的信息:
--> Loading model
/usr/local/lib/python3.6/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)
./net2.pt ********************
WARNING: Token 'COMMENT' defined, but not used
WARNING: There is 1 unused token
Syntax error in input! LexToken(<,'<',5,162)
done
--> Building model
W Genreate input meta fail, please check model.
W External input meta file "/tmp/tmpekkbyfa9/net2_inputmeta.yml" is not exists.
Traceback (most recent call last):
  File "/home/xiaofei/PycharmProjects/DaSiam_0311/demo.py", line 43, in <module>
    ret = rknn.build(do_quantization=False)
  File "/usr/local/lib/python3.6/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


pytorch模型的定义:
class SiamRPN(nn.Module):
    def __init__(self, size=1, feature_out=256, anchor=5):
        configs = [3, 96, 256, 384, 384, 256]
        configs = list(map(lambda x: 3 if x==3 else x*size, configs))
        feat_in = configs[-1]
        super(SiamRPN, self).__init__()
        self.featureExtract = nn.Sequential(
            nn.Conv2d(configs[0], configs[1] , kernel_size=11, stride=2),
            nn.BatchNorm2d(configs[1]),
            nn.MaxPool2d(kernel_size=3, stride=2),
            nn.ReLU(inplace=True),
            nn.Conv2d(configs[1], configs[2], kernel_size=5),
            nn.BatchNorm2d(configs[2]),
            nn.MaxPool2d(kernel_size=3, stride=2),
            nn.ReLU(inplace=True),
            nn.Conv2d(configs[2], configs[3], kernel_size=3),
            nn.BatchNorm2d(configs[3]),
            nn.ReLU(inplace=True),
            nn.Conv2d(configs[3], configs[4], kernel_size=3),
            nn.BatchNorm2d(configs[4]),
            nn.ReLU(inplace=True),
            nn.Conv2d(configs[4], configs[5], kernel_size=3),
            nn.BatchNorm2d(configs[5]),
        )#ALexNet

        self.anchor = anchor
        self.feature_out = feature_out

        self.conv_r1 = nn.Conv2d(feat_in, feature_out*4*anchor, 3)
        self.conv_r2 = nn.Conv2d(feat_in, feature_out, 3)
        self.conv_cls1 = nn.Conv2d(feat_in, feature_out*2*anchor, 3)
        self.conv_cls2 = nn.Conv2d(feat_in, feature_out, 3)
        self.regress_adjust = nn.Conv2d(4*anchor, 4*anchor, 1)

        self.r1_kernel = []
        self.cls1_kernel = []


    def forward(self, x,z):
        z_f = self.featureExtract(z)
        r1_kernel_raw = self.conv_r1(z_f)
        cls1_kernel_raw = self.conv_cls1(z_f)
        kernel_size = r1_kernel_raw.data.size()[-1]
        self.r1_kernel = r1_kernel_raw.view(self.anchor*4, self.feature_out, kernel_size, kernel_size)
        self.cls1_kernel = cls1_kernel_raw.view(self.anchor*2, self.feature_out, kernel_size, kernel_size)

        x_f = self.featureExtract(x)
        return self.regress_adjust(F.conv2d(self.conv_r2(x_f), self.r1_kernel)), \
               F.conv2d(self.conv_cls2(x_f), self.cls1_kernel)




作者: luxiaofei    时间: 2020-3-12 17:00
本帖最后由 luxiaofei 于 2020-3-12 17:06 编辑

我用论坛的代码块结果发出来都是乱码,所以就直接把代码发在正文里了。
模型载入和转换都是按照demo来的,找不出是哪里的问题。但loading_model的时候有一句
Syntax error in input! LexToken(<,'<',5,162)
这句话在官方demo的输出中没有见过,不知道是什么error?和下一步build_model报错退出有关系吗


还有就是我定义的pytorch的网络模型有问题吗?是继承了nn.module的子类,有两个输入两个输出,

作者: luxiaofei    时间: 2020-3-12 17:10
pytorch进行网络推理时,
    delta, score = net(x_crop,z)
输入x_crop的尺寸[1,3,271,271],z的尺寸[1,3,127,127],输出delta的尺寸[1,20,19,19],score的尺寸[1,10,19,19]
是可以得到结果。搞不懂为啥子转换不了,麻烦版主看看
作者: jefferyzhang    时间: 2020-3-12 17:20
问题我也上报给NPU部门了,方便的话可以提供下模型+转换脚本,便于他们复现问题
作者: luxiaofei    时间: 2020-3-12 17:26
jefferyzhang 发表于 2020-3-12 17:20
问题我也上报给NPU部门了,方便的话可以提供下模型+转换脚本,便于他们复现问题 ...

好的,模型大于10Mb了论坛好像不能上传,有邮箱吗?我把模型和代码发到您邮箱里?
作者: jefferyzhang    时间: 2020-3-12 17:37
luxiaofei 发表于 2020-3-12 17:26
好的,模型大于10Mb了论坛好像不能上传,有邮箱吗?我把模型和代码发到您邮箱里? ...

发百度网盘给链接就可以。
作者: luxiaofei    时间: 2020-3-12 18:06
jefferyzhang 发表于 2020-3-12 17:37
发百度网盘给链接就可以。

链接:https://pan.baidu.com/s/1wK-fXX1fxtOuaxIGjlOtwQ
提取码:h6td
作者: christian    时间: 2020-3-14 17:03
你好,这个问题有解吗?我也遇到了,版本一致,demo运行也正常。
作者: jefferyzhang    时间: 2020-3-17 11:10
问题将在1.4.0版本中解决,1.3.0中不支持conv2d的weight为另外一个卷积的输出。
作者: luxiaofei    时间: 2020-3-17 14:17
jefferyzhang 发表于 2020-3-17 11:10
问题将在1.4.0版本中解决,1.3.0中不支持conv2d的weight为另外一个卷积的输出。

1.4.0版本大概什么时候推出啊老哥?
作者: luxiaofei    时间: 2020-3-17 14:18
christian 发表于 2020-3-14 17:03
你好,这个问题有解吗?我也遇到了,版本一致,demo运行也正常。

看下面版主的回复,在1.4.0里可能能解决。
你也是要用这个模型吗?可以私聊一起讨论一下
作者: jefferyzhang    时间: 2020-3-17 14:52
luxiaofei 发表于 2020-3-17 14:17
1.4.0版本大概什么时候推出啊老哥?

不知道,不要问我- -# 我不是NPU部门的
作者: christian    时间: 2020-3-18 17:34
luxiaofei 发表于 2020-3-17 14:18
看下面版主的回复,在1.4.0里可能能解决。
你也是要用这个模型吗?可以私聊一起讨论一下 ...

我换tf了,但是还有问题
作者: Sean    时间: 2020-3-24 13:48
jefferyzhang 发表于 2020-3-17 11:10
问题将在1.4.0版本中解决,1.3.0中不支持conv2d的weight为另外一个卷积的输出。

老哥这句话是什么意思啊,我可以绕过这个问题吗
作者: jefferyzhang    时间: 2020-3-24 14:20
Sean 发表于 2020-3-24 13:48
老哥这句话是什么意思啊,我可以绕过这个问题吗

就是说1.3.0还不支持这个做法,1.4.0已经支持,但是要等我们发布
作者: Sean    时间: 2020-3-24 16:38
jefferyzhang 发表于 2020-3-24 14:20
就是说1.3.0还不支持这个做法,1.4.0已经支持,但是要等我们发布

1.3.0是可以支持torch的上采样吧,我现在定位到上采样这层报错,如果去掉上采样,模型就能转换成功
作者: jefferyzhang    时间: 2020-3-24 16:50
Sean 发表于 2020-3-24 16:38
1.3.0是可以支持torch的上采样吧,我现在定位到上采样这层报错,如果去掉上采样,模型就能转换成功 ...

转换成功还要试下运行结果是否与PC一致。。
上采样总类很多,没问NPU部门我也不太懂pytorch支持情况怎么样。
不过现在很多bug都报过去了,相信1.4.0出来pytorch的支持会更好




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