NPU 硬件架构及张量技术开发

这里以 V853 芯片内置 NPU 为对象学习 NPU 架构。这个 NPU,其处理性能为最大 1 TOPS 并切带有 128KB 内部高速缓存用于高速数据交换,支持 OpenCL、OpenVX、android NN 与 ONNX 的 API 调用,同时也支持导入大量常用的深度学习模型。

1 系统架构

在这里插入图片描述

上层的应用程序可以通过加载模型与数据到 NPU 进行计算,也可以使用 NPU 提供的软件 API 操作 NPU 执行计算。

NPU包括三个部分:

  • 可编程引擎(Programmable Engines,PPU):可编程引擎可以使用 EVIS 硬件加速指令与 Shader 语言进行编程,也可以实现激活函数等操作。
  • 神经网络引擎(Neural Network Engine,NN):神经网络引擎包含 NN 核心与 Tensor Process Fabric(TPF,图中简写为 Fabric) 两个部分。NN核心一般计算卷积操作, Tensor Process Fabric 则是作为 NN 核心中的高速数据交换的通路。
  • 各级缓存

算子是由可编程引擎与神经网络引擎共同实现的。

NPU 支持 UINT8,INT8,INT16 三种数据格式。

2 NPU 模型转换

NPU 使用的模型是 NPU 自定义的一类模型结构,不能直接将网络训练出的模型直接导入 NPU 进行计算。这就需要将网络训练出的模型到 NPU 的模型上。

NPU 的模型转换步骤如下图所示:

在这里插入图片描述

NPU 模型转换包括准备阶段、量化阶段与验证阶段。

2.1 准备阶段

首先把准备好的模型使用工具导入,并创建配置文件。这时候工具会把模型导入并转换为 NPU 所使用的网络模型、权重模型与配置文件。

配置文件用于对网络的输入和输出的参数进行描述以及配置。这些参数包括输入/输出 tensor 的形状、归一化系数 (均值/零点)、图像格式、tensor 的输出格式、后处理方式等等。

2.2 量化阶段

由于训练好的神经网络对数据精度以及噪声的不敏感,因此可以通过量化将参数从浮点数转换为定点数。这样做有两个优点:

  • 减少了数据量,进而可以使用容量更小的存储设备,节省了成本;
  • 由于数据量减少,浮点转化为定点数也大大降低了系统的计算量,也提高了计算的速度。

但是量化也有一个致命缺陷,会导致精度的丢失。

由于浮点数转换为定点数时会大大降低数据量,导致实际的权重参数准确度降低。在简单的网络里这不是什么大问题,但是如果是复杂的多层多模型的网络,每一层微小的误差都会导致最终数据的错误。

但是对于原始网络,由于使用的是浮点数,无法将数据导入到只支持定点运算的 NN 核心进行计算,这就需要可编程引擎来代替 NN 核进行计算,这样可能大大降低运算效率。

在进行量化过程中,不仅对参数进行了量化,也会对输入输出的数据进行量化。如果模型没有输入数据,就不知道输入输出的数据范围。这时候就需要准备一些具有代表性的输入来参与量化。这些输入数据一般从训练模型的数据集里获得,例如图片数据集里的图片。

另外选择的数据集不一定要把所有训练数据全部加入量化,通常我们选择几百张能够代表所有场景的输入数据就即可。理论上说,量化数据放入得越多,量化后精度可能更好,但是到达一定阈值后效果增长将会非常缓慢甚至不再增长。

2.3 验证阶段

由于上一阶段对模型进行了量化导致了精度的丢失,就需要对每个阶段的模型进行验证,对比结果是否一致。

首先需要使用非量化情况下的模型运行生成每一层的 tensor 作为 Golden tensor。输入的数据可以是数据集中的任意一个数据。然后量化后使用预推理相同的数据再次输出一次 tensor,对比这一次输出的每一层的 tensor 与 Golden tensor 的差别。

如果差别较大可以尝试更换量化模型和量化方式。差别不大即可使用 IDE 进行仿真。也可以直接部署到 V853 上进行测试。

此时测试同样会输出 tensor 数据,对比这一次输出的每一层的 tensor 与 Golden tensor 的差别,差别不大即可集成到 APP 中了。

3 NPU 模型的部署

NPU 系统的模型部署流程一般包括以下四个部分:

在这里插入图片描述

数据预处理,将数据处理到适合模型使用的过程。

这里就以一个图像主体识别案例来举例:摄像头捕获到了图像数据,其数据格式是 YUV 的,而模型使用的输入数据是 RGB 的数据,所以需要使用前处理将 YUV 数据转换到 RGB。

接下来是将模型加载到 NPU 内,初始化 NPU 的环境与分配内存,然后将之前预处理的数据交给 NPU 进行计算。计算后 NPU 会输出一个 tensor 数据,这时候就需要数据后处理,将 tensor 数据转换为具体的坐标与类型,就可以反馈到上层应用程序做应用的处理了。

### DSP 和 NPU 架构设计原理与实现 #### 数字信号处理器 (DSP) 的架构特点 数字信号处理器专为高效处理数字信号而设计,具有独特的硬件结构以支持复杂的数学运算。这类处理器优化了乘法累加(MAC)操作的速度和效率,因为MAC是许多信号处理算法中的核心组成部分[^1]。 对于实时音频或视频流的数据密集型任务而言,DSP提供了专门指令集和支持并行处理的能力,从而可以在单位时间内完成更多的计算工作量。此外,为了适应不同应用场景的需求,现代DSP还具备灵活可编程特性以及低功耗优势。 #### 神经网络处理单元(NPU)的设计理念 神经网络处理单元专注于加速人工智能尤其是深度学习模型推理过程中的矩阵运算。NPU内部采用了大量SIMD(单指令多数据)类型的ALU阵列来并发执行相同的操作于多个输入之上;同时配合高效的缓存机制减少对外部内存访问次数进而提升整体性能表现。 在具体实现方面,NPU往往被集成到SoC(System on Chip)当中并与传统CPU共享同一片物理空间。这样的布局不仅有助于降低系统复杂度同时也促进了不同类型算力资源间的协作交流——例如当遇到非AI相关的通用计算需求时便交由后者负责处理。 #### 华为提出的ISP+NPU融合架构创新之处 华为基于多年积累下来的ISP(Image Signal Processor)技术研发经验和对整个成像流程深刻理解的基础上,创造性地提出了将两者结合起来形成一种新型混合式体系结构。在这种模式下,NPU可以直接参与到图像预处理阶段的工作之中,如降噪、色彩校正等;与此同时还能利用其强大的特征提取能力辅助后续高级视觉分析任务,比如物体识别分类等等. ```python class ISP_NPU_Fusion: def __init__(self): self.isp_pipeline = [] self.npu_accelerator = None def integrate_npu(self, npu_unit): """Integrate the NPU unit into ISP pipeline""" self.npu_accelerator = npu_unit def process_image(self, raw_data): processed_data = raw_data.copy() # Apply traditional ISP operations first for operation in self.isp_pipeline: processed_data = operation(processed_data) # Then leverage NPU for advanced features extraction and optimization if self.npu_accelerator is not None: processed_data = self.npu_accelerator.enhance_features(processed_data) return processed_data ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值