----------------------------------------------------------------------------------------------------------------------------
开发板 :ArmSoM-Sige7
开发板eMMC
:64GB
LPDDR4
:8GB
显示屏 :15.6
英寸HDMI
接口显示屏u-boot
:2017.09
linux
:5.10
----------------------------------------------------------------------------------------------------------------------------
在《Rockchip RK3588 - Rockchip Linux SDK Buildroot
文件系统构建》我们对Buildroot
文件系统进行了详细的介绍,不过不知道你有没有留意到在配置环节【配置Target packages
】中,需要配置Rockchip
板级支持包,这些板级支持包是由Rockchip
提供的,本节的目的实际上就是研究部分核心板级支持包,比如OpenGL ES
、rknpu
。
至于为什么去研究这些很简单,比如我们自己在做ubuntu
根文件系统的时候,我们通常需要移植适配于硬件的动态库,因此我们就需要参考Rockchip Linux SDK
文件系统的实现。
一、板级支持包回顾
回顾《Rockchip RK3588 - Rockchip Linux SDK Buildroot
文件系统构建》文章【配置Target packages
】小节中的配置:
Target packages --->
Hardware Platforms --->
[*] Rockchip Platform --->
Rockchip SoC (rk3588) --->
( ) rk3358 chip
(X) rk3588 chip
......
[*] Rockchip Camera Engine For ISP
Rockchip BSP packages ---> // Rockchip板级支持包,很重要
[*] Rockchip Camera Engine 3A service run in booting
Specify a directory to store xml speed up bin (disabled) --->
() Rockchip Camera Engine IQ xml file
[ ] rockchip common algorithm
[*] gstreamer1-rockchip
[*] A rockchip-mpp V4L2 wrapper plugin for chromium V4L2 VDA
[ ] Rockchip NPU power control for linux
[ ] Rockchip NPU power control combine for linux
[ ] rk n4 camera
[ ] Rockchip recovery for linux
[ ] rknpu
[ ] rknpu pcie
[ ] rknpu2
[ ] rknn_demo
[*] rockchip script
() default PCM
[ ] rkscript iodomain notice script
......
[ ] Rockchip rkupdate for linux
[*] rkwifibt
[ ] Enable static
[ ] rkwifibt wireless applicantion
[*] rockchip-alsa-config
[*] rockchip-rga
[*] prefer using rockchip-rga
[*] rockchip-mali
......
[*] wayland winsys
[*] GBM
[*] OpenGL EGL
[*] OpenGL EGL Wayland
[*] OpenGL ES
[*] OpenCL
[ ] Vulkan
[*] rockchip-mpp --->
......
除了我们在OTA
升级中介绍过的Rockchip recovery for linux
,还有一堆其它的编译选项,比如rknpu
、OpenGL ES
等,你可能好奇这些配置项是用来做什么的,但是请你按住性子往下看下去,我们会在后续文章一一介绍这些编译配置选项。
二、RKNPU
介绍
2.1 NPU
的由来
NPU
(Nerual Processing Unit
)是一种专门用于加速神经网络计算的处理器。
在深度学习技术刚开始流行的时候,人们主要使用通用计算设备,如CPU
和GPU
,来执行神经网络计算。但是,随着神经网络的复杂度和规模不断增加,传统的计算设备已经不能满足快速、高效地执行神经网络计算的需求。因此,研究人员开始探索如何设计一种专门用于加速神经网络计算的处理器,这就是NPU
的由来。
早期的NPU
主要是基于FPGA
(Field Programmable Gate Array
)实现的。FPGA
是一种可编程逻辑器件,可以通过编程实现各种不同的电路功能。由于FPGA
具有高度的灵活性和可编程 性,可以用于实现各种不同类型的神经网络处理器。
2010
年,斯坦福大学的研究人员提出了一种基于FPGA
的神经网络加速器,可以实现高效的神经网络计算。此后,越来越多的研究人员开始尝试使用FPGA
实现NPU
。
随着深度学习技术的不断发展和普及,NPU
的研究和开发也取得了越来越多的进展;
2013
年,Google
发布了一篇论文,介绍了一种名为Tensor Processing Unit
(TPU
)的定制芯片,专 门用于加速深度学习模型的训练和推理。TPU
采用了特定的硬件架构和优化算法,可以实现高效、低功耗的神经网络计算。TPU
的成功引起了业界的广泛关注,也促进了NPU
的发展。 随后,其他公司也开始研发自己的NPU
2015
年,华为发布了一款名为Kirin 950
的处理 器,集成了一种名为Neural Processing Unit
(NPU
)的模块,用于加速神经网络计算;2017
年,苹果公司在2017
年发布的A11
芯片中集成了神经网络处理器,用于支持人脸识别等功能;2018
年,华为推出了全新的昇腾(Ascend
)系列处理器,其中包括专门用于加速深度学习计算的NPU
模块。同年,英伟达推出了名为TensorCore
的加速器,用于加速深度学习模型的训练和推理;
随着NPU
技术的不断发展和普及,越来越多的公司开始将NPU
集成到自己的芯片中,以 速神经网络计算。瑞芯微为了满足人工智能的需要,瑞芯微的处理器也逐渐集成了NPU
,而瑞芯微处理器内置的NPU
,就被称之为RKNPU
。
2.2 RKNPU
介绍
到目前为止,RKNPU
已经经过了几代的发展,趋近成熟;
RK3399pro
和RK1808
初次引入了RKNPU
,相比传统的CPU
和GPU
,在深度学习运算能力上有比较大幅度的提升;- 接下来在
RV1109
和RV1126
上使用了第二代NPU
,提升了NPU
的利用 率; - 第三代
NPU
应用在RK3566
和RK3568
上,搭载全新NPU
自研架构; - 而
RK3588
搭载的 为第四代NPU
,提高了带宽利用率,支持了多核扩展。
RKNPU
具体发展过程如下图所示:

RKNPU1.0
和RKNPU2.0
被划分为了RKNPU
,而RKNPU3.0
、RKNPU4.0
和RKNPU5.0
被划分为了RKNPU2
,RKNPU
和RKNPU2
所使用的SDK
和工具套件不同。
RK3568
和RK3588
的NPU
具有的功能如下:
SoC类型 | NPU功能描述 |
---|---|
RK3588 | (1)拥有三个NPU核心 (2)支持三核协同工作,双核协同工作和独立工作 (3)使用AHB接口配置 NPU (4)使用AXI接口从内存中获取数据 (5)支持int4、int8、int16、float16、Bfloat16和tf32操作 (6)每个周期可进行1024x3 个int8 MAC操作 (7)每个周期可进行512x3 个int16 MAC操作 (8)每个周期可进行512x3 个float16 MAC操作 (9)每个周期可进行512x3 个bfloat16 MAC操作 (10)每个周期可进行256x3 个tf32 MAC操作 (11)每个周期可进行 2048x3 个int4 MAC操作 (12)每个核心有384KB的内部缓存 (13)支持转换的推理模型:TensorFlow、Caffe、Tflite、Pytorch、Onnx NN |
RK3568 | (1)NPU支持以下特性: (2)使用AHB接口配置 NPU (3)使用AXI接口从内存中获取数据 (4)支持int8、int16、float16、Bfloat16 操作(5)每个周期可进行512个int8 MAC操作 (6)每个周期可进行128 个int16 MAC操作 (7)每个周期可进行128 个float16 MAC操作 每个周期可进行128 个 bfloat16 MAC操作(8)4(9)每个核心有256KB的内部缓存 (10)支持转换的模型:TensorFlow、Caffe、Tflite、Pytorch、OnnxNN等 |
RKNN
三核架构如下图所示:

2.3 RKNPU
单核框架
RKNPU
单核心架构如下图所示:

