【智能硬件】初识RKNN

一、介绍

RKNN 是 Rockchip npu 平台使用的模型类型,以.rknn后缀结尾的模型文件。Rockchip 提供了完整了模型转换 Python 工具,方便用户将自主研发的算法模型转换成 RKNN 模型,同时 Rockchip 也提供了C/C++Python API 接口。

二、RKNN-Toolkit

RKNN-Toolkit 是为用户提供在 PC、 Rockchip NPU 平台上进行模型转换、推理和性能评估的 开发套件,用户通过该工具提供的 Python 接口可以便捷地完成以下功能:

  • 模型转换:支持 CaffeTensorFlowTensorFlow LiteONNXDarknetPytorchMXNet 模型转成 RKNN 模型,支持 RKNN 模型导入导出,后续能够在 Rockchip NPU 平台上加 载使用。从1.2.0版本开始支持多输入模型。1.3.0版本开始支持 Pytorch 和 MXNet。

  • https://github.com/rockchip-linux/rknn-toolkithttps://github.com/rockchip-linux/rknn-toolkit

  • 下载有困难的话,评论区留言~~ 下面是1.7.1版本百度企业网盘-企业云盘-企业云存储解决方案-同步云盘百度企业网盘为企业提供企业网盘/企业云盘/文件管理/云存储办公解决方案,通过安全便捷的文件存储、访问、备份、共享、管理和协作,将企业数据高效管理,让人与数据无缝连接,从而保障企业数据安全,提高企业办公效率。https://eyun.baidu.com/s/3bqbs86j

  • 量化功能:支持将浮点模型转成量化模型, 目前支持的量化方法有非对称量化( 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 模型

  • 模型分段:该功能用于多模型同时运行的场景下,可以将单个模型分成多段在 NPU 上执 行,借此来调节多个模型占用 NPU 的执行时间,避免因为一个模型占用太多执行时间, 1而使其他模型得不到及时执行。RKNN-Toolkit 从1.2.0版本开始支持该功能。该功能必须 在带有 Rockchip NPU 的硬件上使用,且 NPU 驱动版本要大于 0.9.8

  • 自定义算子功能:如果模型含有 RKNN-Toolkit 不支持的算子(operator),那么在模型转 换阶段就会失败。这时候可以使用自定义算子功能来添加不支持的算子,从而使模型能正 常转换和运行。RKNN-Toolkit 从1.2.0版本开始支持该功能。自定义算子的使用和开发请 参考《Rockchip_Developer_Guide_RKNN_Toolkit_Custom_OP_CN》文档。

  • 量化精度分析功能:该功能将给出模型量化前后每一层推理结果的欧氏距离或余弦距离, 以分析量化误差是如何出现的,为提高量化模型的精度提供思路。该功能从1.3.0版本开 始支持。1.4.0 版本增加逐层量化精度分析子功能,将每一层运行时的输入指定为正确的 浮点值,以排除逐层误差积累,能够更准确的反映每一层自身受量化的影响。

  • 可视化功能:该功能以图形界面的形式呈现 RKNN-Toolkit 的各项功能,简化用户操作步 骤。用户可以通过填写表单、点击功能按钮的形式完成模型的转换和推理等功能,而不需 要再去手动编写脚本。有关可视化功能的具体使用方法请参考 《Rockchip_User_Guide_RKNN_Toolkit_Visualization_CN》文档。1.3.0 版本开始支持该功 能。1.4.0 版本完善了对多输入模型的支持,并且支持 RK1806, RV1109, RV1126 等新的 Rockchip NPU 设备。

  • 模型优化等级功能:RKNN-Toolkit 在模型转换过程中会对模型进行优化,默认的优化选项 可能会对模型精度产生一些影响。通过设置优化等级,可以关闭部分或全部优化选项。有 关优化等级的具体使用方法请参考 config 接口中optimization_level参数的说明。该功能从 1.3.0 版本开始支持。

  • 模型加密功能:使用指定的加密等级将 RKNN 模型整体加密。RKNN-Toolkit 从 1.6.0 版
    本开始支持模型加密功能。因为 RKNN 模型的加密是在 NPU 驱动中完成的,使用加密
    模型时,与普通 RKNN 模型一样加载即可,NPU 驱动会自动对其进行解密。 

【智能硬件】初识RKNN_第1张图片

 

环境依赖

  • 系统支持:Ubuntu 16.04 x64(以上)、Window 7 x64(以上)、Mac OS X 10.13.5 x64 (以上)、 Debian 9.8 (x64)以上

  • 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'
 'sklearn == 0.0'
 'opencv-python == 4.0.1.23' 
'Jinja2 == 2.10' 

1. Windows 只提供 Python3.6 的安装包。

 2. MacOS 提供 python3.6 和 python3.7 的安装包。

 3. ARM64 平台(安装 Debian 9 或 10 操作系统)提供 Python3.5(Debain 9)和 Python3.7

(Debian10)的安装包。 
4. 因为 PyTorch / TensorFlow 等逐渐停止对 Python3.5 的支持,RKNN-Toolkit 下一个大
版本将移除 Linux x86 平台上 Python3.5 的安装包,转而提供 Python3.6 和 Python3.7
的安装包。 
5. 除 MacOS 平台外,其他平台的 scipy 依赖为>=1.1.0。 
6. ARM64 平台不需要依赖 sklearn 和 opencv-python。 
7. Jinja2 只在使用自定义 OP 时用到。 

RKNN-Toolkit 是一个跨平台的开发套件,已支持的操作系统如下: (1.7.1版本toolkit)
⚫ Ubuntu: 16.04(x64)及以上 
⚫ Windows:7(x64)及以上 
⚫ MacOS: 10.13.5(x64)及以上 
⚫ Debian: 9.8(aarch64)及以上 

深度学习框架支持

【智能硬件】初识RKNN_第2张图片

【智能硬件】初识RKNN_第3张图片

注: 
1. 依照语义版本,用某一版本 TensorFlow 写出的任何图或检查点,都可以通过相同主要版
本中更高(次要或补丁)版本的 TensorFlow 来进行加载和评估,所以理论上,1.14.0 之
前版本的 TensorFlow 生成的 pb 文件,RKNN Toolkit 1.0.0 及之后的版本都是支持的。关
于 TensorFlow 版本兼容性的更多信息,可以参考官方资料:
https://www.tensorflow.org/guide/version_compat?hl=zh-CN 
2. 因为 tflite 不同版本的 schema 之间是互不兼容的,所以构建 tflite 模型时使用与 RKNN 
Toolkit 不同版本的 schema 可能导致加载失败。目前 RKNN Toolkit 使用的 tflite schema 是
基于 TensorFlow Lite 官方 GitHub master 分 支 上 的 如 下 提 交 : 
0c4f5dfea4ceb3d7c0b46fc04828420a344f7598 。 具 体 的 schema 链 接 如 下 :
https://github.com/tensorflow/tensorflow/commits/master/tensorflow/lite/schema/schema.fbs 
3. RKNN Toolkit 所使用的 caffe protocol 有两种,一种是基于 berkeley 官方修改的 protocol,
一种是包含 LSTM 层的 protocol。其中基于 berkeley 官方修改的 protocol 来自:
https://github.com/BVLC/caffe/tree/master/src/caffe/proto,commit 值为 21d0608,RKNN 
Toolkit 在这个基础上新增了一些 OP。而包含 LSTM 层的 protocol 参考以下链接:
https://github.com/xmfbit/warpctc-caffe/tree/master/src/caffe/proto,commit 值为 bd6181b。这
两种 protocol 通过 load_caffe 接口中的 proto 参数指定。 
4. ONNX release version 和 opset version、IR version 之间的关系参考官网说明: 
https://github.com/microsoft/onnxruntime/blob/master/docs/Versioning.md 

【智能硬件】初识RKNN_第4张图片

 

 5. Darknet 官方 Github 链接:https://github.com/pjreddie/darknet. RKNN Toolkit 现在的转换规
则是基于 master 分支的最新提交(commit 值:810d7f7)制定的。 
6. 加载 Pytorch 模型(torchscript 模型)时,推荐使用相同版本的 Pytorch 导出模型并转为
RKNN 模型,前后版本不一致时有可能会导致转 RKNN 模型失败。 
7. RKNN Toolkit 目前主要支持以 TensorFlow 为 backend 的 Keras 版本,所测 Keras 版本均
为 TensorFlow 自带的 Keras。 

 

Ubuntu测试

测试环境使用Ubuntu 16.04 x86_64 PC主机。

  • RKNN-Toolkit 安装

# 安装 python 3.5
sudo apt-get install python3.5
# 安装 pip3
sudo apt-get install python3-pip
# 获取 RKNN-Toolkit 安装包,然后执行以下步骤
cd sdk/external/rknn-toolkit/
cp sdk/external/rknn-toolkit ./ -rf
cd rknn-toolkit/package/
pip3 install tensorflow==1.11.0
pip3 install mxnet==1.5.0
pip3 install torch==1.2.0 torchvision==0.4.0
pip3 install opencv-python
pip3 install gluoncv
# 安装 RKNN-Toolkit
sudo pip3 install rknn_toolkit-1.4.0-cp35-cp35m-linux_x86_64.whl
# 检查是否安装成功,import rknn 库
rk@rk:~/rknn-toolkit-v1.4.0/package$ python3
>>> from rknn.api import RKNN
>>>
  • 设备默认没有开启 OTG 功能,如需要请先在内核开启 OTG,编译升级内核。

# sdk/kernel/arch/arm/boot/dts/rv1126-firefly-rk809.dtsi
&usbdrd_dwc3 {                                                                                                               
    status = "okay";                                                                                                        
    dr_mode = "otg";  #开启OTG                                                                                                                              
    extcon = <&u2phy0>;                                                                                                          
};
  • USB OTG 连接主机和设备运行 demo

cd examples/tflite/mobilenet_v1/
daijh@daijh:~/p/sdk/external/rknn-toolkit/examples/tflite/mobilenet_v1$ python3.6 ./test.py 
--> config model
done
--> Loading model
done
--> Building model
W The channel_mean_value filed will not be used in the future!
done
--> Export RKNN model
done
--> Init runtime environment
I NPUTransfer: Starting NPU Transfer Client, Transfer version 2.0.0 (8f9ebbc@2020-04-03T09:12:30)
D RKNNAPI: ==============================================
D RKNNAPI: RKNN VERSION:
D RKNNAPI:   API: 1.4.0 (b4a8096 build: 2020-08-12 10:15:19)
D RKNNAPI:   DRV: 1.5.2 (e67e5cb build: 2020-12-03 15:04:52)
D RKNNAPI: ==============================================
done
--> Running model
mobilenet_v1
-----TOP 5-----
[156]: 0.8603515625
[155]: 0.0833740234375
[205]: 0.0123443603515625
[284]: 0.00726318359375
[260]: 0.002262115478515625

done
--> Begin evaluate model performance
W When performing performance evaluation, inputs can be set to None to use fake inputs.
========================================================================
                               Performance                              
========================================================================
Total Time(us): 5573
FPS: 179.44
========================================================================

done
daijh@daijh:~/p/sdk/external/rknn-toolkit/examples/tflite/mobilenet_v1$
  • 除了python接口外,我们也提供了模型推理的C/C++接口,用户可以在 PC 上完成模型转换再到板子上 使用C/C++完成模型推理。以下是 demo 运行。

# 编译前需要修改好交叉编译器的路径,vim build.sh 修改 GCC_COMPILER
# GCC_COMPILER=/home/daijh/p/sdk/prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf 
# 这里是我本地的 32 位交叉编译工具的路径,用户需要自己修改成 SDK 中交叉编译工具的路径。
daijh@daijh:~$ cd sdk/external/rknpu/rknn/rknn_api/examples/rknn_mobilenet_demo
daijh@daijh:sdk/external/rknpu/rknn/rknn_api/examples/rknn_mobilenet_demo$ ./build.sh

# 把编译好的 demo 放到设备中
adb push rknn_mobilenet_demo/ /

# 运行 demo
cd rknn_mobilenet_demo
[root@RV1126_RV1109:/rknn_mobilenet_demo]# ./build/rknn_mobilenet_demo ./model/mobilenet_v1_rv1109_rv1126.rknn ./model/dog_224x224.jpg
model input num: 1, output num: 1
input tensors:
index=0 name= n_dims=4 dims=[1 224 224 3] n_elems=150528 size=150528 fmt=0 type=3 qnt_type=2 fl=127 zp=127 scale=0.007843
output tensors:
index=0 name= n_dims=2 dims=[0 0 1 1001] n_elems=1001 size=2002 fmt=0 type=1 qnt_type=0 fl=127 zp=127 scale=0.007843
rknn_run
155 - 0.091736
156 - 0.851074
205 - 0.013588

RV1126主机测试

测试环境使用RV1126主机。文件系统是 Debian10。以下操作均在 RV1126上执行。

  • Firefly Debian10 固件 RKNN Toolkit Lite 安装步骤:

一、 安装依赖 numpy / psutils / ruamel.yaml

# 如果没有装 pip3 ,请先用 sudo apt-get update && sudo apt-get install python3-pip 装下
pip3 install numpy==1.16.3
pip3 install psutil==5.6.2
pip3 install ruamel.yaml==0.15.81

二、 安装 opencv-python 。用 pip3 安装会一直失败,所以直接在网上下载包。

# 先装以下依赖, wget 用到的两个 deb 包已经放在 rknn-toolkit-lite-v1.7.0.dev_0cfb22/requires/ 目录下
sudo apt-get install multiarch-support
wget http://security.debian.org/debian-security/pool/updates/main/j/jasper/libjasper1_1.900.1-debian1-2.4+deb8u6_armhf.deb
sudo dpkg -i libjasper1_1.900.1-debian1-2.4+deb8u6_armhf.deb
wget http://security.debian.org/debian-security/pool/updates/main/j/jasper/libjasper-dev_1.900.1-debian1-2.4+deb8u6_armhf.deb
sudo dpkg -i libjasper-dev_1.900.1-debian1-2.4+deb8u6_armhf.deb
sudo apt-get install libhdf5-dev
sudo apt-get install libatlas-base-dev
sudo apt-get install libqtgui4
sudo apt-get install libqt4-test
pip3 install rknn-toolkit-lite-v1.7.0.dev_0cfb22/requires/opencv_python-4.0.1.24-cp37-cp37m-linux_armv7l.whl

三、安装 RKNN Toolkit Lite

# 使用以下命令安装 RKNN Toolkit Lite
pip3 install rknn-toolkit-lite-v1.7.0.dev_0cfb22/packages/rknn_toolkit_lite-1.7.0.dev_0cfb22-cp37-cp37m-linux_armv7l.whl

四、 跑 example

cd rknn-toolkit-lite-v1.7.0.dev_0cfb22/examples-lite/inference_with_lite
python3 test.py

# 结果输出如下:
root@firefly:/home/firefly/rknn-toolkit-lite-v1.7.0.dev_0cfb22/examples-lite/inference_with_lite# python3 test.py
--> list devices:
*************************
None devices connected.
*************************
done
--> query support target platform
**************************************************
Target platforms filled in RKNN model:         ['RV1109']
Target platforms supported by this RKNN model: ['RK1109', 'RK1126', 'RV1109', 'RV1126']
**************************************************
done
--> Load RKNN model
done
--> Init runtime environment
done
--> get sdk version:
==============================================
RKNN VERSION:
  API: librknn_runtime version 1.6.0 (6523e57 build: 2021-01-15 15:56:31 base: 1126)
  DRV: 6.4.3.5.293908
==============================================

done
--> Running model
resnet18
-----TOP 5-----
[812]: 0.9993900656700134
[404]: 0.0004593880439642817
[657 833]: 2.9284517950145528e-05
[657 833]: 2.9284517950145528e-05
[895]: 1.850890475907363e-05

done

你可能感兴趣的:(智能硬件,RV1126)