RK3588上面带了一个6 Tops算力的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。
RKNN库源码获取有两种方式。
如果要保持和板上的动态库一致,则需要拉取风火轮科技提供的整个SDK。
rknn-toolkit2 源码在SDK根目录的
external/rknn-toolkit2
rknpu2 源码在SDK根目录的
external/rknpu2
下,建议将这两个源码拷贝到一个单独的工作目录使用
如果想要体验最新版本的rknn,可以直接从rk的git上面拉取,其git地址为
以下命令是在x86 Ubuntu主机上执行
由于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主机上执行
首先下载rknn-toolkit2。地址为
https://github.com/rockchip-linux/rknn-toolkit2
注意这个地方是没有docker的,这个页面有个RK的百度网盘链接,可以去这个链接获取docker
打开这个网盘链接,然后找到
下载这个文件即可。
然后如果想要更新rknn-toolkit,也可以在这个网盘里面找到。建议选择跟sdk里面那个版本一致的。
下载之后,打开此docker所在的文件目录,然后执行
sudo docker load --input rknn-toolkit2-1.5.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.5.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格式的模型
推理结果保存在此目录的result.jpg,如下(左边是原图,右边是推理结果)
先打开rknn-toolkit2,需要重新生成适合在板端执行的rknn模型文件。前面介绍的方式,生成的rknn库是在PC上模拟运行的,要生成目标平台的,需要改一下test.py
如果没有adb,则只用在rknn.config加上参数 target_platform='rk3588'。如果有adb且需要连接adb调试,则需要在rknn.init_runtime增加参数。
然后再次在docker执行python3 ./test.py,得到yolov5s.rknn文件,这个文件是可以放到rk3588设备上运行的
然后在宿主机上面,打开rknpu2文件夹,这里还是要选择yolov5的demo。
cd rknpu2/examples/rknn_yolov5_demo
修改应用程序的编译脚本build-linux_RK3588.sh。编译工具链都在sdk目录的prebuilts/gcc/linux-x86/aarch64里面。用户需要根据实际的sdk安装路径修改PATH 和 TOOL_CHAIN 变量。
执行build-linux_RK3588.sh。之后,生成如下文件
将这个可执行程序,rknn模型,以及model文件夹下面的bus.jpg和coco_80_labels_list.txt 一起放到板上的同一个路径下面,可以使用ssh,adb等方式。
然后在此路径下执行
./rknn_yolov5_demo ./model/yolov5s.rknn ./model/bus.jpg
会生成out.jpg在此目录下面,查看此文件
它和PC端模拟推理效果基本一样,置信度相差不大
到这里,就完成了一个rknn demo从PC端推理,到板上执行的整个流程。