Toybrick

楼主: kkkaaa

pytorch -> rknn 转换 nn.ReLU op 有问题,似乎是 bug

jefferyzhang

版主

积分
13580
11#
发表于 2020-5-22 11:26:18 | 只看该作者
kkkaaa 发表于 2020-5-22 11:07
I see... 你们的 NPU 部门连这是不是一个 bug 都不会立马反馈给你们是吧。。。
看来用 rknn 还是最好限制 ...

只要你们按文档操作,有问题肯定是bug。
你们可以自己尝试绕过去,或者只能等他们处理。

立项客户可以通过FAE或者直接跟他们交流。
回复

使用道具 举报

jefferyzhang

版主

积分
13580
12#
发表于 2020-5-25 20:01:57 | 只看该作者
NPU Team回复:  253049

1.如果要跑你这个模型,rknn.config(optimization_level=0)设置一下,如果不设置的话卷积和relu在硬件上会merge。

2.rknn.init_runtime 请指定设备,因为驱动更新比模拟器快,硬件跑的结果可能会和模拟器跑的结果不一样。

直接跑我这个test.py是能得到正确结果的。

  1. # -*- coding: utf-8 -*-
  2. # create time: 2020-05-15 15:29

  3. import torch
  4. from rknn.api import RKNN
  5. import numpy as np


  6. class Net(torch.nn.Module):

  7.     def __init__(self):
  8.         super(Net, self).__init__()

  9.         self.conv1 = torch.nn.Conv2d(3,24,3)
  10.         self.nonlinear = torch.nn.ReLU()  # successful op: Sigmoid, LeakyReLU

  11.     def forward(self, x):
  12.         x1 = self.conv1(x)
  13.         y = self.nonlinear(x1)
  14.         return x1, y


  15. def E_D(vector1, vector2):
  16.     print("vector1 norm: ", np.linalg.norm(vector1))
  17.     print("vector2 norm: ", np.linalg.norm(vector2))
  18.     print("distance: ", np.linalg.norm(vector1 - vector2))

  19. def cos_d(vector1, vector2):
  20.     d = 1 - np.dot(vector1, vector2) / (np.linalg.norm(vector1) * (np.linalg.norm(vector2)))
  21.     print(d)


  22. if __name__ == '__main__':

  23.     net = Net()
  24.     net.eval()
  25.     i1 = torch.rand(1,3,5,5)
  26.     # i2 = torch.rand(1,2,7,7)
  27.     # i3 = torch.rand(1,3,9,9)
  28.     trace_model = torch.jit.trace(net, (i1))
  29.     trace_model.save('test.pt')


  30.     rknn = RKNN(verbose=True)
  31.     rknn.config(batch_size=1,
  32.                 channel_mean_value='0 0 0 1',
  33.                 reorder_channel='0 1 2',
  34.                 optimization_level=0,
  35.                 epochs=1)

  36.     ret = rknn.load_pytorch(model='test.pt', input_size_list=[[3,5,5]])
  37.     # ret = rknn.load_onnx(model='lstm{128x64}.pt.onnx')
  38.     if ret != 0:
  39.         print('Load pytorch model failed!')
  40.         exit(ret)

  41.     ret = rknn.build(do_quantization=False, dataset='./dataset.txt')
  42.     if ret != 0:
  43.         print('Build pytorch failed!')
  44.         exit(ret)

  45.     ret = rknn.init_runtime(target='rk1808')
  46.     if ret != 0:
  47.         print('Init runtime environment failed')
  48.         exit(ret)


  49.     rknn_r = rknn.inference(inputs=[i1.numpy()],
  50.                             data_type='float32',
  51.                             data_format='nchw')
  52.     pytorch_r = net(i1)


  53.     for d1, d2 in zip(rknn_r, pytorch_r):
  54.         d1 = d1.ravel()
  55.         d2 = d2.detach().numpy().ravel()

  56.         E_D(d1, d2)
  57.         cos_d(d1, d2)

  58.         print("---")

复制代码
回复

使用道具 举报

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

本版积分规则

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


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