[RKNN] 1. 入门介绍
[RKNN] 2. 模型转换和推理--API介绍&以yolox为例
[RKNN] 3. 零拷贝接口推理
[RKNN] 4. 基于零拷贝接口封装
平台介绍
上位机配置及使用
开发板环境配置
1. ubuntu20.04安装
2. 装必备软件
opencv
ros
npu
Why NPU?
CPU和GPU
NPU
最近半年一直在做部署,NCNN在树莓派上表现一般、TensorRT的Jetson系列开发板贵,看到了有国产的芯片听说效果还不错,而且相对来说资源和文档都不算很多,就来部署试试,留下这系列文章做个纪念。
这第一篇文章主要是环境说明和配置,NPU结构的介绍等。
本系列文章均采用搭载RK3588s的Orange Pi 5B,为了方便后续机器人上ROS的部署,系统采用Ubuntu20.04。硬件和系统本文就不再叙述了,硬件参数可以见板子的官网介绍。RKNN的资源可见下面的以下仓库,都包含了官方提供的中英文文档。
上位机模型转换和python推理:https://github.com/rockchip-linux/rknn-toolkit2
板载py简易的推理接口:https://github.com/rockchip-linux/rknn-toolkit2/tree/master/rknn_toolkit_lite2
板载C/C++推理API和demo,有更灵活的推理接口:https://github.com/rockchip-linux/rknpu2
python和C的api本系列都会进行实验,但是应该会以C为主。
首先RKNN也是类似TensorRT闭源的,只开放了API的接口以及编译好的链接库。而且比较难受的是,根据我看rknn-toollit2的文档,是不能用户自定义算子的,估计只能等待官方实现,所以不能类似使用CUDA编程配合TensorRT实现纯GPU的推理加速。
目前官方Github的仓库中commit版本是2023年5月26号提交的版本。rknn-toolskit2里面的packages中包含了编译好的python包,分别对应ubuntu16(python3.6)、ubuntu20(python3.8)、ubuntu22(python3.10),这个包是你本地机器(x86平台)用的,可以实现模型的转换、rknn模拟硬件npu的运行仿真以及推理等。
# 在ubuntu20.04 使用conda创建虚拟环境
conda create -n rknn python=3.8
conda activate rknn
# 默认会安装tensorflow、pytorch等太大了,加上 --no-deps 则不会自动安装
pip install rknn_toolkit2-1.5.0+1fa95b5c-cp38-cp38-linux_x86_64.whl --no-deps
# 可以注释仓库/doc/requirements_cp38-1.5.0.txt 中不想安装的包
pip install -r doc/requirements_cp38-1.5.0.txt
然后测试,会自动转换模型和使用npu模拟器进行推理
cd /examples/onnx/yolov5
python test.py
# 不报错并且能输出推理结果,应该就没问题了
5B开发板默认带的是一个安卓的系统,我这里开发需要使用ubuntu,所以按照官方教程往开发板的emmc中刷一个他们提供的arm版本的ubuntu20.04。官方仓库的OrangePi_5B_RK3588S_用户手册_v1.1.pdf的这个文件中具体操作流程。我使用的是2.6.1章节中的使用RKDevTool烧录,十分简单,按照它的步骤就可以了,最后的工具显示下图,就成功了,同时ubuntu系统已经启动了,默认用户名和密码都是orangepi。
然后用ssh远程登录到系统,就可以开始愉悦的操作了。
我后来才发现https://github.com/rockchip-linux/rknpu2/tree/master/examples/3rdparty这里有编译好的opencv以及其他常用的包。如果希望用最新版本的还是按照下面手动编译,否则直接用它的就行了
如果需要用c++版本的opencv或者有特别需求的需要像下面这样进行编译,只用python版本的话,直接pip就可以了
# 下载源码 https://opencv.org/releases/
# 我装的是最新版本4.8.0
# 安装一些基础包
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libgtk-3-dev libjpeg-dev libtiff5-dev libpng-dev
sudo apt-get install python3-dev python3-numpy
sudo apt-get install libeigen3-dev
# 进入解压后的源码路径
mkdir build && cd build
# 设置编译选项
cmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=YES CMAKE_INSTALL_PREFIX=/usr/local ..
# 开始编译
make -j8
# 安装
sudo make install
# 我这边是一路顺畅,大概编译了40-50min
强烈推荐小鱼的ros安装工具,简单易用小鱼的一键安装系列 | 鱼香ROS
wget http://fishros.com/install -O fishros && . fishros
# 安装ubuntu ros1 noetic
# 我这边安装也是一路顺畅
python接口测试
# 安装板载rknn toolkit_lite2
# https://github.com/rockchip-linux/rknn-toolkit2/tree/master/rknn_toolkit_lite2/packages
sudo apt install python3-pip
pip install rknn_toolkit_lite2-1.5.0-cp38-cp38-linux_aarch64.whl
# 测试 https://github.com/rockchip-linux/rknn-toolkit2/tree/master/rknn_toolkit_lite2/examples/inference_with_lite
python test.py
# 成功推理
C++接口测试
# https://github.com/rockchip-linux/rknpu2
# 这个里面的C++ demo也可以正常运行了,后续使用需要在CMakeLists.txt中修改相关库路径即可
由于不想为了介绍硬件结构单独开一个文章介绍,这里就一并说明了。在过去的许多年里,计算机的运算都是利用通用的CPU或者GPU进行的,近些年来芯片行业成为热门,FPGA、NPU等越来越多的使用,有什么区别呢?使用npu有什么优势呢?
CPU和GPU用的都比较多了,下图是两者的基本结构,可以看到两者都具有计算单元、控制单元、Cache等,但是CPU的ALU少于GPU,而Cache明显多于GPU,这种结构也使得CPU具有高兴能处理串行指令,GPU可以进行并行运算。更多介绍可以参考nvidia的cuda编程教程。
那NPU呢?既然串行和并行都有了,为什么还要有新的结构呢?NPU (NeuralNetworks Process Units)神经网络处理单元,它是专门为神经网络设计的,可以快速执行卷积、矩阵乘法等NN中最基本的运算单元,而且功耗更低,相同功耗下,NPU的性能比GPU更高。NPU与GPU加速不同,体现为每层神经元计算结果不用输出到主内存,而是按照神经网络的连接传递到下层神经元继续计算,因此其在运算性能和功耗上都有很大的提升。
下图是RKNN的NPU核心示意图