RKNN-Toolkit模型转换并在Rockchip NPU推理并进行性能评估

RKNN-Toolkit转换Tensorflow模型至Rockchip NPU推理并进行性能评估

一、基本知识

在使用 RKNN SDK 之前,用户首先需要使用 RKNN-Toolkit 工具将用户的模型转换为 RKNN
模型,用户可以在 https://github.com/rockchip-linux/rknn-toolkit 获取工具的完整
安装包及使用文档。
成功转换生成 RKNN 模型之后,用户可以先通过 RKNN-Toolkit 连接 RK1808 等开发板进行联
机调试,确保模型的精度性能符合要求。
得到 RKNN 模型文件之后,用户可以选择使用 C 或 Python 接口在 RK1808 等平台开发应用

RKNN-Toolkit 是为用户提供在 PC、 Rockchip NPU 平台上进行模型转换、推理和性能评估的 开发套件

  1. 模型转换:支持 Caffe、TensorFlow、TensorFlow Lite、ONNX、Darknet、Pytorch、MXNet和 Keras 模型转成 RKNN 模型,支持 RKNN 模型导入导出,后续能够在Rockchip NPU 平台上加载使用。从1.2.0版本开始支持多输入模型。从1.3.0版本开始支持Pytorch和MXNet。从 1.6.0 版本开始支持 Keras 框架模型,并支持 TensorFlow 2.0 导出的 H5 模型。
  2. 量化功能:支持将浮点模型转成量化模型,目前支持的量化方法有非对称量化( asymmetric_quantized-u8 ), 动 态 定 点 量 化 ( dynamic_fixed_point-8 和dynamic_fixed_point-16)。从 1.0.0 版本开始,RKNN-Toolkit 开始支持混合量化功能。
  3. 模型推理:能够在 PC 上模拟 Rockchip NPU 运行 RKNN 模型并获取推理结果;也可以将RKNN 模型分发到指定的 NPU 设备上进行推理。
  4. 性能评估:能够在 PC 上模拟 Rockchip NPU 运行 RKNN 模型,并评估模型性能(包括总耗时和每一层的耗时);也可以将 RKNN 模型分发到指定 NPU 设备上运行,以评估模型在实际设备上运行时的性能。
  5. 内存评估:评估模型运行时对系统和 NPU 内存的消耗情况。使用该功能时,必须将 RKNN模型分发到 NPU 设备中运行,并调用相关接口获取内存使用信息。从 0.9.9 版本开始支持该功能。
  6. 模型预编译:通过预编译技术生成的 RKNN 模型可以减少在硬件平台上的加载时间。对于部分模型,还可以减少模型尺寸。但是预编译后的 RKNN 模型只能在 NPU 设备上运行。目前只有 x86_64 Ubuntu 平台支持直接从原始模型生成预编译 RKNN 模型。RKNN-Toolkit从 0.9.5 版本开始支持模型预编译功能,并在 1.0.0 版本中对预编译方法进行了升级,升级后的预编译模型无法与旧驱动兼容。从1.4.0版本开始,也可以通过NPU设备将普通RKNN模型转成预编译 RKNN 模型,详情请参考接口 export_rknn_precompile_model 的使用说明。
  7. 模型分段:该功能用于多模型同时运行的场景下,可以将单个模型分成多段在 NPU 上执2行,借此来调节多个模型占用 NPU 的执行时间,避免因为一个模型占用太多执行时间,而使其他模型得不到及时执行。RKNN-Toolkit 从 1.2.0 版本开始支持该功能。目前,只有RK1806/RK1808/RV1109/RV1126 芯片支持该功能,且 NPU 驱动版本要大于 0.9.8。
  8. 自定义算子功能:如果模型含有 RKNN-Toolkit 不支持的算子(operator),那么在模型转换阶段就会失败。这时候可以使用自定义算子功能来添加不支持的算子,从而使模型能正常转换和运行。RKNN-Toolkit 从 1.2.0 版本开始支持该功能。自定义算子的使用和开发请参考《Rockchip_Developer_Guide_RKNN_Toolkit_Custom_OP_CN》文档。自定义算子目前只支持 TensorFlow 框架。
  9. 量化精度分析功能:该功能将给出模型量化前后每一层推理结果的欧氏距离或余弦距离,以分析量化误差是如何出现的,为提高量化模型的精度提供思路。该功能从 1.3.0 版本开始支持。1.4.0 版本增加逐层量化精度分析子功能,将每一层运行时的输入指定为正确的浮点值,以排除逐层误差积累,能够更准确的反映每一层自身受量化的影响。
  10. 可视化功能:该功能以图形界面的形式呈现 RKNN-Toolkit 的各项功能,简化用户操作步骤。用户可以通过填写表单、点击功能按钮的形式完成模型的转换和推理等功能,而不需要再去手动编写脚本。有关可视化功能的具体使用方法请参考《Rockchip_User_Guide_RKNN_Toolkit_Visualization_CN》文档。1.3.0 版本开始支持该功能。1.4.0 版本完善了对多输入模型的支持,并且支持 RK1806, RV1109, RV1126 等新的 RK NPU 设备。1.6.0 版本增加对 Keras 框架的支持。
  11. 模型优化等级功能:RKNN-Toolkit 在模型转换过程中会对模型进行优化,默认的优化选项可能会对模型精度产生一些影响。通过设置优化等级,可以关闭部分或全部优化选项。有关优化等级的具体使用方法请参考 config 接口中 optimization_level 参数的说明。该功能从 1.3.0 版本开始支持。
  12. 模型加密功能:RKNN-Toolkit 从 1.6.0 版本开始支持模型加密功能。