2.3.1 AHB
/AXI
接口
AXI
主接口【用来和内存进行连接,从中获取模型、图像的相关参数和数据】用于从连接到SoC AXI
互联的内存中获取数据。AXI
是 一种高性能、低延迟、可扩展的总线接口,常用于连接处理器和外设,并支持多个主设备和从设备。AXI
主接口通常用于从内存中获取数据,例如从DRAM
或其它存储器中读取程序和数据, 并将其传输到处理器或其他外设中进行处理和计算。
AHB
从接口【用于访问寄存器,从而对RKNPU
进行配置、调试和测试】用于访问寄存器进行配置、调试和测试。AHB
是一种标 准化的系统总线接口,通常用于连接处理器、内存和外设等硬件电路。AHB
从接口通常用于访问寄存器,例如控制和配置处理器、外设和其他硬件电路的参数和状态,以实现系统的配置、 调试和测试。
在SoC
系统中,AXI
主接口和AHB
从接口通常被用于连接处理器、内存、外设和其他硬件电路,以实现数据传输、控制和配置等功能。AXI
接口通常用于高速数据传输和处理,而AHB
接口通常用于配置、调试和测试等低速控制操作。
2.3.2 卷积神经网络加速单元(CNA
)
卷积神经网络加速单元(Convolutional Neural Network Accelerator
,CNA
)是RKNPU
中重要的组成部分之一。包括卷积预处理控制器、NPU
内部缓存区、序列控制器、乘加运算单元和累 加器,下面对各个部分进行介绍:
- 卷积预处理控制器:卷积预处理控制器是
CNA
中用于预处理卷积计算的硬件单元,可以对输入的模型权重进行 解压缩之后加载进NPU
的内部缓冲区,并且可以判断零节点加速运算速度,最后将要推理的数据加载进NPU
的内部缓冲区中; NPU
内部缓存区(Internal Buffer
):NPU
内部缓存区是CNA
中用于存储中间计算结果的缓存区。它可以高效地存储和管理卷积神经网络中的各种数据,包括输入数据、卷积核、卷积结果等。NPU
内部缓存区采用了多级缓 存和数据重用技术,可以高效地利用计算资源和存储资源,从而进一步提高计算速度和效率;- 序列控制器(
Sequence Controller
):序列控制器是CNA
中用于控制卷积计算序列的硬件单元。它可以根据卷积神经网络的结构和参数,自动地配置和控制CNA
中各个硬件单元的工作模式和参数。序列控制器还可以实现卷积计算的并行化和流水化,从而提高计算速度和效率; - 乘加运算单元(
Multiply-Accumulate Unit,MAC
):乘加运算单元是CNA
中用于执行卷积计算的硬件单元。它可以对输入数据和卷积核进行乘 法和累加运算,从而得到卷积计算结果。乘加运算单元采用了高度并行的设计,可以同时执行多个卷积计算操作,从而大大提高计算速度和效率; - 累加器(
Accumulator
):累加器是CNA
中用于累加卷积计算结果的硬件单元。它可以高效地累加卷积计算结果,从 而得到最终的输出结果。累加器可以采用多种精度,可以适应不同的计算精度要求; - 数据处理单元(
Data Processing Unit,DPU
):主要处理单个数据的计算,例如Leaky ReLU
、ReLU、 ReluX
、Sigmoid
、Tanh
等。它还提供了一些功能,例如Softmax
、转置、数据格式转换等;- 数据处理单元是一种硬件电路,用于加速神经网络的计算过程。它通常被用于处理前向计算过程中的单个数据,例如卷积层和全连接层中的激活函数计算。不同的激活函数需要不同的 计算操作,例如
ReLU
需要计算max(0,x)
、Sigmoid
需要计算1/(1+exp(-x))
,而数据处理单元可 以通过硬件电路来实现这些计算操作,从而提高神经网络的计算性能和效率; - 除了激活函数计算之外,数据处理单元还提供了一些其他的函数,例如
Softmax
、转置、 数据格式转换等。这些函数通常被用于神经网络模型的构建和优化过程中,例如将模型的输出 转换为概率分布、重新排列张量的维度、将数据从一种格式转换为另一种格式等。
- 数据处理单元是一种硬件电路,用于加速神经网络的计算过程。它通常被用于处理前向计算过程中的单个数据,例如卷积层和全连接层中的激活函数计算。不同的激活函数需要不同的 计算操作,例如
2.3.3 平面处理单元(Planar Processing Unit,PPU
)
平面处理单元(Planar Processing Unit
)主要提供对数据处理单元的输出数据进行平面操作的功能,例如平均池化、最大值池化、最小值池化等。
平面处理单元是一种硬件电路,用于加速神经网络的计算过程。它通常被用于对数据处理 单元的输出数据进行平面操作,例如在卷积神经网络中,对卷积层的输出进行池化操作,以降 低数据维度和减少计算量。平面处理单元可以通过硬件电路来实现这些操作,从而提高神经网 络的计算性能和效率。
平面处理单元支持多种平面操作,例如平均池化、最大值池化、最小值池化等。这些操作 可以通过不同的参数来控制池化窗口的大小和步幅等,从而适应不同的应用场景和要求。
2.4 NPU
性能计算
NPU
(Neural Processing Unit
)是专门用于神经网络计算的处理器,其算力是指每秒可以处理的运算次数,通常以TOPS
(Tera Operations Per Second
)为单位进行衡量。
每个周期的理论峰值性能为Perf=MACs*2(ops/cycle)
,其中MACs
表示每个周期内可以达到的乘加操作次数,在前面RKNPU
介绍 章节已经对单个周期的每个数据类型可以进行的乘加操作次数进行了列举,而算力指的是运算的次数,所以要将乘加操作分解为一次乘法和一次加法,也就是最后乘以2
的由来。当NPU
的频率为f
时,则每秒的理论峰值性能为Perf=MACs*2*f(ops/s)
。
以RK3588 int 8
数据类型为例进行性能计算演示:
RK3588
每个周期可进行1024x3
个int8 MAC
操作;RK3588
的NPU
算力为1G HZ
;- 理论峰值性能计算公式为
Perf=MACs*2*f(ops/s)
;
综上RK3588 int 8
理论峰值性能为Perf=1024x3x1G×2 = 6 TOPS
,6 TOPS
即每秒处理6
万亿次操作
2.5 RKNPU
应用领域
Rockchip NPU
是一种专门用于深度学习应用的高性能处理器,并且在多个应用场景中都有广泛的应用。

