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

RKNN-Toolkit转换Tensorflow模型至Rockchip NPU推理并进行性能评估 张显显 2023-11-23 14:00:58 452

一、基本知识

在使用 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''dill==0.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
  • 获取RKNN-Toolkit:rockchip-linux/rknn-toolkit at v1.6.0 (github.com)
  • 安装Python依赖
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设备

易百纳社区

易百纳社区

  • 查询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
========================================================================


声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
张显显
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区