二、环境部署

2.1环境准备

本开发套件支持运行于 Ubuntu、Windows、MacOS、Debian 等操作系统。需要满足以下运行 环境要求:

操作系统版本Ubuntu16.04(x64)及以上 Windows 7(x64)及以上 Mac OS X 10.13.5(x64)及以上 Debian 9.8(aarch64)及以上
Python 版本3.5/3.6/3.7
Python 库依赖‘numpy == 1.16.3’
‘scipy == 1.3.0’
‘Pillow == 5.3.0’
‘h5py == 2.8.0’
‘lmdb == 0.93’
‘networkx == 1.11’
‘flatbuffers == 1.10’,
‘protobuf == 3.11.2’
‘onnx == 1.6.0’
‘onnx-tf == 1.2.1’
‘flask == 1.0.2’
‘tensorflow == 1.11.0’ or ‘tensorflow-gpu’
‘dill0.2.8.2’
‘ruamel.yaml == 0.15.81’
‘psutils == 5.6.2’
‘ply == 3.11’
‘requests == 2.22.0’
‘torch == 1.2.0’ or ‘torch == 1.5.1’ or
'torch
1.6.0’
‘mxnet == 1.5.0’

本文所采用环境为:Ubuntu18.04.6 (x64),Python3.6.9,RV1126 EVB板

亲测Ubuntu20.04.5不能使用,Python版本不要高过3.7,不要低于3.6

2.2安装RKNN-Toolkit(以Python3.6为例)

  • 安装Python3.6
sudo apt-get install python3.6
  • 安装pip3
sudo apt-get install python3-pip
pip3 install -i http://pypi.douban.com/simple/ tensorflow==1.11.0
pip3 install -i http://pypi.douban.com/simple/ mxnet==1.5.0
pip3 install -i http://pypi.douban.com/simple/ torchvision==0.4.0
pip3 install -i http://pypi.douban.com/simple/ torch==1.5.1
pip3 install -i http://pypi.douban.com/simple/ opencv-python
pip3 install -i http://pypi.douban.com/simple/ gluoncv
  • 安装RKNN-Toolkit
sudo pip3 install -i http://pypi.douban.com/simple/ rknn_toolkit-1.6.0-cp36-cp36m-linux_x86_64.whl
  • 检查RKNN-Toolkit是否安装成功
rk@rk:~/rknn-toolkit-v1.6.0/package$ python3 
>>> from rknn.api import RKNN
>>> 

如果导入RKNN模块没有失败,说明安装成功

2.3注意事项:

  • 如果电脑中已经存在Python3的其他版本,自行查询版本共存方法,或者直接替换(可能出现问题,最直接的方法是重装Ubuntu)
  • 遇到版本不兼容现象,导致安装失败的,可以暂时不管,能导入模块即可,如果实在不行,就寻找版本号相差不大的替换
  • 如果你的Python3为Python3.7,则需在安装RKNN-Toolkit那一步中,将cp36替换成cp37即可
  • 对于没有想要的依赖版本,考虑更新pip和pip3的库

三、Tensorflow模型转换、推理及评估

3.1在PC上仿真运行

Linux x86_64 上的 RKNN-Toolkit 自带了一个 RK1808 的模拟器,可以用来仿真模型在 RK1808 上运行时的行为。

  • 进入模型目录
cd /home/wilson/rknn-toolkit/examples/tensorflow/ssd_mobilenet_v1
  • 执行test.py脚本
python3 test.py
  • 得到如下结果(包括创建RKNN对象;模型配置;加载TensorFlow模型;构建RKNN模型;导出RKNN模型;加载图片并推理;得到TOP5结果;评估模型性能;释放RKNN对象)
--> Loading model
W Use existed rule db file to convert tensorflow model.
done
--> Building model
W The target_platform is not set in config, using default target platform rk1808.
done
--> Init runtime environment
done
--> Running model
done
W When performing performance evaluation, inputs can be set to None to use fake inputs.
========================================================================
                               Performance                              
========================================================================
Layer ID    Name                                         Time(us)
57          openvx.tensor_transpose_3                    125
117         convolution.relu.pooling.layer2_2            204
115         convolution.relu.pooling.layer2_2            404
112         convolution.relu.pooling.layer2_2            416
110         convolution.relu.pooling.layer2_2            597
107         convolution.relu.pooling.layer2_2            245
105         convolution.relu.pooling.layer2_2            503
102         convolution.relu.pooling.layer2_2            326
100         convolution.relu.pooling.layer2_2            223
97          convolution.relu.pooling.layer2_2            166
95          convolution.relu.pooling.layer2_2            242
92          convolution.relu.pooling.layer2_2            291
90          convolution.relu.pooling.layer2_2            242
87          convolution.relu.pooling.layer2_2            162
85          convolution.relu.pooling.layer2_2            258
82          convolution.relu.pooling.layer2_2            316
80          convolution.relu.pooling.layer2_2            258
77          convolution.relu.pooling.layer2_2            316
75          convolution.relu.pooling.layer2_2            258
72          convolution.relu.pooling.layer2_2            316
70          convolution.relu.pooling.layer2_2            258
64          convolution.relu.pooling.layer2_2            316
60          convolution.relu.pooling.layer2_2            258
46          convolution.relu.pooling.layer2_2            316
28          convolution.relu.pooling.layer2_2            171
84          openvx.tensor_transpose_3                    48
34          convolution.relu.pooling.layer2_2            47
114         openvx.tensor_transpose_3                    6
69          convolution.relu.pooling.layer2_2            297
63          convolution.relu.pooling.layer2_2            234
59          convolution.relu.pooling.layer2_2            337
45          convolution.relu.pooling.layer2_2            484
27          convolution.relu.pooling.layer2_2            250
79          openvx.tensor_transpose_3                    29
33          convolution.relu.pooling.layer2_2            33
109         openvx.tensor_transpose_3                    5
56          convolution.relu.pooling.layer2_2            122
44          convolution.relu.pooling.layer2_2            490
26          convolution.relu.pooling.layer2_2            97
74          openvx.tensor_transpose_3                    10
32          convolution.relu.pooling.layer2_2            11
104         openvx.tensor_transpose_3                    5
55          convolution.relu.pooling.layer2_2            30
43          convolution.relu.pooling.layer2_2            147
25          convolution.relu.pooling.layer2_2            51
68          openvx.tensor_transpose_3                    6
31          convolution.relu.pooling.layer2_2            6
99          openvx.tensor_transpose_3                    4
54          convolution.relu.pooling.layer2_2            17
42          convolution.relu.pooling.layer2_2            147
24          convolution.relu.pooling.layer2_2            51
67          openvx.tensor_transpose_3                    5
30          convolution.relu.pooling.layer2_2            6
94          openvx.tensor_transpose_3                    4
53          convolution.relu.pooling.layer2_2            10
41          convolution.relu.pooling.layer2_2            21
23          fullyconnected.relu.layer_3                  13
29          fullyconnected.relu.layer_3                  8
Total Time(us): 10218
FPS(600MHz): 73.40
FPS(800MHz): 97.87
Note: Time of each layer is converted according to 800MHz!
========================================================================

3.2在RV1126上运行(利用Rockchip NPU—神经网络处理器)

  • 首先我们将rv1126USB-OTG与PC连接

  • 找到虚拟机右下角连接ADB设备

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7qPxjFdD-1679360609223)(D:\OneDrive\文章\image-20230321085054793.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8eKp2KY6-1679360609225)(D:\OneDrive\文章\image-20230321085126545.png)]

  • 查询ADB设备id

wilson@Ubuntu18:~/rknn-toolkit/examples/tensorflow/ssd_mobilenet_v1$ adb devices
List of devices attached
20230105RV1126FD2G0028	device
  • 打开test.py
vim test.py
  • 修改rknn.config目标平台
# Config for Model Input PreProcess
rknn.config(mean_values=[[127.5, 127.5, 127.5]], std_values=[[127.5, 127.5, 127.5]], reorder_channel='0 1 2')
#修改为
rknn.config(mean_values=[[127.5, 127.5, 127.5]], std_values=[[127.5, 127.5, 127.5]], reorder_channel='0 1 2',target_platform=['rv1126'])
  • 修改rknn.init_runtime方法参数
# init runtime environment
print('--> Init runtime environment')
ret = rknn.init_runtime()
#修改为(device_id)
ret = rknn.init_runtime(target='rv1126',device_id='20230105RV1126FD2G0028') #device_id输入刚刚查询到的id
  • 保存并退出
  • 执行test.py脚本,得到如下结果
wilson@Ubuntu18:~/rknn-toolkit/examples/tensorflow/ssd_mobilenet_v1$ python3 test.py 
--> Loading model
W Use existed rule db file to convert tensorflow model.
done
--> Building model
done
--> Init runtime environment
I NPUTransfer: Starting NPU Transfer Client, Transfer version 2.1.0 (b5861e7@2020-11-23T11:50:36)
D RKNNAPI: ==============================================
D RKNNAPI: RKNN VERSION:
D RKNNAPI:   API: 1.6.0 (79320de build: 2020-12-29 10:56:36)
D RKNNAPI:   DRV: 1.7.0 (7880361 build: 2021-08-16 14:05:08)
D RKNNAPI: ==============================================
done
--> Running model
done
W When performing performance evaluation, inputs can be set to None to use fake inputs.
========================================================================
                               Performance                              
========================================================================
Total Time(us): 8884
FPS: 112.56
========================================================================
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值