RK3588 - RKNN(Rockchip 神经处理单元)的逆向工程

本文翻译自https://jas-hacks.blogspot.com/2024/02/rk3588-reverse-engineering-rknn.html
RK3588 NPU 的内部操作和功能主要隐藏在名为RKNPU2的闭源 SDK 中。由于对大型语言模型 (LLM) 的兴趣以及对transform模型最佳矩阵乘法的追求,想了解 RKNPU SDK 新引入的矩阵乘法 API (rknn_matmul_run) 的实现。对技术参考手册(TRM)中 RKNN NPU部分的查看,揭示了该NPU没有做矩阵乘法的原生机制(内部是通过倒一手的方法),尤其是对于向量。

为了了解发生了什么,第一步是了解 NPU 的工作原理。 TRM 提供了详细的寄存器列表以及构成 NPU 的核心单元的简要概述。它特别缺乏有关对寄存器进行编程以执行操作的基本信息。例如没有关于根据数据格式(如int8 与 float16)或输入数据或权重的大小等因素导出或计算寄存器值的具体细节。此外,没有关于如何构建 NPU 执行管道的信息,不过我从之前对V831 NPU 的逆向工程尝试中获得了一些优势。但是即使掌握了这些知识,它仍然需要几个月的反复对数据流的广泛分析、遇到一些死胡同以及无数次逆向工程尝试,最后才整明白了如何激活 NPU 并让它执行简单的操作。

RK3588 NPU 似乎是NVDLA架构的远亲,因为一些术语相似,核心单元与 NVDLA 具有相似的功能和管线,尽管它们的命名不同。其中主要区别之一是我们可以给 NPU一个要执行的任务列表(RKNN 术语),然后等待完成。例如,如果我有一个由3层的神经网络,每层由conv + bias组成,那么可以将 3 个任务(每个任务执行conv + bias)以及必要的输入、权重和偏置值提供给 NPU,随后我们只需等待 NPU 通知完成即可。
在这里插入图片描述
上面显示的图像是从 TRM 中提取的,并稍微修改了,因为 TRM 中提供的描述与它们的图表并不完全一致,更重要的是寄存器命名约定也不完全一致。这是我的解释,每个 NPU 由三个不同的单元组成:

  • CNA - 卷积网络加速器(包括 CORE 矩形),在TRM中它指的是神经网络加速引擎。
  • DPU-数据处理单元
  • PPU - 平面处理单元

基于上述,NPU 主要是为运行传统的卷积神经网络(CNN)而设计的。这是因为 CNA 核心功能是通过输入图像或特征数据以及相应的权重来执行卷积。官方提供的大多数 RKNPU2 demo(例如 YOLOX、Mobilenet 和 ResNet)都证明了对 CNN 的重视。 CNA 输出可以定向到 DPU,在 DPU 中可以执行加法、乘法和 RELU 等逐元素运算。随后,DPU 的输出可以传送到 PPU,在 PPU 中执行最小、最大和平均池化等操作。此外还可以选择直接将数据传输到 DPU 或 PPU,而无需卷积步骤。

为了有效地执行卷积,CNA 采用乘法累加 (MAC) 运算。 CNA 的性能部分取决于所使用的 MAC 单元的数量。根据 TRM,对于单个 NPU 核心,MAC 操作的计数取决于输入数据类型:

  • 每个周期 1024 个 int8 MAC 操作
  • 每个周期 512 个 float16 MAC 操作

每个 MAC 单元缓存 1x1x16 weight bytes,对于 int 8,它有 16 个值可用,而对于 fp16,它减少到 8 个。我们需要 2 个 MAC 单元来执行 fp16,因此每个周期的操作量减少。内部特征和权重数据必须符合 rk的NC1HWC2 格式,其中 C2 是weight bytes。然后,所有 MAC 单元共享一个 1x1x16 cube的特征数据,方便将其发送到累加器以计算部分和。在更高级别用法中,CNA 似乎执行块操作(block operation),如我在测试中观察到的,MAC 缓存32 channels的fp16 weight data。因此需要在每个kernel groups中layout 32 个channels的权重(不太准确,请看原文)。

性能还受到输入和权重数据的访问时间的影响,CNA 包含称为卷积缓冲区 (cbuf) 的二级缓存。在上图中,384KB 板载内存部分用于此目的。重要的是,MAC 单元的数量加上 CBUF 会影响一个task中可以完成的卷积size。

有些人可能已经推断出矩阵乘法 API 本质上是通过 2D 卷积执行的。例如,我们将矩阵 A 视为 [M x K],将矩阵 B 视为 [K x N]。矩阵A表示以Mx1xK(hwc)格式排列的特征数据,而矩阵B表示以1x1xNxK(hwck)格式排列的权重数据。因此,所得矩阵 C [M x N] 排列为 Mx1xN。我正在运行一个简单的demo,要求 NPU 执行矩阵乘法。我使用从 GGML 测试用例 ( test-mul-mat.cpp ) 派生的矩阵数据来验证输出是否正确。要运行测试,请查看我的github,遗憾的是我仍在 Rock-5b 上针对内核 5.10 进行测试。如果测试运行输出应如下所示和上面的屏幕截图。

rock@rock-5b:~/rk3588-npu/build$ ./matmul_4_36_16
drm name is rknpu - 20220829 - RKNPU driver
input dma is ffff8000, output dma is ffffa000, weights dma is ffff9000
Size of npu_regs 112
RKNPU_SUBMIT returned 0
=========================================================================================================
 1224.0 1023.0 1158.0 1259.0 1359.0 1194.0 1535.0 1247.0 1185.0 1029.0  889.0 1182.0  955.0 1179.0 1147.0
 1216.0 1087.0 1239.0 1361.0 1392.0 1260.0 1247.0 1563.0 1167.0 1052.0  942.0 1214.0 1045.0 1134.0 1264.0
 1125.0  966.0 1079.0 1333.0 1287.0 1101.0 1185.0 1167.0 1368.0  990.0  967.0 1121.0  971.0 1086.0 1130.0
  999.0  902.0 1020.0 1056.0 1076.0  929.0 1029.0 1052.0  990.0 1108.0  823.0  989.0  759.0 1041.0 1003.0
=========================================================================================================

关于逆向工程已经达到了一个阶段,了解在处理特征数据作为输入时影响卷积的大多数寄存器设置。主要的不确定性在于确定特征/权重数据的库大小,但是我希望可以推断出这一点。在投入大量时间分析 NPU 后,我们应该知道以下关键点:

  1. NPU 内的所有数据指针(例如输入、权重、输出、任务列表)均为 32 位,并且必须引用物理内存。因此,这将内存范围限制为 4GB,使得利用具有 16/32GB 内存的主板供 NPU 使用是不可能的。此外,它还可能对 NPU 上执行的模型类型施加限制。

  2. 6 TOPS 的说法有待验证。虽然每个 NPU 核心的额定速度为 2 TOPS,但有些寄存器可能可以在 3 个NPU核心之间启用卷积。但是在分析SDK生成的数据流后,似乎没有使用过该功能。此外,DPU/PPU 单元似乎没有类似的功能,这会限制其可用性。在我看来,最有效的方法是将它们视为单独的核心并在每个核心上执行模型,但是要考虑到前面提到的内存限制。

  3. SDK提供矩阵乘法API在某些方面代表了NPU的低效利用,因为他存在内存分配、内核调用以及指示 NPU 执行单个卷积的开销。理想情况下,NPU 的任务应该是执行多个操作并为这些操作提供所有提供的数据。一般来说这就是运行 CNN 模型(即 YOLOvX)时使用 NPU 的方式。这里需要注意的是,转换后的模型仅限于包含 NPU 支持操作的层。

  4. 两个 fp16 [512 x 512] 矩阵相乘的初始基准测试表明我可以在 1 毫秒左右的时间内完成。但是由于CBUF限制,这将变成2个task发送给NPU。不幸的是,当使用矢量数据作为输入时,这只是流程的一部分,耗时操作是将矩阵转换为特征和权重数据格式,如果在运行时完成,则输出反之亦然。我努力创建一个高度优化的转换例程,用于矢量到特征数据的转换。根据我的基准测试,对于 fp16 [512 x 512] 矩阵,此过程大约需要 2 毫秒。我估计需要 12-15 毫秒来执行上述矩阵的所有转换。理想情况下,应提前转换权重数据的矩阵以减少转换开销,并且如果可能的话,应保留以供重用。

  5. 我希望能够使用可编程内核来执行自定义操作。不幸的是,情况并非如此,您只能使用 OpenCL 作为替代方案。如果您需要在 OpenCL 和 NPU 之间调整数据,这就会带来挑战。

关于其他单元(DPU/NPU)还有更多需要发现,我将花时间来做这件事。最后,TRM v1.0 包含 RKNN 的许多差距和不一致,如果有人有更新的版本,我们将不胜感激。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

值得让英伟达CEO黄仁勋亲自给OpenAI配送的AI服务器!一文带你了解算力,GPU,CPU!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识…

【C++】双指针算法:和为s的两个数字

1.题目 虽然在牛客上是个中等题,但我感觉是比较简单的。大家在看完这篇文章后可以看看我的上一篇文章:有效三角形的个数。本文章的题目的解法只是有效三角形的个数这道题目的一个环节。看懂这篇文章后可以更好的解决有效三角形个数那道题目! …

电力系统IEC-104报文主要常用详解

文章目录 1️⃣ IEC-1041.1 前言1.2 报文分类1.3 U帧报文1.3.1 常见报文1.3.1 报文解析 1.4 S帧报文1.4.1 说明1.4.2 报文解析 1.5 I帧报文1.5.1 报文解析 1.6 控制域I帧报文S帧报文U帧报文介绍 1.7 ASDU1.7.1 常见类型标识1.7.2 常见结构限定词1.7.3 常见传送原因1.7.4 信息体…

艾瑞泽5汽车电子控制单元CAN通信数据读写车辆网络系统交互接口

艾瑞泽5的网关接口数据交换通常涉及车辆内部电子设备之间的信息传输,包括车身系统、娱乐系统、远程控制、车辆状态监控、CAN数据采集分析、整车DBC控制策略等信息。 艾瑞泽5作为一款采用CAN协议的汽车,其CAN通信的开发可以提高车辆的安全性、可靠性和实…

Visual Studio Code使用

目录 1.python的调试 2.c的运行 方法1: 方法2: 3.c的调试 3.1调试方法一:先生成执行文件,再调试 3.2调试方法二:同时生成执行文件,调试 4.tasks.json 与launch.json文件的参考 4.1C生成执行文件tas…

uniapp H5实现签名

第一种&#xff1a;跳转签名页面 1、创建审核页面audit.vue <template><view><uni-section title""><view class"auditClass"><uni-forms :model"baseFormData" ref"baseFormRef" :rules"rules&quo…

数据结构初阶——树和二叉树

数据结构初阶——树和二叉树 1. 树的概念和结构1.1 树的概念1.2 树的表示 2. 二叉树2.1 二叉树的概念和结构2.2 二叉树的存储结构2.2.1 顺序存储2.2.2 链式存储 3. 二叉树的顺序结构及实现——堆3.1 堆的概念和结构3.2 堆的实现3.2.1 堆的定义3.2.2 堆的向上调整3.2.3 堆的向下…

【网络安全】安全事件管理处置 — 事件分级分类

专栏文章索引&#xff1a;网络安全 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、安全事件分级 二、应急事件分级 三、安全事件分类 四、常见安全事件原因分析 1.web入侵 2.漏洞攻击 3.网络攻击 一、安全事件分级 在对安全事件的应急响应过程中&#xf…

【Hadoop】-Apache Hive概述 Hive架构[11]

目录 Apache Hive概述 一、分布式SQL计算-Hive 二、为什么使用Hive Hive架构 一、Hive组件 Apache Hive概述 Apache Hive是一个在Hadoop上构建的数据仓库基础设施&#xff0c;它提供了一个SQL-Like查询语言来分析和查询大规模的数据集。Hive将结构化查询语言&#xff08;…

LT8711UXD助力新款Swtich游戏机底座《4K/60HZ投屏方案》

Nintendo Switch&#xff08;OLED版&#xff09;正面搭载了一块分辨率为720P的7.0英寸OLED屏幕&#xff1b;具有白色和电光蓝电光红2种颜色&#xff1b;机身长度102毫米&#xff0c;宽度242毫米&#xff0c;厚度13.9毫米&#xff0c;重量约420克。 [2]Nintendo Switch&#xff…

明天报名!!济宁教师招聘报名照片及常见问题

明天报名!!济宁教师招聘报名照片及常见问题 山东济宁教师招聘1000多人 报名时间: 2024年4月25日9:00-4月28日16:00 缴费时间: 2024年4月25日11:00-4月30日16:00 打印准考证:2024年5月23日9:00-5月26日9:30 初审时间: 2024年4月25日11:00-4月29日16:00 查询时间: 2024年4月…

10、了解JVM判断对象可回收的神秘法则!

10.1、垃圾回收触发时机? 在我们之前的学习中,我们已经了解到,当我们的系统在运行过程中创建对象时,这些对象通常会被优先分配在所谓的“新生代”内存区域,如下图所示。 在新生代中,当对象数量逐渐增多,接近填满整个空间时,会触发垃圾回收机制。这个机制的作用是回收…

人工智能(pytorch)搭建模型28-基于Transformer的端到端目标检测DETR模型的实际应用,DETR的原理与结构

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型28-基于Transformer的端到端目标检测DETR模型的实际应用&#xff0c;DETR的原理与结构。DETR&#xff08;Detected Transformers&#xff09;是一种基于Transformer的端到端目标检测模型&…

IPV4报文格式和IP分片及计算

目录 1.IPV4报文格式 2.IP分片及计算 1.IPV4报文格式 版本&#xff1a;四位&#xff0c;IPV4 0100 4 ;IPV6 0110 6头部长度(IHL):最小值是5&#xff0c;最大值为15&#xff0c;单位4字节。IPV6固定头部长度40字节TOS:为区分服务字段&#xff0c;用区分服务类型&#xff0c;即…

半导体晶圆厂内外网数据单向导出,什么样的方案才安全又便捷?

半导体晶圆厂企业为了隔绝外部⽹络有害攻击、保护⽹络和数据安全&#xff0c;通常采⽤物理隔离的⽅式&#xff0c;将企业内⽹与互联⽹隔离。⽹络隔离后&#xff0c;基于业务开展需求&#xff0c;部分重要数据仍需由内⽹导⼊及导出⾄外部⽹络区域。为保障数据的安全合规性&#…

VMware配置centos虚拟机实现内网互通

VMware配置centos虚拟机实现内网互通 一、安装无桌面模式 环境说明&#xff1a; VMWare版本&#xff1a;VMware Workstation 17 Pro Centos版本&#xff1a;CentOS-7.9-x86_64-DVD-2009.iso 一键下载本文资源包 1. 安装虚拟机 下面是创建具体步骤,其中需要注意的是&#xff1…

如何优雅的实现 iframe 多层级嵌套通讯

前言 在前端开发项目中&#xff0c;不可避免的总会和 iframe 进行打交道&#xff0c;我们通常会使用 postMessage 实现消息通讯。 如果存在下面情况&#xff1a; iframe 父子通讯iframe 同层级通讯iframe 嵌套层级通讯 当面对这种复杂的情况的时候&#xff0c;通讯不可避免…

uniapp制作安卓原生插件踩坑

1.uniapp和Android工程互相引用讲解 uniapp原生Android插件开发入门教程 &#xff08;最新版&#xff09;_uniapp android 插件开发-CSDN博客 2.uniapp引用原生aar目录结构 详细尝试步骤1完成后生成的aar使用&#xff0c;需要新建nativeplugins然后丢进去 3.package.json示例…

机器学习——过拟合

一、过拟合得表现 模型在训练过程中&#xff0c;除了会出现过拟合现象&#xff0c;还有可能出现欠拟合的情况。相比而言&#xff0c;后者通常发生在建模前期&#xff0c;只要做好特征工程一般可以解决模型欠拟合问题。下图描述了模型在训练数据集上的三种情况&#xff1a; 其…

二阶响应曲面分析

文章目录 一、二阶响应曲面介绍1.1 什么时候用二阶响应曲面1. 非线性关系2. 探寻极值&#xff08;最大化或最小化&#xff09;3. 复杂的交互作用4. 精度要求高5. 探索性分析阶段 1.2响应曲面的特征 二、实例说明2.1 二阶模型求解 参考自《实验设计与数据处理》一书 一、二阶响应…