RK3568上面带了一个0.8T算力的NPU。目前RK的NPU采取的是自研架构,只支持使用不开源的驱动和库来操作。
rk的npu sdk分为两个部分,PC端使用的是rknn-toolkit2,可以在PC端进行模型转换,推理以及性能评估。具体来说是把主流的模型如Caffe、TensorFlow、TensorFlow Lite、ONNX、DarkNet、PyTorch 等转换为RKNN模型,并可以在PC端使用这个RKNN模型进行推理仿真,计算时间和内存开销。板端还有一部分,就是rknn runtime环境,包含一组C API库以及与NPU进行通信的驱动模块,可执行程序等。本文介绍如何使用rk的npu sdk。
以下命令是在x86 Ubuntu主机上执行而非YY3568
由于rknn-toolkit2运行环境有较多依赖,建议直接用docker的方式安装rknn的PC端环境,rk提供的docker已经包含了所有必须的环境。
1、卸载旧的docker版本
apt-get remove docker docker-engine docker.io containerd runc
2、安装依赖:
sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
3、信任docker的gpg公钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
要验证公钥是否添加成功,可以使用如下命令
apt-key fingerprint 0EBFCD88
4、添加软件源并安装
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
apt-get install docker-ce
要验证是否安装成功,可以使用如下命令
docker -v
以下命令是在x86 Ubuntu主机上执行而非YY3568
首先下载rknn-toolkit2。地址为
https://github.com/rockchip-linux/rknn-toolkit2
注意这个地方是没有docker的,这个页面有个RK的百度网盘链接,可以去这个链接获取docker
打开这个网盘链接,然后找到
下载这个文件即可。
然后如果想要更新rknn-toolkit,也可以在这个网盘里面找到。笔者这里用的是1.3的版本,和完整版sdk里面的一致.
下载之后,打开此docker所在的文件目录,然后执行
sudo docker load --input rknn-toolkit2-1.3.0-cp36-docker.tar.gz
然后执行
sudo docker images
可以看到此镜像已经被加载了
然后使用命令
sudo docker run -t -i --privileged -v /dev/bus/usb:/dev/bus/usb -v $(pwd)/rknn-toolkit2/examples/onnx/yolov5:/rknn_yolov5_demo rknn-toolkit2:1.3.0-cp36 /bin/bash
其中-v是将目录映射进 Docker 环境。这里映射的是rknn-toolkit2里面的一个example,也可以映射其他目录。另外/dev/bus/usb是后面使用adb调试的时候需要的。如果手上的板子有adb服务,可以开启这个,没有的话可以不开
上面命令中的 (pwd)/rknn-toolkit2/ 需要换成实际的rknn-toolkit2工程的目录,在此目录下有examples/onnx/yolov5文件夹
进入docker之后,通过ls命令查看根目录下面的文件,可以看到确实有文件夹rknn_yolov5_demo
在docker中进入rknn_yolov5_demo,并执行
python3 ./test.py
可以得到如下结果
然后转换之后的模型,则是存在于宿主机的rknn-toolkit2/examples/onnx/yolov5里面,其中
yolov5s.rknn 为支持rknn格式的模型
如果想看看在PC端仿真结果的图片,可以在test.py里面增加如下内容。
这样可以把结果输出到result.jpg,如下(左边是原图,右边是推理结果)
先打开rknn-toolkit2,需要重新生成适合在板端执行的rknn模型文件。前面介绍的方式,生成的rknn库是在PC上模拟运行的,要生成目标平台的,需要改一下test.py
如果没有adb,则只用在rknn.config加上参数 target_platform='rk3568'。如果有adb且需要连接adb调试,则需要在rknn.init_runtime增加参数。
然后再次在docker执行python3 ./test.py,得到yolov5s.rknn文件,这个文件是可以放到rk3568设备上运行的
然后在宿主机上面,打开rknpu2文件夹,这里还是要选择yolov5的demo。
cd rknpu2/examples/rknn_yolov5_demo
修改应用程序的编译脚本build-android_RK356X.sh。笔者使用的脚本可以通过下方链接下载,编译工具链都在sdk目录的prebuilts/gcc/linux-x86/aarch64里面。用户需要根据实际的sdk安装路径修改PATH 和 TOOL_CHAIN 变量。
build-linux_rk356x.sh
这里注意,要看这个板子的glibc库用的是什么编译器,如果用的是6.3.1就用这个6.3.1编译器路径,否则用9.3.0版本的那个。方法:把板上的libc-2.28.so复制到本地然后strings libc-2.28.so | grep gcc,rk sdk里面一般有两个编译器的。debian系统默认用的是6.3.1编译器。
执行build-android_RK356X.sh。之后,生成如下文件
将这个可执行程序,rknn模型,以及示例图片一起放到板上的同一个路径下面,可以使用ssh,adb等方式,笔者使用的是ssh。如下图
然后执行
./rknn_yolov5_demo ./model/yolov5s.rknn ./model/bus.jpg
会生成out.jpg在此目录下面,查看此文件
它和PC端模拟推理效果基本一样,不过图上没有把置信度打上。
到这里,就完成了一个rknn demo从PC端推理,到板上执行的整个流程。
如果提示缺少GLIBC-2.29,这种通常是交叉编译器配置有问题,解决方法:
# 查看系统支不支持glibc-2.29
strings /lib/aarch64-linux-gnu/libm.so.6 | grep GLIBC_
# 更新相关软件包
sudo apt-get install make gawk bison gcc
wget http://ftp.gnu.org/gnu/glibc/glibc-2.29.tar.gz
tar -zxvf glibc-2.29.tar.gz
cd glibc-2.29
mkdir build
cd build
../configure --prefix=/usr/local --disable-sanity-checks
make -j4
sudo make install
cp /usr/local/lib/libm-2.29.so /lib/aarch64-linux-gnu/
ln -sf libm-2.29.so libm.so.6
RKNN的完整版API可以参考。rknpu2/doc/Rockchip_RKNPU_User_Guide_RKNN_API_V1.3.0_CN.pdf