RK3588部署及其RKNPU工具链使用学习

news2024/10/21 12:26:38

文章目录

  • 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个基本概念:

  1. RKNN Server: 运行在开发板上的后台代理服务,用于接收PC通过 USB 传输过来的数据,然后执行板端 Runtime 对应的接口,并返回结果给 PC。
  2. RKNPU2 Runtime 库:
    1. librknnrt.so: 是用于 RK3562 / RK3566 / RK3568 / RK3576 / RK3588 板端的 Runtime 库。
    2. 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 结果对比的余弦距离和欧氏距离。

注:

  1. 精度分析工具会保存模型在推理时网络每一层的输出结果,因此如果模型太大且开发板上存储容量不够会导致运行失败。
  2. .通过 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2220020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习“捷径”:自动特征工程全面解析

引言 在机器学习项目中,特征工程是影响模型性能的关键步骤。它通过从原始数据中提取出更有用的特征,帮助模型更好地捕捉数据中的模式。然而,传统的特征工程过程往往需要大量的领域知识和实验调整,是一项耗时费力的工作。 近年来…

关于modbus与HMI车载侧屏通信的错误机制处理

目录 1.关于6个人机交互功能按钮逻辑图设计 2.错误处理机制 1.关于6个人机交互功能按钮逻辑图设计 初次的设计想法是按钮亮表示大家能按,但要是想在按一次,发送有效数据,就得先按亮,在按灭。这里以上料区为例,其它区…

Midjourney中文版:创意无界,绘梦成真

在数字艺术的浩瀚宇宙中,Midjourney中文版如同一颗璀璨的新星,以其独特的魅力和无限可能,引领着每一位创作者探索创意的无限边界。作为专为国内用户打造的AI绘画工具,Midjourney中文版不仅继承了原版的核心优势,更在本…

基于cloudreve(Docker应用)搭建网盘服务,用于目录的分享和在线预览。

文章目录 I 基于cloudreve(Docker应用)搭建网盘服务安装主要功能设置角色最大容量II 知识扩展:网盘类的文件预览需求背景: iOS可以直接预览PDF等常见格式文件,但是Android浏览器需要先下载文件,才能查看文件内容,因此需要搭建支持目录的分享和在线预览的MinIO文件服务提供…

【Redis】Zset类型常用命令

文章目录 一. Zset有序集合简介.二. 添加元素相关命令.2.1 向有序集合中添加元素(zadd) 三. 查询元素相关操作.3.1 查询有序集合中的元素个数( zcard zcount)3.2 查询指定区间内的元素(zrange zrevrange zrangebyscore)3.3 查询有序集合中指定成员的排名(zrank zrevrank )3.4 查…

AI大模型学习路线路径,巨详细!

大模型技术已经成为推动人工智能发展的关键力量。无论你是初学者还是有经验的开发者,想要掌握大模型应用,都需要遵循一定的学习路线。 从核心技术解析到模型微调与私有化部署,逐步深入大模型应用的世界。 这份学习路线图详细的介绍了那年每…

规划控制复现:Apollo LQR横向控制(算法原理推导与流程)

本文在前文已经搭建好的规划控制验证平台中进行LQR算法的复现: 1.车辆动力学建模 汽车轨迹跟踪误差模型示意图如下: 为车辆横向速度,为车辆纵向速度;和 分别为质心到前、 后轴的距离 ; 为车辆的横 摆角 ; 和 分别为车辆前 、 后轮的侧偏角。并设车辆…

【C++】哈希表的模拟实现

目录 一、闭散列(开放定址定法) 1、哈希表的结构: 2、哈希表的插入: 3、哈希表的查找: 4、哈希表的删除: 二、开散列(哈希桶) 1、哈希表的结构: 2、构造与析构&a…

若依前后分离版集成积木报表进行token传递

若依分离板集成积木报表就不说了需要的请移步:若依前后分离版集成积木报表-CSDN博客 考虑到前端摸鱼不干活,所以一般都是前后端都干,我这里前后端都搞上,你们直接抄,抄完接着去摸鱼,代码不美观,轻喷 一、…

【JavaEE】【多线程】synchronized和死锁

目录 一、synchronized详解1.1 互斥1.2 可重入 二、死锁2.1 死锁成因2.2 避免死锁 一、synchronized详解 1.1 互斥 synchronized 会起到互斥效果, 某个线程执行到某个对象的 synchronized 中时, 其他线程如果也执行到 同一个对象 synchronized 就会阻塞等待. 语法&#xff1…

AI时代程序员何去何从?提升自我还是被淘汰出局!

AI 在编程界的使用变得越来越普遍了。随着 ChatGPT 的横空出世,各种大语言模型如雨后春笋不断出现。国外如谷歌 Bard、Anthropic 的 Claude,国内如百度文心一言、阿里通义千问、讯飞星火认知大模型、昆仑万维天工大模型等。 想想看,以前得花好…

支持国密算法的数字证书-国密SSL证书详解

在互联网中,数字证书作为标志通讯各方身份信息的数字认证而存在,常见的数字证书大都采用国际算法,比如RSA算法、ECC算法、SHA2算法等。随着我国加强网络安全技术自主可控的大趋势,也出现了支持国密算法的数字证书-国密SSL证书。那…

【网络安全】缓存欺骗问题之查看个人资料接口

未经许可,不得转载。 文章目录 正文正文 目标网站 target.com,查看个人资料页面时,API 端点为/get_user,完整的 URL 是 https://target.com/web-api/v1/get_user?timestamp=123456(其中 timestamp 是一个易受攻击的参数)。 我注意到响应中有一个 cf-cache-status= MISS…

k8s部署Kafka集群超详细讲解

准备部署环境 Kubernetes集群信息 NAMEVERSIONk8s-masterv1.29.2k8s-node01v1.29.2k8s-node02v1.29.2 Kafka:3.7.1版本,apche版本 Zookeeper:3.6.3版本 准备StorageClass # kubectl get sc NAME PROVISIONER RECLA…

Docker安装ActiveMQ镜像以及通过Java生产消费activemq示例

拉取镜像 docker pull docker.io/webcenter/activemq 启动容器 docker run -d --name myactivemq -p 61616:61616 -p 8162:8161 docker.io/webcenter/activemq:latest 这样就代表启动成功了 浏览器访问 http://localhost:8162/ admin admin 开启验证 修改配置文件/opt/ac…

关于k8s集群高可用性的探究

1. k8s的高可用的核心是什么? 说到核心、本质 意味着要从物理层来考虑技术 k8s是一个容器编排管理工具,k8s受欢迎的时机 是docker容器受欢迎时,因为太多的docker容器,管理起来是一个大工程 那么刚好k8s是google自己用了十来年…

STM32L031F6P6基于CubeMX的串口通信调试笔记

用CubeMX创建项目 本实例用的PA14、PA13两个引脚,LPUART1。 对串口参数进行设置: 开启串口中断: 时钟源设置成内部高频时钟: 对项目进行设置: 生成代码: 在串口初始化函数中加入 __HAL_UART_ENA…

Asp.net Core MVC 动态路由

动态路由 asp.net core 3.0 就支持了 // 映射关系public class TranslationDatabase{private static Dictionary<string, Dictionary<string, string>> Translations new Dictionary<string, Dictionary<string, string>>{{"en", new Dictio…

《Vue3 踩坑》expose 和 defineExpose 暴露属性或方法注意事项

选项式写法 使用 选项式API - 状态选项 - expose 一定要注意&#xff1a; 接下来&#xff0c;进一步看示例说明&#xff1a; 设置 expose 仅显示列出的属性/方法才能被父组件调用&#xff1b;代码第 2 行&#xff0c;父组件可访问属性 a 和 方法 myFunc01&#xff0c;不可访…

Windows server 2022 数据中心版本的安装

安装前的准备工作&#xff1a; 1.准备好VMware虚拟机&#xff08;略&#xff09; 2.准备好镜像 图1-1 准备安装镜像 3.准备好安装的位置&#xff08;F盘2022vm文件夹&#xff09; 图1-2 选择并设定安装位置 4.开始安装 图1-3 开心VMware安装向导 图1-4 插入光盘镜像 图1-5…