文章目录
- RKNPU 推理框架
- 推理软件框架
- RKNPU 硬件层:
- RKNPU 驱动层:
- RKNPU 应用层
- RKNN 模型
- RKNN 的工具链介绍
- RKNN 软件栈整体介绍
- RKNN-Toolkit2 功能介绍
- RKNPU2-SDK
- 总结
- 开发环境搭建
- PC 端采用 虚拟机上的 Ubunt20.04 系统
- 安装 anconda
- 通过 conda 创建虚拟环境
- 安装 RKNN-Toolkit2 依赖库
- 安装 RKNN-Toolkit2
- 验证 RKNN-Toolkit2 是否安装成功
- 板端使用 RK3588,安装的是 aarch64 的 linux 系统
- 板端 NPU 环境装备
- NPU 驱动版本确认
- NPU 连板环境确认
- RKNN Server 安装和更新
- RKNN 的模型评估工具
- 模型精度分析
- 模型性能分析
- 模型的内存评估
- 板端实际部署
- python 部署
- CPU、NPU 定频操作
- 查看 NPU 的占用率
RKNPU 推理框架
推理软件框架
RKNPU 硬件层:
RKNPU 驱动层:
RKNPU 驱动层是连接上层应用和 RKNPU 硬件的桥梁。驱动层的主要作用是将应用程序需要推理的内容提交给 RKNPU 进行计算,从而加速神经网络的训练和推理过程。具体来说, 驱动层需要完成以下任务:
1. 硬件初始化:包括设置寄存器,分配内存等操作;
2. 数据传输:将数据从主机内存中传输到 NPU 内存中,在计算完成后还需将计算结果传输回主机内存。
3. 计算任务调度:驱动层需要根据应用程序需求,管理和分配 RKNPU 的计算资源,确保多个计算任务之间不会相互干扰。
RKNPU 应用层
RKNPU 应用层由 AI 应用程序、RKNN API 以及运行时所需要的库所组成。通过调用瑞芯微提供好的 API 接口进行 AI 应用的开发,瑞芯微分别提供了 C 语言和 Python 语言这两种 API 帮助开发者进行嵌入式设备部署,Python 语言提供的接口较为简单, 旨在帮助用户进行前期的模型检测、测试以及应用调试,而要想得到更好的效果从而真正应用到实际项目中就要使用 C 的 API 接口。
而无论是由 C API 接口还是 Python 的 API 接口编写的应用程序,要想实际运行都需要相应 的动态库,动态库包含这些 API 的具体实现,这些动态库由瑞芯微所提供。而我们只需要根据 瑞芯微所提供的 API 编写对应的应用程序即可。
RKNN 模型
RKNN(Rockchip Neural Network)是瑞芯微公司开发的一种神经网络模型格式,它可以将常见的深度学习模型转换为适用于瑞芯微的 AI 加速器 RKNPU 的模型格式。RKNN 模型的优点是在保证精度的同时,可以实现高效的推理和低功耗的计算。
RKNN 模型的文件格式:使用自定义的文件格式来表示神经网络模型。它将神经网络模型划分为两个部分:静态部分和动态部分。静态部分包括模型的网络结构和权重,而动态部分包括输入输出的形状和类型等信息。使用这种格式可以减少模型的存储空间和加载时间。
RKNN 模型的转换工具:为了其他常见深度学习模型转换成 RKNN 模型,瑞芯微提供了一个转换工具 RKNN-Toolkit2。该工具支持将 TensorFlow、Caffe、MXNet 等框架训练出来的模型转换为 RKNN 模型,并且支持对模型进行量化、融合等优化操作,以提高运行效率。
RKNN 模型的部署和推理:RKNN 模型可以通过 RKNPU 硬件进行高效的推理。在部署 RKNN 模型时,开发者需要使用 RKNPU 提供的 SDK,并调用相应的 API 接口来加载和运行 RKNN 模型。 由于 RKNPU 硬件的优化,RKNN 模型可以实现高效的推理和低功耗的计算。
RKNN 的工具链介绍
RKNN 软件栈整体介绍
RKNN-Toolkit2 功能介绍
RKNN-Toolkit2是为用户提供在计算机上进行模型转换、推理和性能评估的开发套件,RKNN-Toolkit2的主要框图如下:
通过该工具提供的Python接口可以便捷地完成以下功能:
**1. 模型转换:**支持将PyTorch、ONNX、TensorFlow、TensorFlow Lite、Caffe、DarkNet等模型转为 RKNN模型。
**2. 量化功能:**支持将浮点模型量化为定点模型,并支持混合量化。
**3. 模型推理:**将RKNN模型分发到指定的NPU设备上进行推理并获取推理结果;或在计算机上仿真
NPU运行RKNN模型并获取推理结果。
**4. 性能和内存评估:**将RKNN模型分发到指定NPU设备上运行,以评估模型在实际设备上运行时的性
能和内存占用情况。
** 5. 量化精度分析**:该功能将给出模型量化后每一层推理结果与浮点模型推理结果的余弦距离和欧氏距
离,以便于分析量化误差是如何出现的,为提高量化模型的精度提供思路。
** 6. 模型加密功能:**使用指定的加密等级将RKNN模型整体加密。
仓库:https://github.com/airockchip/rknn-toolkit2
- docs 目录:包含了 RKNN-Toolkit2 的使用文档
- rknn-toolkit2 目录:其中的 examples 目录包含了 RKNN-Toolkit2 的一些示例代码;其中的 packages 目录提供了 不同 python 版本的安装包,对应 X86 平台的 Linux 操作系统,其是安装 在 PC 端 X86 平台 linux 系统上的。
- rknn_toolkit_lite2 目录:RKNN Toolkit lite2 相较于RKNN-Toolkit2 多 了 一 个 lite 后缀 , 可以简单的 理 解 为 RKNN-Toolkit2 的阉割版,只保留了推理的功能,可以帮助用户在开发板端进行模型的初步部署和测试。二者的区别如下:(1)RKNN-Toolkit2 提供的安装包架构为 X86_64,运行在日常使用的 PC 电脑上,一般情况下安装在虚拟机 ubuntu 上,而 RKNN-Toolkit lite2 提供的安装包架构为 aarch64,运行在 RK3568 或者 RK3588 开发板上;(2)RKNN-Toolkit2 可以进行模型转换、推理和性能评估,而 RKNN-Toolkit lite2 只保留了推理功能,用于模型的初步部署和调试。
RKNPU2-SDK
examples 目录包含了 RKNPU2 SDK 的一些示例代码和第三方库。通过这些示例代码,可以 帮助我们更快速的掌握 RKNPU2 所提供的一些 C API 接口和使用流程。
runtime目录用于存放API运行时依赖的动态库和头文件,并且提供了一个名为rknn_server 的可执行程序,在后面 RKNN-Toolkit2 连板推理时会用到。
RKNPU2 SDK 和 RKNN-Toolkit lite2 要实现的功能相同,都是在开发板部署 RKNN 模型,然 后进行推理,只是相较于 RKNN-Toolkit lite2 提供了更多的接口,调用起来较为复杂,但可以获得更好的运行效果。
总结
开发环境搭建
PC 端采用 虚拟机上的 Ubunt20.04 系统
通过 pip 方式安装
安装 anconda
通过 conda 创建虚拟环境
conda create -n RKNN-Toolkit2 python=3.8
conda activate RKNN-Toolkit2
安装 RKNN-Toolkit2 依赖库
下载 rknn-toolkit2 的仓库:git clone https://github.com/airockchip/rknn-toolkit2/tree/master
进入到以下路径中:
选择你对应的 python 版本,执行如下命令:
pip install -r requirements_cp38-2.2.0.txt
安装 RKNN-Toolkit2
进入到以下路径中:
选择你对应的 python 版本,执行如下命令:
pip install rknn_toolkit2-2.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
验证 RKNN-Toolkit2 是否安装成功
python
>>> from rknn.api import RKNN
板端使用 RK3588,安装的是 aarch64 的 linux 系统
板端 NPU 环境装备
NPU 驱动版本确认
cat /sys/kernel/debug/rknpu/version
Rockchip的固件均自带RKNPU驱动。若以上命令均查询不到NPU驱动版本,则可能为第三方固件未安装RKNPU驱动。
NPU 连板环境确认
RKNN-Toolkit2的连板调试功能依赖板端的RKNN Server程序,该程序是一个运行在开发板上的后台代理服务,用于接收PC通过USB传输过来的命令和数据,然后调用相应的运行时接口,并返回相应结果给PC。所以在做连板调试前需要确认开发板是否已启动RKNN Server程序。
在板端执行如下命令:
ps | grep rknn_server
若正常启动,则结果如下:
若没有查询到RKNN Server进程ID,则执行以下命令手动启动RKNN Server后再进行查询。
nohup /usr/bin/rknn_server >/dev/null&
RKNN Server 安装和更新
RKNN-Toolkit2 的连板调试功能要求板端已安装 RKNPU2 环境,并且启动 RKNN Server 服务。以下是RKNPU2 环境中的2个基本概念:
- RKNN Server: 运行在开发板上的后台代理服务,用于接收PC通过 USB 传输过来的数据,然后执行板端 Runtime 对应的接口,并返回结果给 PC。
- RKNPU2 Runtime 库:
- librknnrt.so: 是用于 RK3562 / RK3566 / RK3568 / RK3576 / RK3588 板端的 Runtime 库。
- librknnmrt.so: 是用于 RV1103 / RV1103B / RV1106 / RV1106B板端的 Runtime 库。
RKNN 的模型评估工具
模型精度分析
查看量化模型推理结果是否有问题,可以使用** rknn.accuracy_analysis() **接口进行精度分析,查看每层算子的精度。
精度分析接口 rknn.accuracy_analysis() 参数如下:
- inputs:输入文件路径列表(格式包括 jpg 、 png 、 bmp 和 npy )。
- output_dir:分析结果保存目录,默认值为’ ./snapshot '。
- target:目标硬件平台。默认值为 None ,使用仿真器进行精度分析。如果设置了target(RK3562 /RK3566 / RK3568 / RK3588 / RK3576 / RV1103 / RV1103B / RV1106 / RV1106B),则会获取运行时每一层的结果,并进行精度分析。
- device_id:设备编号。默认值为 None 。若有设置target则选择唯一一台设备进行精度分析。如果电脑连接多台设备时,需要指定相应的设备ID。
simulator_error:
entire: 从输入层到当前层 simulator 结果与 golden 结果对比的余弦距离和欧氏距离。
single: 当前层使用 golden 输入时,simulator 结果与 golden 结果对比的余弦距离和欧氏距离。
runtime_error:
entire: 从输入层到当前层板端实际推理结果与 golden 结果对比的余弦距离和欧氏距离。
single: 当前层使用 golden 输入时,板端当前层实际推理结果与 golden 结果对比的余弦距离和欧氏距离。
注:
- 精度分析工具会保存模型在推理时网络每一层的输出结果,因此如果模型太大且开发板上存储容量不够会导致运行失败。
- .通过 rknn.load_rknn() 加载RKNN模型后,因RKNN模型缺失原始模型信息,因此无法使用模型精度分析功能。精度分析工具只能通过rknn.load_onnx(model=ONNX_MODEL),加载 onnx 模型来构建 rknn,才可以使用精度分析工具。
模型性能分析
接口 rknn.eval_perf() 会输出当前的硬件频率并获取模型的性能评估结果, fix_freq 参数表示是否需要尝试对
硬件(包括CPU/NPU/DDR)定频,如果要对硬件定频则设置成 True ,否则设置成 False ,默认值为True 。若初始化时 rknn.init_runtime() 的 perf_debug 参数设置为 True ,将输出每一层的耗时情况和总耗时情况,若为 False 则只输出总耗时情况。
ret = rknn.init_runtime(target=platform, perf_debug=True)
perf_detail = rknn.eval_perf()
以RK3588为例,执行eval_perf后输出的硬件频率如下(不同固件支持的频率可能会有所差异),其中,由于RK3588 CPU是大小核架构,CPU频率栏会输出多个频率值,单位为KHz,而NPU和DDR频率单位都是Hz。
性能评估结果如下:
模型的内存评估
接口 rknn.eval_memory() 可以获取模型的内存消耗评估结果。初始化时 rknn.init_runtime() 的 eval_mem 参数设
置为 True ,将输出各部分内存消耗情况。
ret = rknn.init_runtime(target=platform, eval_mem=True)
memory_detail = rknn.eval_memory()
模型内存评估结果如下:
板端实际部署
python 部署
CPU、NPU 定频操作
- 查看当前 cpu 频率
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
- 查看 cpu 可用频率
cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies
查看 NPU 的占用率
sudo cat /sys/kernel/debug/rknpu/load