2.5.1 计算机视觉
计算机视觉RKNPU
最常见的应用场景之一。其主要应用包括:
- 图像分类:将图像分成不同的类别。例如,将一张图片分成猫、狗、马等不同的类别;
- 目标检测:检测图像中不同物体的位置和类别。例如,检测图像中的人、汽车、建筑等;
- 图像分割:将图像中的不同物体分割出来。例如,将一张街景图片分割成不同的车辆、 建筑、行人等。
- 人脸识别:识别图像中的人脸并将其与已知的人脸进行匹配。
- 行为识别:识别视频中的不同行为,例如人的走路、跑步、跳舞等。
2.5.2 语音识别
语音识别是另一个常见的RKNPU
应用场景。其主要应用包括:
- 语音识别:将语音信号转换成文字;
- 语音合成:根据文字生成语音信号;
- 说话人识别:识别语音信号的说话人身份。
2.5.3 自然语言处理
RKNPU
也可以用于自然语言处理。其主要应用包括:
- 情感分析:判断一段文本表达的情感是正面、负面还是中性;
- 文本分类:将文本分成不同的类别。例如,将一封电子邮件分为垃圾邮件和非垃圾邮件;
- 文本生成:根据给定的文本生成新的文本,例如自动写作、机器翻译等;
- 机器翻译:将一种语言的文本翻译成另一种语言的文本。
2.5.4 医疗保健
在医疗保健领域,可以用于:
- 疾病预测:利用患者的病历和生理数据等信息预测患者的疾病风险和病情发展;
- 医学影像分析:对医学影像数据进行分析和识别,例如
CT
、MRI
等; - 药物发现:利用深度学习模型预测分子与靶点之间的相互作用,从而加速药物研发;
- 基因组学:利用深度学习模型对基因序列进行分析和预测,例如基因突变、基因表达等。
2.5.5 金融服务
在金融服务领域,可以用于:
- 风险评估:利用深度学习模型对客户信用、还款能力等进行评估;
- 欺诈检测:利用深度学习模型检测信用卡欺诈、账户盗用等非法行为;
- 股票预测:利用深度学习模型预测股票价格和趋势;
- 投资组合优化:利用深度学习模型对投资组合进行优化,降低风险并提高收益。
三 RKNPU
推理软件框架

3.1 RKNPU
硬件层
有关NPU
硬件前文以纪念馆进行了详细介绍,这里不重复介绍。
3.2 RKNPU
驱动层
RKNPU
的驱动层是连接上层应用和RKNPU
硬件的桥梁。驱动层的主要作用是将应用程序需要推理的内容提交给 RKNPU
进行计算,从而加速神经网络的训练和推理过程。
具体来说,驱动层需要完成以下任务:
- 硬件初始化:驱动层需要初始化
RKNPU
硬件,包括设置寄存器、分配内存等操作,以确保RKNPU
可以正常工作; - 数据传输:驱动层需要将数据从主机内存传输到
RKNPU
内存中,以便进行计算。在计算完成后,驱动层还需要将计算结果传输回主机内存; - 计算任务调度:驱动层需要根据应用程序的需求,管理和分配
RKNPU
的计算资源,以确保多个计算任务之间不会互相干扰。
3.3 RKNPU
应用层
RKNPU
应用层由AI
应用程序、RKNN API
以及运行时所需要的库所组成。
开发者通过调用瑞芯微提供好的API
接口进行AI
应用的开发,瑞芯微分别提供了C
语言和python
语言这两种 API
帮助开发者进行嵌入式设备部署,python
语言提供的接口较为简单, 旨在帮助用户进行前期的模型检测、测试以及应用调试,而要想得到更好的效果从而真正应用到实际项目中就要使用C API
接口了。
而无论是由C API
接口还是python
的API
接口编写的应用程序,要想实际运行都需要相应的动态库,动态库包含这些API
的具体实现,这些动态库由瑞芯微所提供。而我们只需要根据 瑞芯微所提供的API
编写对应的应用程序即可。
3.4 RKNN
组件介绍
瑞芯微官方提供的RKNN
组件包括 RKNPU2
、 RKNN Toolkit2
、 RKLLM-Toolkit
和RKNPU
驱动等。
RKNPU2
开发套件有一个运行库(librknnrt.so
等),提供c/c++
编程接口,用来部署推理RKNN
模型,接口适用于Linux
或者Android
系统;RKNN Toolkit2
开发套件(Python
接口)提供了在PC
,Rockchip NPU
平台上进行模型转换、量化功能、模型推理、性能和内存评估、量化精度分析、模型加密等功能。 该套件中还有一个RKNN Toolkit Lite2
,它提供了一个Python
编程接口,可以在板端部署RKNN
模型;RKLLM-Toolkit
是为用户提供在计算机上进行大语言模型(Large Language Model
,LLM
)的量化、转换的开发套件,支持将Hugging Face
格式的大语言模型转换为RKLLM
模型;RKNPU
驱动提供了NPU
硬件接口程序,板卡系统固件都已经适配好。
另外,还有 RKNN Model Zoo
模型仓库,是基于RKNN
工具链开发,提供了目前主流算法的部署例程(包括Python API
和C API
例程)。
3.4.1 RKNN
模型
RKNN
(Rockchip Neural Network
)是瑞芯微公司开发的一种神经网络模型格式,它可以将常见的深度学习模型转换为适用于瑞芯微的AI
加速器RKNPU
的模型格式。RKNN
模型的优点是在保证精度的同时,可以实现高效的推理和低功耗的计算。
下面是RKNN
模型的详细介绍:
RKNN
模型的文件格式:RKNN
模型使用自定义的文件格式来表示神经网络模型。它将神经网络模型划分为两个部分:静态部分和动态部分;静态部分包括模型的网络结构和权重,而动态部分包括输入输出的形状和类型等信息。使用这种格式可以减少模型的存储空间和加载时间;RKNN
模型的转换工具:为了将其他常见的深度学习模型转换为RKNN
模型,瑞芯微提供了一个转换工具RKNN-Toolkit2
。该工具支持将TensorFlow
、Caffe
、MXNet
等框架训练出来的模型转换为RKNN
模型,并且支持对模型进行量化、融合等优化操作,以提高运行效率;RKNN
模型的部署和推理:RKNN
模型可以通过RKNPU
硬件进行高效的推理。在部署RKNN
模型时,开发者需要使用RKNPU
提供的SDK
,并调用相应的API
接口来加载和运行RKNN
模型。 由于RKNPU
硬件的优化,RKNN
模型可以实现高效的推理和低功耗的计算。
对于Caffe
、TensorFlow
等其他模型,想要在RK3588
平台运行,需要先进行模型转换。可以使用RKNN-Toolkit2
工具将模型转换成RKNN
格式。
3.4.2 RKNN-Toolkit2
工具
RKNN-Toolkit2
是为用户提供在PC
、Rockchip NPU
平台上进行模型转换、推理和性能评估的开发套件,用户通过该工具提供的Python
接口可以便捷地完成各种操作。
工具的全部功能简单介绍如下:
- 模型转换:支持
Caffe
、TensorFlow
、TensorFlow Lite
、ONNX
、DarkNet
、PyTorch
等模型转为RKNN
模型,并支持RKNN
模型导入导出,RKNN
模型能够在Rockchip NPU
平台上加载使用; - 量化功能: 支持将浮点模型量化为定点模型,目前支持的量化方法为非对称量化 (
asymmetric_quantized-8
及asymmetric_quantized-16
),并支持混合量化功能 。asymmetric_quantized-16
目前版本暂不支持; - 模型推理:能够在
PC
上模拟Rockchip NPU
运行RKNN
模型并获取推理结果; 或将RKNN
模型分发到指定的NPU
设备上进行推理并获取推理结果; - 性能评估:将
RKNN
模型分发到指定NPU
设备上运行,以评估模型在实际设备上运行时的性能; - 内存评估:评估模型运行时的内存的占用情况。使用该功能时,必须将
RKNN
模型分发到NPU
设备中运行,并调用相关接口获取内存使用信息; - 量化精度分析:该功能将给出模型量化前后每一层推理结果与浮点模型推理结果的余弦距离,以便于分析量化误差是如何出现的,为提高量化模型的精度提供思路;
系统依赖:RKNN-Toolkit2
目前版本适用系统ubuntu 18.04(x64)
及以上,工具只能安装在PC
上,暂不支持 Windows
、MacOS
、Debian
等操作系统;
python
版本:3.6~3.11
;
python
依赖库:详见rknn-toolkit2/packages//requirements*.txt
,比如:
#python3.6
cat rknn-toolkit2/packages/requirements_cp36-1.6.0.txt
# if install failed, please change the pip source to 'https://mirror.baidu.com/pypi/simple'
# base deps
protobuf==3.12.2
# utils
psutil>=5.9.0
ruamel.yaml>=0.17.4
scipy>=1.5.4
tqdm>=4.64.0
opencv-python>=4.5.5.64
fast-histogram>=0.11
# base
onnx==1.10.0
onnxoptimizer==0.2.7
onnxruntime==1.10.0
torch==1.10.1
四、RK3588 RKNPU
开发环境
RK3588
内置NPU
模块处理性能最高可达6TOPS
(即每秒处理6
万亿次操作)。这款NPU
不仅拥有强大的计算能力,支持TensorFlow
、Caffe
、Tflite
、Pytorch
、Onnx NN
、Android NN
等常见框架。
使用该NPU
需要下载RKNN SDK
,RKNN SDK
为带有NPU
的RK3588S/RK3588
芯片平台提供编程接口,能够帮助用户部署使用RKNN-Toolkit2
导出的RKNN
模型,加速AI
应用的落地。
在PC
端主要是进行模型训练和模型转换等,可以选择Windows
系统,或者Windows
上的虚拟机ubuntu
,Docker
的linux
系统,或者云服务器等等。
在PC
端需要安装常用软件和库,比如pycharm
、Python
、交叉编译器等, 安装一些深度学习框架,比如Pytorch
,TensorFlow
,PaddlePaddle
等等。 各种软件的使用,建议创建虚拟环境来隔离,常用Python
虚拟环境和Anaconda
或者Miniconda
。
在开发板上,系统使用ubuntu
或者debian
,内核默认适配rknn
驱动,其它rknn
相关组件均包含。 另外,还有一些常用的软件和库,例如python
,cmake
,make
,gcc
,opencv
等等。
4.1 RKNN
开发流程

深度学习模型工作流程大致可分为训练和推理,而在板块上部署模型,具体的步骤如下:
- 模型训练:模型训练前需要根据具体项目问题,选择模型,数据采集,然后使用适合的深度学习框架进行模型训练, 其中关于
RKNN
模型算子的支持请参考RKNN_Compiler_Support_Operator_List
。 - 模型转换:将训练的深度学习模型会被转化为
RKNN
格式的模型; - 模型评估:将使用
RKNN-Toolkit2
工具量化和分析模型性能,包括精度、连板推理性能和内存占用等关键指标, 根据模型的评估尝试修改和优化模型,一些模型的优化可以参考下RKNPU_User_Guide_RKNN_SDK
。 - 板端推理:将转换的
RKNN
模型部署到板卡上,具体可以查看下rknpu
运行库和RKNN-Toolkit-lite2
的使用。
后面教程测试,PC端是使用ubuntu 22.04
、Python3.8
, 进行模型训练和转换,开发板系统是以debian11
、ubuntu 20.04
为主,进行部署推理测试。
4.2 软件安装
4.2.1 ubuntu 22.04
操作系统自行安装ubuntu 22.04
,安装完成后查看:
root@ubuntu:/work# cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
4.2.2 安装Anaconda
Anaconda
是一个用于科学计算的python
发行版,支持linux
,mac
,windows
系统,提供了包管理和环境管理的功能,Anaconda
是一个打包的集合,里面装好了conda
,某个版本的python
,众多的packages
等,科学计算工具等。
下载中科大镜像:http://mirrors.ustc.edu.cn/
;
从archive
路径下载Anaconda3-2023.03-0-Linux-x86_64.sh
;
root@ubuntu:/work# wget https://mirrors.ustc.edu.cn/anaconda/archive/Anaconda3-2023.03-0-Linux-x86_64.sh
开始安装:
root@ubuntu:/work# sh Anaconda3-2023.03-0-Linux-x86_64.sh
然后回车,一直往下滑动看完license
,最后输入yes
后,继续按下回车,然后进入安装,安装完成后输入yes
初始化anaconda3
。
后面选择安装路径,我是安装到/work/anaconda3
文件夹下:
>>> yes
Anaconda3 will now be installed into this location:
/root/anaconda3
- Press ENTER to confirm the location
- Press CTRL-C to abort the installation
- Or specify a different location below
[/root/anaconda3] >>> /work/anaconda3 PREFIX=/work/anaconda3
Unpacking payload ...
.......
执行到这里说明已经安装成功;
installation finished.
Do you wish the installer to initialize Anaconda3
by running conda init? [yes|no]
[no] >>> yes
no change /work/anaconda3/condabin/conda
no change /work/anaconda3/bin/conda
no change /work/anaconda3/bin/conda-env
no change /work/anaconda3/bin/activate
no change /work/anaconda3/bin/deactivate
no change /work/anaconda3/etc/profile.d/conda.sh
no change /work/anaconda3/etc/fish/conf.d/conda.fish
no change /work/anaconda3/shell/condabin/Conda.psm1
no change /work/anaconda3/shell/condabin/conda-hook.ps1
no change /work/anaconda3/lib/python3.10/site-packages/xontrib/conda.xsh
no change /work/anaconda3/etc/profile.d/conda.csh
modified /root/.bashrc
==> For changes to take effect, close and re-open your current shell. <==
If you'd prefer that conda's base environment not be activated on startup,
set the auto_activate_base parameter to false:
conda config --set auto_activate_base false
Thank you for installing Anaconda3!
4.2.3 创建虚拟环境
输入命令:
root@ubuntu:/work# conda create -n toolkit2_1.6 python=3.10
其中:
toolkit2_1
是环境名;3.10
是python
版本。
激活环境中,命令为:
root@ubuntu:/work# conda activate toolkit2_1.6
提示:在进行后续操作之前,一定要先进入刚创建的环境,不然后面的操作是在默认环境base
上进行。
4.2.4 安装cuda
通过conda search cudatoolkit
命令查看可下载的版本:
root@ubuntu:/work# conda search cudatoolkit
Loading channels: done
# Name Version Build Channel
cudatoolkit 9.0 h13b8566_0 anaconda/pkgs/main
cudatoolkit 9.0 h13b8566_0 pkgs/main
cudatoolkit 9.2 0 anaconda/pkgs/main
cudatoolkit 9.2 0 pkgs/main
cudatoolkit 10.0.130 0 anaconda/pkgs/main
cudatoolkit 10.0.130 0 pkgs/main
cudatoolkit 10.1.168 0 anaconda/pkgs/main
cudatoolkit 10.1.168 0 pkgs/main
cudatoolkit 10.1.243 h6bb024c_0 anaconda/pkgs/main
cudatoolkit 10.1.243 h6bb024c_0 pkgs/main
cudatoolkit 10.2.89 hfd86e86_0 anaconda/pkgs/main
cudatoolkit 10.2.89 hfd86e86_0 pkgs/main
cudatoolkit 10.2.89 hfd86e86_1 anaconda/pkgs/main
cudatoolkit 10.2.89 hfd86e86_1 pkgs/main
cudatoolkit 11.0.221 h6bb024c_0 anaconda/pkgs/main
cudatoolkit 11.0.221 h6bb024c_0 pkgs/main
cudatoolkit 11.3.1 h2bc3f7f_2 anaconda/pkgs/main
cudatoolkit 11.3.1 h2bc3f7f_2 pkgs/main
cudatoolkit 11.8.0 h6a678d5_0 anaconda/pkgs/main
cudatoolkit 11.8.0 h6a678d5_0 pkgs/main
开始安装:
root@ubuntu:/work# conda install cudatoolkit=11.0.221
注意:安装之后的CUDA
会存放在虚拟环境的lib
文件夹 或者include
文件夹里面;比如动态库libcudart.so.11.0
安装在/work/anaconda3/envs/tf/lib/
路径。
4.2.5 安装cudnn
通过conda search cudnn
命令查看可下载的版本:
root@ubuntu:/work# conda search cudnn
Loading channels: done
# Name Version Build Channel
cudnn 7.0.5 cuda8.0_0 pkgs/main
.......
cudnn 8.2.1 cuda11.3_0 pkgs/main
cudnn 8.9.2.26 cuda11_0 pkgs/main
cudnn 8.9.2.26 cuda12_0 pkgs/main
cudnn 9.1.1.17 cuda12_0 pkgs/main
cudnn 9.1.1.17 cuda12_1 pkgs/main
执行命令安装cudnn
包:
root@ubuntu:/work# conda install cudnn==8.2.1
4.2.6 安装tensorflow
可以尝试执行如下命令安装:
root@ubuntu:/work# conda install tensorflow==2.8.2
验证是否安装成功:
root@ubuntu:/work# python
Python 3.8.18 (default, Sep 11 2023, 13:20:55)
[GCC 11.2.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> gpus = tf.config.experimental.list_physical_devices(device_type='GPU')
>>> cpus = tf.config.experimental.list_physical_devices(device_type='CPU')
>>> print(gpus, cpus)
[] [PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU')]
4.3 RKNN
环境搭建
4.3.1 安装依赖
安装相关库和软件包:
root@ubuntu:/work# apt-get install libxslt1-dev zlib1g zlib1g-dev libglib2.0-0 libsm6 \
libgl1-mesa-glx libprotobuf-dev gcc
4.3.2 下载RKNN-Toolkit
获取RKNN-Toolkit2
安装包:
root@ubuntu:/work/sambashare/rknpu# git clone https://github.com/airockchip/rknn-toolkit2
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2# ll
-rw-r--r-- 1 root root 4113 1月 12 11:20 CHANGELOG.md
drwxr-xr-x 2 root root 4096 1月 12 11:20 doc/
drwxr-xr-x 8 root root 4096 1月 12 11:20 .git/
-rw-r--r-- 1 root root 1574 1月 12 11:20 LICENSE
-rw-r--r-- 1 root root 3735 1月 12 11:20 README.md
drwxr-xr-x 2 root root 4096 1月 12 11:20 res/
drwxr-xr-x 5 root root 4096 1月 12 11:20 rknn-toolkit2/
drwxr-xr-x 4 root root 4096 1月 12 11:20 rknn_toolkit_lite2/
drwxr-xr-x 4 root root 4096 1月 12 11:20 rknpu2/
其中:
doc
目录包含了RKNN-Toolkit2
的使用文档,包括更新记录、RKNN
算子支持列表、快速入门指南以及使用指导手册;rknn_toolkit_lite2
属于RKNN-Toolkit2
的一个阉割版。RKNN Toolkit lite2
相较于RKNN-Toolkit2
多 了 一 个lite
后缀 , 可以简单的理解为RKNN-Toolkit2
的阉割版,只保留了推理的功能,可以帮助用户在开发板端进行模型的初步部署和测试。
4.3.2.1 rknn-toolkit2
目录
RKNN-Toolkit2
资料包如下;
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2# ll rknn-toolkit2
-rw-r--r-- 1 root root 20441 1月 12 11:20 CHANGELOG.txt
drwxr-xr-x 3 root root 4096 1月 12 11:20 docker/
drwxr-xr-x 9 root root 4096 1月 12 11:20 examples/
drwxr-xr-x 2 root root 4096 1月 12 11:20 packages/
分别为:
examples
目录包含了RKNN-Toolkit2
的一些示例代码,用于演示RKNN-Toolkit2
的一些功能。 通过运行该示例代码,可以帮助用户更好的理解和掌握RKNN-Toolkit2
的具体功能和使用方法;packages
目录提供了python 3.6
、python 3.7
、python 3.8
、python 3.9
、python 3.10
、python 3.11
多个版本的安装包;
4.3.2.2 rknn_toolkit_lite2
RKNN-Toolkit lite2
资料包如下;
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2# ll rknn_toolkit_lite2/
-rw-r--r-- 1 root root 890 1月 12 11:20 CHANGELOG.txt
drwxr-xr-x 4 root root 4096 1月 12 11:20 examples/
drwxr-xr-x 2 root root 4096 1月 12 11:20 packages/
分别为:
-
examples
目录包含了RKNN-Toolkit lite2
的示例代码; -
packages
目录提供了python 3.7
、python 3.8
、python 3.9
、python 3.10
、python 3.11
多个版本的安装包,需要注意的是这里的安装包架构为aarch64
,即需要安装在RK3568
或者RK3588
的ubuntu
等发行版Linux
操作系统上。
最后对RKNN-Toolkit2
和RKNN-Toolkit lite2
进行对比,对比如下:
- 提供的语言接口都是
python
语言; RKNN-Toolkit2
提供的安装包架构为X86_64
,运行在日常使用的PC
电脑上,一般情况下安装在虚拟机ubuntu
上,而RKNN-Toolkit lite2
提供的安装包架构为aarch64
,运行在RK3568
或者RK3588
开发板上;RKNN-Toolkit2
可以进行模型转换、推理和性能评估,而RKNN-Toolkit lite2
只保留了推理功能,用于模型的初步部署和调试。
4.3.3 安装python
依赖
安装依赖:
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2/rknn-toolkit2/packages# conda activate tf
# 配置pip源
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2/rknn-toolkit2/packages# pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2/rknn-toolkit2/packages# pip install -r requirements_cp38-1.6.0.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
4.3.4 安装RKNN-Toolkit2
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2/rknn-toolkit2/packages# pip install rknn_toolkit2-1.6.0+81f21f4d-cp310-cp310-linux_x86_64.whl
检查RKNN-Toolkit
是否安装成功:
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2/rknn-toolkit2/packages# python
Python 3.10.12 (main, Nov 6 2024, 20:22:13) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from rknn.api import RKNN
>>>
如果导RKNN
模块没有失败,说明安装成功。
4.4 运行示例
RKNN-Toolkit2
自带了一个模拟器,可以用来仿真模型在npu
上运行时的行为。
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2/rknn-toolkit2# cd examples/
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2/rknn-toolkit2/examples# ll
drwxr-xr-x 4 root root 4096 1月 12 11:20 caffe/
drwxr-xr-x 3 root root 4096 1月 12 11:20 darknet/
drwxr-xr-x 12 root root 4096 1月 12 11:20 functions/
drwxr-xr-x 4 root root 4096 1月 12 11:20 onnx/
drwxr-xr-x 5 root root 4096 1月 12 11:20 pytorch/
-rw-r--r-- 1 root root 2006 1月 12 11:20 readme.txt
drwxr-xr-x 4 root root 4096 1月 12 11:20 tensorflow/
drwxr-xr-x 4 root root 4096 1月 12 11:20 tflite/
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2/rknn-toolkit2/examples# cd tflite/
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2/rknn-toolkit2/examples/tflite# ll
drwxr-xr-x 2 root root 4096 1月 12 11:20 mobilenet_v1/
drwxr-xr-x 2 root root 4096 1月 12 11:20 mobilenet_v1_qat/
这里以mobilenet_v1
为例。示例中的mobilenet_v1
是一个Tensorflow Lite
模型,用于图片分
类,它是在模拟器上运行的。
运行该示例的步骤如下:
(1) 进入mobilenet_v1
目录;
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2/rknn-toolkit2/examples/tflite# cd mobilenet_v1
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2/rknn-toolkit2/examples/tflite/mobilenet_v1# ll
-rw-r--r-- 1 root root 16 1月 12 11:20 dataset.txt
-rw-r--r-- 1 root root 18889 1月 12 11:20 dog_224x224.jpg
-rw-r--r-- 1 root root 25584 1月 12 11:20 labels.txt
-rw-r--r-- 1 root root 16900760 1月 12 11:20 mobilenet_v1_1.0_224.tflite
-rw-r--r-- 1 root root 563 1月 12 11:20 model_config.yml
-rw-r--r-- 1 root root 1092 1月 12 11:20 README.md
-rw-r--r-- 1 root root 2126 1月 12 11:20 test.py
(2) 执行test.py
脚本;
root@ubuntu:/work/sambashare/rknpu/rknn-toolkit2/rknn-toolkit2/examples/tflite/mobilenet_v1# python3 test.py
W __init__: rknn-toolkit2 version: 1.6.0+81f21f4d
--> Config model
done
--> Loading model
2025-01-12 12:36:12.155353: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/lib/python3.10/dist-packages/cv2/../../lib64::/opt/qt6.5/qt-nanopi/lib/
2025-01-12 12:36:12.155434: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
A module that was compiled using NumPy 1.x cannot be run in
NumPy 2.2.1 as it may crash. To support both 1.x and 2.x
versions of NumPy, modules must be compiled with NumPy 2.0.
Some module may need to rebuild instead e.g. with 'pybind11>=2.12'.
很明显出现了错误,缺少动态库libcudart.so.11.0
,安装cuda
;
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo dpkg -i cuda-repo-ubuntu2004-11-1-local_11.1.0-455.23.05-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu2004-11-1-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda
参考文章
[1] Rockchip_Quick_Start_RKNN_SDK_V1.3.0_CN.pdf
[2] AI
嵌入式人工智能开发 --- 【1】初始RKNPU
[3] Rockchip_Quick_Start_RKNN_Toolkit2_CN-1.3.0.pdf
[4] AI
嵌入式RK3588
人工智能开发 --- 【2】RKNPU
软件推理框架
[5] 嵌入式AI应用开发实战指南