第一章:认识NPU
1.1 NPU的起源
在探讨NPU之前,让我们先了解一下CPU和GPU。CPU,即中央处理器,类似于人类的大脑,主要负责逻辑控制和任务调度。然而,CPU的计算能力相对较弱。而GPU则是一种图形处理器,专用于图形处理,因此需要进行大量的计算。相比之下,GPU在计算方面表现出色,但在逻辑控制和任务调度方面相对较弱。因此,我们可以将GPU视为CPU的补充。
然而,随着人工智能和大数据时代的到来,以往的嵌入式处理器中的CPU和GPU逐渐无法满足不断增长的需求,尤其是在深度学习领域。为了满足这种不断增长的需求,NPU(神经网络处理器)应运而生。NPU的目标是提供更强大的计算能力,尤其是在处理深度学习任务方面。通过采用高效的算法和专门的硬件设计,NPU能够加速神经网络计算及相关任务,从而提供更高的性能和效率。
综上所述,NPU是为了应对日益增长的人工智能和大数据需求而设计的处理器。它通过优化的算法和硬件设计,提供高性能和高效率的神经网络计算能力,尤其在深度学习领域具有突出的表现。如下图所示:
NPU,全称为神经网络处理器(Neural Process Unit),在电路层面模拟了人类的神经元和突触,因此在处理人工智能任务方面表现出色。
NPU的出现极大地减轻了CPU和GPU的负担。在任务处理过程中,首先经过CPU的处理,然后根据任务性质决定是分配到GPU还是NPU。对于图像处理方面的任务,交由GPU处理;而对于人工智能方面的任务,交由NPU处理。
NPU广泛应用于多个领域,包括人脸跟踪、视频监控、先进的驾驶员辅助系统(ADAS)、智能语音等。它的应用场景非常多样化,涵盖了许多重要的任务和功能。
1.2 RKNPU的发展历程
为了满足人工智能的需求,瑞芯微的处理器逐渐开始集成NPU,并将其内置于处理器中,命名为RKNPU。
RKNPU经历了几代的发展。首先,第一代RKNPU从RK3399pro和RK1808开始引入,相较于传统的CPU和GPU,在深度学习计算能力方面有了显著提升。接下来,第二代NPU在RV1109和RV1126上使用,进一步提升了NPU的利用率。第三代RKNPU应用于RK3566和RK3568,采用全新的自研NPU架构。
这一系列RKNPU的发展过程如下图所示。
瑞芯微的RK3568芯片内置的NPU是RKNPU第三代的代表产品。它具备全新的自研架构,支持多种卷积运算和混合操作,提供强大的神经网络加速处理性能,并包含CNA、DPU和PPU模块,用于加速卷积、数据处理和Pooling操作。
NPU开发完整的流程如下图所示:
1、模型训练
在模型训练阶段,用户根据需求和实际情况选择合适的框架(如Caffe、TensorFlow等)进行训练得到符合需求的模型。也可直接使用已经训练好的模型。
2、模型转换
此阶段为通过RKNN Toolkit把模型训练中得到的模型转换为NPU可用的模型。
3、程序开发
最后阶段为基于RKNN API或RKNN Tookit的Python API开发程序实现业务逻辑。
第二章 快速上手RKNPU2
2.1 获取SDK
1、首先,下载rknpu2并拷贝虚拟机Ubuntu(获取路径在3.1小节),如下图所示,RKNPU2 提供了访问rk3568 芯片 NPU 的高级接口,其API为C语言构成,常用于在开发板上构建模型与推理。
2、将rknpu2_1.3.0.tar.gz压缩包解压到当前文件夹,如下图所示
RK356X平台 NPU SDK 包含了 API 使用示例程序、NPU 运行库、服务程序、文档。服务程序称为 rknn_server,是在开发板上常驻的服务进程,用于连板推理。
其中doc目录放着提供给用户的帮助文档,如下图所示:
examples目录放着许多demo,如下图所示:
在 RKNN SDK 中提供了 Linux 平台的 MobileNet 图像分类、SSD 目标检测、 YOLOv5目标检测示例。这些 Demo 能够为客户基于 RKNN SDK 开发自己的AI 应用提供参考。
值得注意的是,runtime目录用于存放API运行时所需的运行库与头文件
2.2 RKNPU2 的编译及使用方法
下面以 rknpu2/examples 下的 rknn_yolov5_demo 在 RK3568 Linux 64 位平台(buildroot 系统)上运行为例,来讲解如何快速上手运行。
1、设置交叉编译器
我们知道,在linux开发中。涉及编译时,总少不了交叉编译器的配置。用户可查看《TQ3568平台编译手册》对交叉编译器进行下载安装。
2、修改编译工具路径
因为此章节以 rknn_yolov5_demo 在 RK3568 Linux 64 位平台上运行为例, 所以修改 examples/rknn_yolov5_demo/build-XXX.sh 的编译工具路径,如下图所示:
修改build-linux_RK356X.sh 文件,将 TOOL_CHAIN和GCC_COMPILER。修改内容如下所示:
·
·
TOOL_CHAIN=/opt/EmbedSky/TQ3568/tools/aarch64-linux-gcc-v9.3GCC_COMPILER=$TOOL_CHAIN/bin/aarch64-linux
3、更新 RKNN 模型
一般来说,想要使用RKNPU进行推理学习。先要使用RKNN-Toolkit工具将常见的深度学习模型转换成适用于RKNPU的模型格式(.rknn结尾的模型文件)。接着,应用程序加载转换好的模型,调用RKNPU进行推理加速。
RKNN SDK 提供的 demo 程序中默认自带了 RKNN 模型,我们无需再进行模型转换,此模型在RKNN SDK 的 examples/rknn_yolov5_demo/model/RK356X/目录下,如下图所示:
如使用自己的模型需要转换成 rknn 模型,转换方法可以参考第 5 章节。
在得到 RKNN 模型之后,demo 程序使用 C 接口在 RK3568 平台开发应用,如下图所示:
2.3 编译 rknn_yolov5_demo
1、在终端命令窗口进入 rknn_yolov5_demo 文件夹,输入以下命令:
·
cd examples/rknn_yolov5_demo/
2、运行 build-android_RK356X.sh 脚本编译程序
·
./build-linux_RK356X.sh
备注:
1) 此例子为编译 RK356X 的Linux 64 位平台。若需要编译其他平台请选择相应的脚本。详情可参考/rknpu2/examples/rknn_yolov5_demo/README.md。
2) 若在编译时出现 cmake 错误,可执行以下命令安装 cmake 后再运行编译脚本。
·
sudo apt install cmake
3、编译完成之后,编译好的程序一般放在 install 目录,如下图所示:
4、网盘中也提供了编译好的Demo,可以在网盘资料"\02_ 【iTOP-RK3568 开发板】开发资料\11_NPU 使用配套资料\02_NPU demo\Linux"下载。
2.4 在板端运行 rknn_yolov5_demo
1、将运行时所需的库文件拷贝到开发板的/usr/lib 目录下
值得注意的是,库文件在runtime/RK356X/Linux/librknn_api/aarch64/目录下,如下图所示:
在librknn_api目录下,使用ADB命令将库文件传到开发板
·
adb push aarch64/* /usr/lib
2、把编译好的程序rknn_yolov5_demo_Linux通过ADB上传到开发板的根目录上, 开发板上要烧写 linux 系统(buildroot)。
·
adb push rknn_yolov5_demo_Linux/ /
在开发板终端查看,如下图所示:
3、设置库文件的路径
·
export LD_LIBRARY_PATH=./lib
4、进入程序所在目录
·
cd /rknn_yolov5_demo_Linux
5、 运行程序识别相应的图片中物体的类别
用法 Usage: ./rknn_yolov5_demo <rknn model><jpg>
·
./rknn_yolov5_demo ./model/RK356X/yolov5s-640-640.rknn ./model/bus.jpg
6、将生成的图片下载至本地电脑中查看
·
adb pull rknn_yolov5_demo_Linux/out.jpg ./
第三章:RKNPU开发环境搭建
3.1 工具路径说明
3.1.1 RKNN SDK说明
要使用 RKNPU,需要下载 RKNN SDK。RKNN SDK 对RKNPU提供对外编程接口,能够帮助用户部署使用RKNN-Toolkit2导出的RKNN模型,加速AI应用的落地。SDK里也有许多模型的demo,供用户参考开发。
请用户自行把RKNN SDK拷入Ubuntu虚拟机中。RKNN SDK的下载地址位于“\08_开发板配套工具\Linux平台工具\NPU 使用配套资料\01_rknpu2 工具”。
3.1.2 RKNN-Toolkit2工具说明
在使用RKNN SDK之前,用户需要使用RKNN-Toolkit2工具将自主研发的算法模型转换为RKNN模型。RKNN是Rockchip NPU平台(即开发板)所使用的模型类型,其文件以.rknn结尾。一旦获得RKNN模型,用户可以选择使用C接口在RK3568平台上开发应用程序。至于如何将其它模型转换为rknn模型,在4.1小节有将onnx模型转换为rknn模型的例程,供用户参考。
请用户自行把RKNN-Toolkit2工具拷入Ubuntu虚拟机中。RKNN-Toolkit2工具的下载地址为“\08_开发板配套工具\Linux平台工具\NPU 使用配套资料\02_rknn-toolkit2工具”。
3.2 RKNN-Toolkit环境搭建
3.2.1 RKNN-Toolkit2 介绍
RKNN-Toolkit是为用户提供在 PC、 Rockchip NPU 平台上进行模型转换、推理和性能评估的开发套件,用户通过该工具提供的 Python 接口可以便捷地完成以下功能:
1、模型转换
支持Caffe、Tensorflow、TensorFlow Lite、ONNX、Darknet、Pytorch、MXNet 模型转成 RKNN 模型,支持 RKNN 模型导入导出,后续能够在 Rockchip NPU 平台上加载使用。从1.2.0版本开始支持多输入模型。从1.3.0版本开始支持 Pytorch 和 MXNet。
2、量化功能
支持将浮点模型转成量化模型, 目前支持的量化方法有非对称量化( asymmetric_quantized-u8 ) , 动态定点量化 ( dynamic_fixed_point-8 和 dynamic_fixed_point-16)。从1.0.0版本开始, RKNN-Toolkit 开始支持混合量化功能。
3、模型推理
能够在 PC 上模拟 Rockchip NPU 运行 RKNN 模型并获取推理结果;也可以将 RKNN 模型分发到指定的 NPU 设备上进行推理。
4、性能评估
能够在 PC 上模拟 Rockchip NPU 运行 RKNN 模型,并评估模型性能(包括总 耗时和每一层的耗时);也可以将 RKNN 模型分发到指定 NPU 设备上运行,以评估模型 在实际设备上运行时的性能。
5、内存评估
评估模型运行时对系统和 NPU 内存的消耗情况。使用该功能时,必须将 RKNN 模型分发到 NPU 设备中运行,并调用相关接口获取内存使用信息。从0.9.9版本开始支持该功能。
RKNNToolkit2 工具包中还包含了 RKNN Toolkit Lite2 工具,RKNN Toolkit Lite2 工具只可以在开发板上部署运行 RKNN 模型,不能进行模型转换,如果非RKNN 模型,请使用 RKNN-Toolkit2 来进行转换。
3.2.2 使用pip 安装RKNN-Toolkit2
用户可以使用我司提供的 Ubuntu20.04版本虚拟机镜像,已经配置了开发环境。值得注意的是,由于RKNN SDK与RKNN-Toolkit2工具过大,不宜放入虚拟机镜像中,以免用户下载时间过长,请用户根据3.1小节自行将工具拷入Ubuntu系统中。
虚拟机镜像下载路径为:
"08_开发板配套工具\Linux平台工具\NPU 使用配套资料\03_Ubuntu20.04_NPU"。
接下来讲解如何自行搭建开发环境。下面的例子是20.04版本的ubuntu系统。
3.2.2.1 创建 virtualenv 环境
值得注意的是,以下所有安装命令,若提示权限不足,请在前面加上sudo执行。
1、安装所需的依赖包:
·
·
·
apt-get install python3 python3-dev python3-pip apt-get install libxslt1-dev zlib1g zlib1g-dev libglib2.0-0 libsm6 libgl1-mesa-glx libprotobuf-dev gcc
2、如果系统中同时有多个版本的 Python 环境,建议使用 virtualenv 管理 Python 环境,作者使用virtualenv管理python环境,输入以下命令安装:
·
apt install virtualenv
3、由于Ubuntu 20.04中默认的 python 环境为 python3.8,那么此时创建的虚拟环境是以 python3.8 创建的虚拟环境,选择 python3 来创建虚拟化环境,输入如下命令:
值得注意的是,embedsky_rknn为自创的目录,请在embedsky_rknn所在目录执行以下命令,笔者的embedsky_rknn目录在/home/embedsky/目录下。
·
virtualenv -p /usr/bin/python3 embedsky_rknn #embedsky_rknn可以改为其它名称
4、激活虚拟化环境,输入以下命令:
·
source embedsky_rknn/bin/activate
可以看到,前方出现了(embedsky_rknn)代表虚拟化环境激活成功。
3.2.2.2 安装 Python 库依赖
1、打开rknn-toolkit2-1.3.0/doc/requirements_cp38-1.3.0.txt文件
·
vi rknn-toolkit2-1.3.0/doc/requirements_cp38-1.3.0.txt
将numpy==1.17.3更改为1.20.3如下图所示:
保存退出,若提示文件只读。请使用更高权限打开此文件进行修改。
2、为了安装方便,我们使用如下命令安装。这里要注意!20版本的UBuntu默认 python 为 3.8版本,使用 requirements_cp38-1.3.0.txt。(具体路径请以实际为准)
·
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r /opt/rknn-toolkit2-1.3.0/doc/requirements_cp38-1.3.0.txt
可以发现,会报以下错误:
解决方法:执行以下语句安装1.20.3版本的numpy
·
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy==1.20.3
重新执行安装语句,python库依赖安装成功如下图所示:
·
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r /opt/rknn-toolkit2-1.3.0/doc/requirements_cp38-1.3.0.txt
3.2.2.3 安装 RKNN-Toolkit
1、输入以下命令进入 rknn_toolkit2*.whl安装包目录,如下所示:
·
cd xxx/rknn-toolkit2-1.3.0/packages
2、输入以下命令安装 rknn_toolkit2
·
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple rknn_toolkit2-1.3.0_11912b58-cp38-cp38-linux_x86_64.whl
可以发现,有版本兼容问题报错。这个对我要实现的功能无关紧要,继续往下。
3、输入以下语句检查 RKNN-Toolkit2 是否安装成功, 若没有提示错误,说明 RKNN 库安装成功,安装成功如下图所示:
·
·
python3 from rknn.api import RKNN
5、如上图所示,确认已成功安装RKNN-Toolkit2后,按住"ctrl+d"即可退出python3。
第四章 RKNN-Toolkit2工具的使用
4.1 在PC端模拟推理
RKNN-Toolkit2 自带了一个模拟器,在 Ubuntu20.04 上运行 demo 程序即是在仿真 NPU模拟器上运行 demo。以下演示如何在模拟器上运行 RKNN-Toolkit2 工具自带的 yolov5.onnx 模型。
1、cd 进入rknn-toolkit2-1.3.0/examples/onnx/yolov5目录
·
cd rknn-toolkit2-1.3.0/examples/onnx/yolov5
2、执行以下命令转换 yolov5s.onnx 为 rknn 模型并运行模型推理图片
·
python3 test.py
3、运行模型如下图所示
由上图结果可以看出,图上有三个人和一个巴士,所在坐标与原图相符,推理图片成功。原图如下图所示:
4、转换后的模型保存在执行test.py程序的同级目录下,如下图所示:
成功将模型转换成.rknn模型后,该模型就可以被RKNPU识别并推理。
4.2 RKNN-Toolkit2 连板推理
1、首先,开发板烧写 Android11系统,连接好电源线、串口线、公对公的双头USB烧写线,一头连接开发板,一头连接PC端。
上电,虚拟机UBuntu会弹出以下内容,我们选择将USB连接虚拟机。
2、查看板子设备
·
adb devices
由上图所示,可以看到TQ3568开发板的id为“e0912a58aa7da2cd”,连接成功。
3、进入 RKNPU2 SDK目录,如下所示:
4、执行以下命令使adb 获得开发板 root 权限
·
adb root
5、执行以下命令重新挂载开发板
·
adb remount
6、更新板子的 rknn_server 和 librknnrt.so
librknnrt.so: 是一个板端的 runtime 库。
rknn_server: 是一个运行在板子上的后台代理服务,用于接收 PC 通过 USB 传输过来的协议, 然后执行板端 runtime 对应的接口,并返回结果给PC。
7、执行以下命令将rknn_server推送拷贝到开发板上
·
adb push runtime/RK356X/Android/rknn_server/arm64/rknn_server /vendor/bin
8、执行以下面临将librknnrt.so推送拷贝到开发板上
·
adb push runtime/RK356X/Android/librknn_api/arm64-v8a/librknnrt.so /vendor/lib64
9、打开 adb shell 命令行,即可操作TQ3568开发板,修改rknn_server权限:
·
·
·
·
adb shell chmod +x /vendor/bin/rknn_server #修改rknn_server权限 sync reboot
10、Android 系统启动时会自动运行 rknn_server, "ps -ef|grep rknn_server"可以查看是否运行,如下图所示
·
ps -ef | grep rknn_server
11、我们进入 rknn-toolkit2-1.3.0 文件夹。以 demo(onnx/yolov5)为例,使用 rk3568 平台进行推理。输入以下命令进入 examples/onnx/yolov5 文件夹。
·
cd examples/onnx/yolov5
12、修改 examples/onnx/yolov5/test.py 文件,我们修改对应的平台为 rk3568,修改的地方分别在235行和265行附近,修改如下所示:
13、执行以下命令,激活虚拟化环境
·
source embedsky_rknn/bin/activate
14、在运行模型之前,执行以下语句检查开发板是否被识别到,保证后续数据能被正确传输。
·
adb devices
15、进入到 examples/onnx/yolov5 文件夹,输入以下命令,执行模型转换和推理模 型的 test.py 脚本
·
cd examples/onnx/yolov5 python test.py
由上图结果可以看出,图上有三个人和一个巴士,所在坐标与原图相符,推理图片成功。原图如下图所示: