骁龙神经处理引擎SDK参考指南(4)

2024-01-16 09:30

本文主要是介绍骁龙神经处理引擎SDK参考指南(4),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

骁龙神经处理引擎SDK参考指南(4)

    • 4.4 用户定义的操作
      • 4.4.1 UDO概述
      • 4.4.2定义 UDO


4.4 用户定义的操作

4.4.1 UDO概述

介绍
SNPE 为用户提供了以用户定义操作(以下简称 UDO)的形式插入运行时引擎可能不支持的自定义神经网络操作的能力。这些可以是在 Tensorflow 等流行的训练框架中定义的操作,也可以是基于框架扩展构建但在 SNPE SDK 中不可用的自定义操作。它们可以在实现它们的任何支持的硬件加速器上本地执行。与执行内部支持的操作相比,SNPE 提供了以无缝方式执行这些操作的基础设施,几乎没有开销。

UDO 包剖析
SNPE 允许用户以动态库的形式提供 UDO 实现,动态库可以被查询、加载和运行,以使用其中定义的内核执行推理。SNPE 提倡“UDO 包”的概念,用户可以使用它轻松表达 UDO 不同组件之间的关联。这个概念是所有工具的核心,这些工具使用户能够创建要在网络推理中使用的 UDO 包。但是,需要注意的是,SNPE 仍然在运行时直接与各种 UDO 库交互,而不是与 UDO 包构造交互。因此,用户可以自由地构建独立的库,而不必严格遵守包的概念。

下图说明了 UDO 包的概念:

在这里插入图片描述
从图中可以看出,一个UDO包由一个注册组件和一个实现组件组成。它们通常分别表示为一个注册库和一组实现库,每个硬件加速器对应一个实现内核。如果愿意,用户可以选择将这两个组件构建到一个库中。
注册库由指定所有用户定义操作的方法和它们设计的硬件内核组成。它还包含允许在创建网络时验证操作是否正常的方法。注册库在ARM CPU上加载并执行。

特定于硬件的实现库公开了其他几种实现操作实例创建、执行、分析和销毁的方法。这些是通过相应软件平台支持的编程结构实现的,例如用于 GPU 的 OpenCL 和用于 DSP 的 Hexagon-NN SDK。虽然特定于内核的实现文件在源代码上可能完全不同,但它们都需要使用 $SDK_ROOT/share/SnpeUdo/include/SnpeUdo 中定义的一组 C API 与 SNPE 交互。可以从C++ API获得有关这些 API 的完整详细信息。

UDO 工作流程

SNPE 建议采用以下工作流程来开发 UDO 并将其集成到运行时中:

在这里插入图片描述
工作流的第一步是识别模型中需要表示为用户定义操作的操作,并通过配置文件描述它们的属性。该文件的格式和内容在定义 UDO中进行了描述。

下一组步骤通过为 UDO 内核创建源文件并根据适当的工具链编译它们以生成特定于硬件内核(如 GPU 和 DSP)的动态库来生成 UDO 包的组件。SNPE 提供了一个名为的工具,snpe-udo-package-generator该工具可帮助用户创建用于与 SNPE UDO API 接口的通用框架代码,并为用户留下占位符以填充内核实现。它还为 x86、Android 等常见目标以及配置文件中指定的每个目标的运行时生成 makefile。有关包生成的更多详细信息,请参阅创建 UDO 包。有关为特定运行时编译 UDO 包的详细信息,请参阅编译 UDO 包。

SNPE 模型转换工具还需要使用第一步中创建的配置文件以及实际训练的模型,以允许使用文件中的定义解释用户定义的操作。然后可以使用工具检查生成的 DLC 文件,例如snpe-dlc-info探测模型中 UDO 的属性。有关使用 UDO 创建(和可选量化)DLC 的详细信息,请参阅使用 UDO 准备模型. 或者,也可以使用 SNPE 量化工具对具有 UDO 的模型进行量化,以与 DSP 等定点运行时一起使用。量化器工具估计来自网络中所有层(包括 UDO)的激活的量化范围。由于该工具在 x86 主机上离线运行,因此需要有 UDO 的 CPU 实现,以便通过整个网络执行推理。这也在工作流程图中以虚线表示。有关量化过程的详细信息,请参阅使用 UDO 量化 DLC 。

此工作流程的最后一步是能够使用 UDO 实际执行网络模型。SNPE 应用程序使用 UDO 包在对选定网络模型运行推理的进程中注册 UDO 实现。应该注意的是,这些 UDO 可以在没有竞争条件的情况下由多个 SNPE 实例同时执行,这增加了网络推理的整体吞吐量。有关 UDO 包注册过程的更多详细信息,请参阅使用 UDO 运行模型。

如果 UDO 的 DSP 实现库未被签名以在签名过程域(SNPE 应用程序的默认设置)上执行,则需要请求使用未签名过程域。未签名的过程域仅适用于 DSP 目标,并允许 SNPE 使用未签名的 UDO 实现库。要查看如何将未签名的进程域与 SNPE 应用程序一起使用,请参阅使用 UDO 运行模型。

UDO 向后兼容性

本节指定 UDO 包的限制:

  • 针对特定SNPE 发布版本为DSP V68 编译的UDO,需要与相同的发布版本一起使用,不能与不同的发布版本一起使用。
  • 用户需要使用与特定 SNPE 版本兼容的正确 QNN SDK 重新编译为 DSP V68 生成的 UDO 包。
  • 由于 . 中的一些已知限制,用户需要使用适用于 DSP V68 的 SNPE 1.49 SDK 重新生成 UDO 包snpe-udo-package-generator。由于此限制,用户无法在 SNPE SDK 1.49 上使用 1.49 之前生成的 UDO 包。请注意此限制仅适用于 DSP V68 UDO 包。

4.4.2定义 UDO

用户定义的操作 (UDO) 允许用户将他们的自定义操作与 SNPE 集成,以便在任何支持的硬件加速器上执行。UDO 机制接受自定义操作(定义如下)的规范,并处理该信息以处理包含该自定义操作的模型。本节解释如何指定这样的 UDO。有关UDO 的更多详细信息,请参阅UDO 概述;有关如何将包含 UDO 的模型转换为受支持框架的 SNPE DLC 的详细信息,请参阅使用 UDO准备模型。

UDO 配置规范

如UDO 概述中所述部分,用户可以使用配置规范文件来表达他们的自定义操作的属性。此 UDO 配置(以下称为 UDO 配置)是对使用 Javascript 对象表示法 (JSON) 语法和格式创建的操作的描述。配置文件语法定义了可以键值对指定的字段,并按照JSON规则以树状结构排列。这些字段是预先确定的,最终将被解析为构成 UDO 的所需信息。提供的信息应该是通用的并且独立于特定模型,这意味着特定于模型的参数或名称不需要是配置的一部分。该信息将用于识别框架模型中的操作,然后最终序列化到 DLC 模型中。

UDO 配置字段说明

上述 UDO 配置文件的详细信息如下所述。

