技术专栏
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 平台上进行模型转换、推理和性能评估的 开发套件。
- 模型转换:支持 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 模型。
- 量化功能:支持将浮点模型转成量化模型,目前支持的量化方法有非对称量化( asymmetric_quantized-u8 ), 动 态 定 点 量 化 ( dynamic_fixed_point-8 和dynamic_fixed_point-16)。从 1.0.0 版本开始,RKNN-Toolkit 开始支持混合量化功能。
- 模型推理:能够在 PC 上模拟 Rockchip NPU 运行 RKNN 模型并获取推理结果;也可以将RKNN 模型分发到指定的 NPU 设备上进行推理。
- 性能评估:能够在 PC 上模拟 Rockchip NPU 运行 RKNN 模型,并评估模型性能(包括总耗时和每一层的耗时);也可以将 RKNN 模型分发到指定 NPU 设备上运行,以评估模型在实际设备上运行时的性能。
- 内存评估:评估模型运行时对系统和 NPU 内存的消耗情况。使用该功能时,必须将 RKNN模型分发到 NPU 设备中运行,并调用相关接口获取内存使用信息。从 0.9.9 版本开始支持该功能。
- 模型预编译:通过预编译技术生成的 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 的使用说明。
- 模型分段:该功能用于多模型同时运行的场景下,可以将单个模型分成多段在 NPU 上执2行,借此来调节多个模型占用 NPU 的执行时间,避免因为一个模型占用太多执行时间,而使其他模型得不到及时执行。RKNN-Toolkit 从 1.2.0 版本开始支持该功能。目前,只有RK1806/RK1808/RV1109/RV1126 芯片支持该功能,且 NPU 驱动版本要大于 0.9.8。
- 自定义算子功能:如果模型含有 RKNN-Toolkit 不支持的算子(operator),那么在模型转换阶段就会失败。这时候可以使用自定义算子功能来添加不支持的算子,从而使模型能正常转换和运行。RKNN-Toolkit 从 1.2.0 版本开始支持该功能。自定义算子的使用和开发请参考《Rockchip_Developer_Guide_RKNN_Toolkit_Custom_OP_CN》文档。自定义算子目前只支持 TensorFlow 框架。
- 量化精度分析功能:该功能将给出模型量化前后每一层推理结果的欧氏距离或余弦距离,以分析量化误差是如何出现的,为提高量化模型的精度提供思路。该功能从 1.3.0 版本开始支持。1.4.0 版本增加逐层量化精度分析子功能,将每一层运行时的输入指定为正确的浮点值,以排除逐层误差积累,能够更准确的反映每一层自身受量化的影响。
- 可视化功能:该功能以图形界面的形式呈现 RKNN-Toolkit 的各项功能,简化用户操作步骤。用户可以通过填写表单、点击功能按钮的形式完成模型的转换和推理等功能,而不需要再去手动编写脚本。有关可视化功能的具体使用方法请参考《Rockchip_User_Guide_RKNN_Toolkit_Visualization_CN》文档。1.3.0 版本开始支持该功能。1.4.0 版本完善了对多输入模型的支持,并且支持 RK1806, RV1109, RV1126 等新的 RK NPU 设备。1.6.0 版本增加对 Keras 框架的支持。
- 模型优化等级功能:RKNN-Toolkit 在模型转换过程中会对模型进行优化,默认的优化选项可能会对模型精度产生一些影响。通过设置优化等级,可以关闭部分或全部优化选项。有关优化等级的具体使用方法请参考 config 接口中 optimization_level 参数的说明。该功能从 1.3.0 版本开始支持。
- 模型加密功能: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个
手气红包
暂无数据
相关专栏
-
浏览量:1984次2024-01-05 14:11:13
-
浏览量:1567次2024-02-04 17:13:47
-
浏览量:1608次2024-03-05 15:34:48
-
浏览量:3939次2021-04-02 09:47:41
-
浏览量:592次2023-09-06 17:53:04
-
浏览量:987次2024-02-18 16:38:33
-
浏览量:965次2023-08-29 12:59:54
-
浏览量:1175次2024-02-19 17:07:05
-
浏览量:1592次2024-01-18 18:05:38
-
浏览量:589次2024-01-18 17:18:51
-
浏览量:2558次2023-08-29 13:13:38
-
浏览量:6299次2022-05-31 11:14:16
-
浏览量:3349次2022-11-22 09:58:36
-
浏览量:1685次2024-01-22 17:46:51
-
浏览量:1431次2024-02-05 10:41:25
-
浏览量:5487次2021-04-06 17:40:39
-
浏览量:7854次2022-07-29 18:09:52
-
浏览量:1816次2024-01-17 17:09:14
-
浏览量:1382次2024-01-05 16:46:11
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者
张显显
您的支持将鼓励我继续创作!
打赏金额:
¥1
¥5
¥10
¥50
¥100
支付方式:
微信支付
打赏成功!
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注