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

news2024/11/25 22:57:55

本文翻译自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 的许多差距和不一致,如果有人有更新的版本,我们将不胜感激。
在这里插入图片描述

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

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

相关文章

Jetpack Compose简介

文章目录 Jetpack Compose简介概述声明式UI和命令式UIJetpack Compose和Android View对比Compose API设计原则一切皆为函数组合优于继承单一数据源 Jetpack Compose和Android View关系使用ComposesetContent()源码ComposablePreview Jetpack Compose简介 概述 Jetpack Compos…

数据结构-二叉搜索树(BST)

目录 什么是二叉搜索树 二叉搜索树的特性 (1)顺序性 (2)局限性 二叉搜索树的应用 二叉搜索树的操作 (1)查找节点 (2)插入节点 (3)删除节点 (4)中序遍历 什么是二叉搜索树 如图所示,二叉搜索树(binary search tree)满足以下条件。…

Unity 递归实现数字不重复的排列组合

实现 private void Permutation(List<int> num, int leftIndex, List<string> strs) {if (leftIndex < num.Count){for (int rightIndex leftIndex; rightIndex < num.Count; rightIndex){Swap(num, leftIndex, rightIndex);Permutation(num, leftIndex 1…

【深度学习】【Lora训练1】StabelDiffusion,Lora训练过程,秋叶包,Linux,SDXL Lora训练

文章目录 一、环境搭建指南二、个性化安装流程三、启动应用四、打开web五、开始训练 19.27服务器 一、环境搭建指南 打造一个高效且友好的开发环境&#xff1a; 项目源码获取&#xff1a; 通过以下命令轻松克隆项目及所有子模块至您的Linux系统&#xff1a; git clone --recu…

workminer之dht通信部分

workminer是通过SSH爆破传播的挖矿木马&#xff0c;感染后会释放xmrig挖矿程序利用主机的CPU挖取北方门罗币。该样本能够执行特定的指令&#xff0c;指令保存在一个配置文件config中&#xff0c;config文件类似于xml文件&#xff0c;里面有要执行的指令和参数&#xff0c;样本中…

服务注册与发现Eureka、Zookeeper、Consul 三个注册中心的异同点(CAP理论)

Eureka Eureka是由Netflix开源的一个服务注册和发现组件&#xff0c;它主要用于构建高可用、分布式系统的基础设施中。Eureka的服务器端被称为Eureka Server&#xff0c;客户端则是那些需要注册的服务。Eureka具有以下特点&#xff1a; 高可用性&#xff1a;Eureka支持多节点…

小米汽车充电枪继电器信号

继电器型号&#xff1a; 参考链接 小米SU7&#xff0c;便捷充放电枪拆解 (qq.com)https://mp.weixin.qq.com/s?__bizMzU5ODA2NDg4OQ&mid2247486086&idx1&sn0dd4e7c9f7c72d10ea1c9f506faabfcc&chksmfe48a110c93f2806f6e000f6dc6b67569f6e504220bec14654ccce7d…

Linux网络开发基础知识

一个网络服务器的简单实现 项目需求 实现回声服务器的客户端/服务器程序&#xff0c;客户端通过网络连接到服务器&#xff0c;并发送任意一串英文信息&#xff0c;服务器端接收信息后&#xff0c; 将每个字符转换为大写并回送给客户端显示。 eoch_client.c #include <arpa/i…

Android双向认证配置过程

1&#xff08;可以绕过&#xff09;准备过程 为了让这个教程可以一直复用&#xff0c;打算直接写一个双向认证的APP作为素材。 工具&#xff1a; ●protecle&#xff08;签名文件转换&#xff09; ●keytool&#xff08;java自己就有&#xff09; ●openssl&#xff08;apache里…

前端canvas项目实战——在线图文编辑器(九):逻辑画布

目录 前言一、 效果展示二、 实现步骤1. 调整布局&#xff0c;最大化利用屏幕空间2. 添加逻辑画布3. 添加遮罩4. 居中显示逻辑画布5. 一个容易被忽视的bug点 三、Show u the code后记 前言 上一篇博文中&#xff0c;我们实现了一组通用的功能按钮&#xff1a;复制、删除、锁定…

LeetCode-hot100题解—Day5

原题链接&#xff1a;力扣热题-HOT100 我把刷题的顺序调整了一下&#xff0c;所以可以根据题号进行参考&#xff0c;题号和力扣上时对应的&#xff0c;那么接下来就开始刷题之旅吧~ 1-8题见LeetCode-hot100题解—Day1 9-16题见LeetCode-hot100题解—Day2 17-24题见LeetCode-hot…

httpClient提交报文中文乱码

httpClient提交中文乱码&#xff0c;ContentType类型application/json 指定提交参数的编码即可 StringEntity se new StringEntity(paramBody.toJSONString(),"UTF-8");se.setContentType("application/json");context.httpPost.setHeader("Cookie&…

Go-Zero从0到1实现微服务项目开发(二)

前言 书接上回&#xff0c;继续更新GoZero微服务实战系列文章。 上一篇被GoZero作者万总点赞了&#xff0c;更文动力倍增&#xff0c;也建议大家先看巧一篇&#xff0c;欢迎粉丝股东们三连支持一波&#xff1a;Go-zero微服务快速入门和最佳实践&#xff08;一&#xff09; 本…

Windows Server 2022 OVF, updated Apr 2024 (sysin) - VMware 虚拟机模板

Windows Server 2022 OVF, updated Apr 2024 (sysin) - VMware 虚拟机模板 2024 年 4 月版本更新&#xff0c;现在自动运行 sysprep&#xff0c;支持 ESXi Host Client 部署 请访问原文链接&#xff1a;Windows Server 2022 OVF, updated Apr 2024 (sysin) - VMware 虚拟机模…

从Kernel启动到Android系统整个过程源码分析

1、 第一阶段&#xff1a; 对于ARM的处理器&#xff0c;内核第一个启动的文件是arc/arm/kernel下面的head.S文件。当然arc/arm/boot/compress下面也有这个文件&#xff0c;这个文件和上面的文件略有不同&#xff0c;当要生成压缩的内核时zImage时&#xff0c;启动的是后者&…

企业如何保证内部传输文件使用的工具是安全的?

企业内部文件的频繁交换成为了日常运营不可或缺的一环。然而&#xff0c;随着数据量的爆炸式增长和网络攻击手段的日益复杂&#xff0c;内网文件传输的安全隐患也日益凸显&#xff0c;成为企业信息安全的薄弱环节。本文将探讨内网文件传输的安全风险、企业常用的防护措施。 内网…

《Fundamentals of Power Electronics》——Buck、Boost、Buck-Boost三个电路的CCM-DCM工作特性总结

Buck、Boost、Buck-Boost这三个电路的CCM-DCM工作特性总结如下表所示&#xff1a; Buck、Boost、Buck-Boost这三个电路工作在DCM模式下电压传输比的对比图如下所示&#xff1a; 由上图可知&#xff0c;Buck-Boost电路的工作特性是一条斜率为的直线&#xff0c;Buck电路和Boost电…

小长假来临,企业借助巡检系统做好安全巡查工作

节前节后是安全隐患事故多发期&#xff0c;小长假来了&#xff0c;企业面临着员工离岗、生产活动减少等特殊情况&#xff0c;这可能导致一些安全隐患被忽视。因此&#xff0c;借助巡检系统做好全面安全巡查工作显得尤为重要。巡检系统可以帮助企业实现巡检工作的规范化、标准化…

八_实验1:创建 VLAN 和划分端口

1、实验目的 通过本实验可以掌握&#xff1a; VLAN的概念。创建VLAN的方法。把交换机端口划分到VLAN中的方法。 2、实验​​​​​​拓扑 创建 VLAN 和划分端口的实验拓扑如下图所示。 图8-5 创建 VLAN 和划分端口的实验拓扑 3、实验步骤 &#xff08;1&#xff09;实验准…

C++:map和set的封装

关于红黑树的模拟实现&#xff0c;大家不清楚的先去看看博主的博客再来看这篇文章&#xff0c;因为set和map的封装底层都是利用用的红黑树。所以这里不会过多介绍红黑树的相关内容&#xff0c;而更多的是去为了契合STL中的红黑树去进行改造&#xff0c;让封装的set和map能够去复…