{“UdoPackage_0”:{“运营商”:[{“类型”: ””,“输入”:[{“名称”:“”,“per_core_data_types”:{“CPU”:“FLOAT_32”,“GPU”:“FLOAT_32”,“DSP”:“UINT_8”}"static": true, "tensor_layout": "NHWC"},{“名称”:“”,“数据类型”:“FLOAT_32”,"static": true, "tensor_layout": "NHWC"},],“输出”:[{“名称”:“”,“per_core_data_types”:{“CPU”:“FLOAT_32”,“GPU”:“FLOAT_32”,“DSP”:“UINT_8”}}{“名称”:“”,“data_type”:“FLOAT_32”}],“标量参数”:[{“名称”:“scalar_param_1”,“data_type”:“INT_32”}],“张量参数”:[{"name":"tensor_param_1",​​ "data_type": "FLOAT_32", "tensor_layout": "NHWC"},],“核心类型”:[“CPU”,“GPU”,“DSP”],“dsp_arch_types”:[“v66”、“v68”、“v69”、“v73”}],"UDO_PACKAGE_NAME": "MyCustomUdoPackage",}
}

上面的描述只是一个通用配置文件,用于帮助定义用户可以填写的字段。必填字段提供特定值,而可选字段用空字符串表示。请注意,可选字段仅意味着如果未提供则有默认值,或者将使用空字符串。下面按层次结构描述了每个可用字段的完整详细信息:

  • UdoPackage:每个 UDO 包都可以描述为“UdoPackage_i”,其中i表示生成包的顺序。用户也可以自由使用空字符串,但字典结构是必需的。
  • Operators:这是特定 UdoPackage 的子节点,指示存在的运算符数量。
    • type:定义操作的类型。
    • 输入:操作的输入张量列表。每个输入都是一个字典对象。2个
      • name:可选字段,描述输入张量的名称。由于输入张量的名称是可变的,因此用户无需提供此名称。
      • per_core_data_type:一个字典对象,指定每个核心中此输入张量的数据类型。或者,如果用户希望所有指定内核都具有相同的数据类型,则用户可以指定选项“data_type”,后跟数据类型。支持的数据类型是:
        • FLOAT_16
        • FLOAT_32
        • FIXED_4
        • FIXED_8
        • FIXED_16
        • UINT_8
        • UINT_16
        • UINT_32
        • 细绳
    • static:如果输入数据是静态的,即在模型中提供数据,则需要一个布尔字段。如果输入张量将包含数据,则需要设置此字段,否则输入将被动态处理,数据将不会被序列化。
    • tensor_layout:一个字符串字段,描述输入张量的规范维度格式。支持的值为:4
      - NCHW
      - 国家卫生健康委员会
    • 输出:操作的输出张量列表。2个
    • scalar_params:标量值属性的列表。3个
      - 名称:描述标量参数名称的必填字段。
      - data_type:描述此标量参数支持的数据类型的必填字段。
    • tensor_params:张量值属性列表。2 3
    • core_types:此特定操作的预期 IP 内核。支持的 core_types:
      - 中央处理器
      - 显卡
      - 数字信号处理器
    • dsp_arch_types: DSP 核心类型的预期 DSP 架构类型。支持的 dsp_arch_types:
      • v65
      • v66
      • v68
      • v69
      • v73
  • UDO_PACKAGE_NAME: UDO 包的名称,可以是任何有效的字符串。1个

这篇关于骁龙神经处理引擎SDK参考指南(4)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/612102

相关文章

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea

Python结合requests和Cheerio处理网页内容的操作步骤

《Python结合requests和Cheerio处理网页内容的操作步骤》Python因其简洁明了的语法和强大的库支持,成为了编写爬虫程序的首选语言之一,requests库是Python中用于发送HT... 目录一、前言二、环境搭建三、requests库的基本使用四、Cheerio库的基本使用五、结合req

使用Python处理CSV和Excel文件的操作方法

《使用Python处理CSV和Excel文件的操作方法》在数据分析、自动化和日常开发中,CSV和Excel文件是非常常见的数据存储格式,ython提供了强大的工具来读取、编辑和保存这两种文件,满足从基... 目录1. CSV 文件概述和处理方法1.1 CSV 文件格式的基本介绍1.2 使用 python 内

macOS怎么轻松更换App图标? Mac电脑图标更换指南

《macOS怎么轻松更换App图标?Mac电脑图标更换指南》想要给你的Mac电脑按照自己的喜好来更换App图标?其实非常简单,只需要两步就能搞定,下面我来详细讲解一下... 虽然 MACOS 的个性化定制选项已经「缩水」,不如早期版本那么丰富,www.chinasem.cn但我们仍然可以按照自己的喜好来更换

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont