使用 Neural Processing Engine 部署模型 模型 DLC(量化或非量化)可以通过启用了 SNPE 的应用(使用 SNPE C/C++ API 编写的应用)进行部署。SNPE 提供了用于加载 DLC、选择运行模型的运行时以及执行推理等的 API。 SNPE 提供了预构建的 snpe-net-run 工具(使用 C API 编写的应用),它可以加载任意模型 DLC 并对提供的输入运行该模型。
**模型文件:**由 SNPE 转换器工具或 snpe-dlc-graph-prepare 工具(如果在 HTP 上运行)生成的 DLC 模型文件。
**输入列表:**文本文件,类似于量化时使用的 input_list.txt 文件,不同之处在于此列表中的输入 raw 文件用于推理。为简单起见,本示例中推理使用与量化相同的输入列表。
**运行时:**用户必须选择在目标设备上运行模型的特定运行时。可用的运行时选项包括 CPU、GPU 和 DSP(HTP)。
有关更多详情,请参阅 snpe-net-run --help。
运行 SNPE .dlc:x86 主机 转换后的 SNPE .dlc 可以使用 snpe-net-run 工具运行,该工具以 .dlc 和输入列表作为参数。在 x86 上运行 SNPE DLC 纯粹用于调试目的。 例如,以下命令加载 inception_v3.dlc 模型并在 x86 CPU 上运行该模型。它将输出文件生成到 /output_x86/。
SNPE 的默认运行时是 CPU。使用 snpe-net-run 执行模型时,无需指定 CPU 运行时。
准备 SNPE 模型以在目标设备上运行 要在目标设备上运行模型,snpe-net-run 需要模型 .dlc、SNPE 运行时库和输入列表来运行推理以生成输出。
在目标设备上运行之前,请确保已将 SNPE SDK 二进制文件和库推送到目标设备。
使用来自 ${QAIRT_ROOT}/lib/aarch64-oe-linux-gcc11.2 和 ${QAIRT_ROOT}/bin/aarch64-oe-linux-gcc11.2 的工件 为 Qualcomm 评估套件使用正确的 DSP Hexagon 架构库: 适用于 Qualcomm 评估套件的 Hexagon 架构库
对于其他硬件的 Hexagon 架构,请查看此页面 。 需要在主机上执行以下 scp 命令,将 SNPE SDK 库和二进制文件复制到设备。
对于 IQ-8275,将 <dsp-arch> 替换为 75;对于 IQ-9075,替换为 73;对于 Qualcomm Dragonwing™ RB3 Gen 2,替换为 68。
上述步骤已为模型执行准备好设备。以下各节详细说明如何在可用的运行时上运行模型。 运行 SNPE .dlc:基于 Arm 的 CPU 在执行模型之前设置环境变量,以确保 SNPE 二进制文件和库可用于运行模型。
SNPE 的默认运行时是 CPU。使用 snpe-net-run 执行模型时,无需指定 CPU 运行时。
运行 SNPE DLC:GPU 要在 GPU 运行时上运行模型,请使用 inception_v3.dlc 并将输出保存在 output_gpu 中。 在目标设备的终端中,运行以下命令以启用 GPU 委托和后端:
要在 GPU 上运行,请使用 --use_gpu 命令行参数指定运行时。
运行 SNPE DLC:HTP 要在 HTP 后端上运行模型,请使用 inception_v3_quantized_with_htp_cache.dlc 并将输出保存在 output_htp 中。
要在 HTP 上运行,请使用 --use_dsp 命令行参数指定运行时。
验证输出 对于馈送给 snpe-net-run 的每个输入 raw 文件(通过 input_list 文件),都会生成一个输出文件夹,其中包含保存为 raw 文件的输出张量,其大小与模型的输出层相匹配,如下图所示。 在 inception_v3 示例中,输出 raw 文件是一个二进制文件,包含 1000 个分类类别的概率。 我们使用 Python 脚本将该文件读取为 NumPy 数组,以执行后处理和输出验证。以下示例检查 HTP 预测是否与 CPU 预测相同。
将输出文件复制到主机
将输出文件从目标设备复制到主机,以便验证输出。
在以下(compare.py)Python 脚本中使用上述命令中的 <path>。
比较 CPU 和 HTP 输出张量
将设备端推理的输出复制到主机后,准备一个脚本,加载保存在 output_htp 和 output_cpu 中的输出张量进行比较。 在本示例中,output_htp 和 output_cpu 都被复制到 ~/models 目录。 以下是比较其中一个示例输入输出的示例脚本。可以使用 numpy.fromfile(…) API 将 snpe-net-run 的输出加载到 NumPy ndarrays 中。
默认情况下,snpe-net-run 以 float32 格式将输出张量保存到 NumPy 文件中。
输出: 使用 SNPE API 进行部署 SNPE SDK 提供 C/C++ API,用于创建/开发在所选硬件(CPU、GPU 或 HTP)上以加速方式运行模型的应用。请参阅演示 SNPE C/C++ API 的示例应用 。 为了在构建完整用例管线(从摄像头串流、预处理图像、执行推理等)时改善开发者体验,SNPE 已作为插件(qtimlsnpe)集成到 Qualcomm IM SDK 中。 该插件基于 SNPE C API 开发,提供 SNPE 功能(加载和运行模型)。借助 qtimlsnpe 插件,您可以在 Qualcomm IM SDK 管线中使用转换后的模型 DLC 来实现用例。 有关如何使用 Qualcomm IM SDK 部署 SNPE DLC 的说明,请参阅 Qualcomm IM SDK 概述 。 使用 AI Engine Direct 部署模型 模型 .so(量化或非量化)可以通过启用了 QNN 的应用(使用 QNN C/C++ API 编写的应用)进行部署。QNN 提供了动态加载模型 .so 并使用所选后端在硬件上运行模型的 API。 QNN 提供了一个预构建工具(qnn-net-run ),它可以动态加载此模型 .so,并使用提供的输入在所选后端上执行推理。 对于 CPU、GPU 或 HTP 执行,qnn-net-run 需要以下参数:
**模型文件:**由 qnn-model-lib-generator 生成的 .so 文件
**后端文件:**目标后端的 .so 文件
CPU 后端使用 libQnnCpu.so。
GPU 后端使用 libQnnGpu.so。
HTP 后端使用 libQnnHtp.so。
**输入列表:**文本文件,类似于量化时使用的 input_list.txt 文件,不同之处在于此列表中的输入 raw 文件用于推理。为简单起见,本示例中推理使用与量化相同的输入列表。
运行 QNN .so:x86 主机 转换后的 QNN .so 可以使用 qnn-net-run 工具运行,该工具以模型 .so、后端库 .so 和输入列表作为参数。 例如,以下命令加载 libinception_v3.so 模型并在 x86 CPU 上运行该模型。它将输出文件生成到 ~/models/output_x86/。 准备 QNN 模型以在目标设备上运行 要在目标设备上运行模型,qnn-net-run 需要模型 .so、QNN 二进制文件和运行时库以及输入列表来运行推理以生成输出。
在目标设备上运行之前,请确保已将 QNN SDK 二进制文件和运行时库推送到目标设备。
使用来自 ${QAIRT_ROOT}/bin/aarch64-oe-linux-gcc11.2 和 ${QAIRT_ROOT}/lib/aarch64-oe-linux-gcc11.2 的工件 为 Qualcomm 评估套件使用正确的 DSP Hexagon 架构库: 适用于 Qualcomm 评估套件的 Hexagon 架构库
对于其他硬件的 Hexagon 架构,请查看此页面 。 在主机上运行以下 scp 命令,将 QNN SDK 库和二进制文件复制到设备。
对于 IQ-8275,将 <dsp-arch> 替换为 75;对于 IQ-9075,替换为 73;对于 Qualcomm Dragonwing™ RB3 Gen 2,替换为 68。
上述步骤已为模型执行准备好设备。以下各节详细说明如何在可用的运行时上运行模型。 运行 QNN .so:基于 Arm 的 CPU 在基于 Arm 的 CPU 上运行模型时,qnn-net-run 需要模型 .so、后端 .so 库和输入列表来运行推理以生成输出。 对于 RB3Gen2 目标设备,.so 必须使用 aarch64-oe-linux-gcc11.2 工具链交叉编译。 例如,以下命令将输出文件写入 /opt/output_cpu/。 在 GPU 上运行 QNN 模型 在目标设备的终端中,运行以下命令以启用 GPU 委托和后端: 在 Adreno GPU 上执行模型时,qnn-net-run 需要模型 .so、后端 .so 库(libQnnGpu.so)和输入列表来运行推理以生成输出。 例如,以下命令将输出文件写入 /opt/output_gpu/。 在 HTP 后端上运行 QNN 模型 要在 HTP 后端上运行模型,请使用 libquantized_inception_v3.so 库和 libQnnHtp.so 后端库,并将输出保存在 output_htp 目录中。 验证输出 对于馈送给 qnn-net-run 的每个 raw 输入文件(通过 input_list 文件),都会生成一个输出文件夹,其中包含 raw 输出文件,其大小与模型的输出层相匹配,如下图所示。 在此 inception_v3 示例中,raw 输出文件是一个二进制文件,包含 1000 个分类类别的概率。 您可以使用 Python 脚本将该文件读取为 NumPy 数组,以执行后处理和输出验证。以下示例脚本检查 HTP 预测是否与 CPU 预测相同。
在以下 Python 脚本中使用上述命令中的 <path>。
将 qnn-net-run 工具的输出从设备复制到主机后,创建一个简单的 Python 脚本,加载 CPU 和 HTP 执行的输出并使用 NumPy 进行比较。 输出: 使用 QNN API 进行部署 Qualcomm AI Engine Direct SDK 提供 C/C++ API,用于创建/开发能够加载已编译 .so 模型并在所选后端(CPU、GPU 或 HTP)上以加速方式运行的应用。请参阅演示 QNN C/C++ API 的示例应用 。 使用 Qualcomm IM SDK 进行部署 为了在构建完整用例管线(从摄像头串流、预处理图像、执行推理等)时改善开发者体验,QNN 已作为 qtimlqnn 插件集成到 Qualcomm IM SDK 中。 该插件基于 QNN C API 开发,提供动态加载和运行模型的能力。借助 qtimlqnn 插件,开发者可以在 Qualcomm IM SDK 管线中使用其转换和编译后的模型库来实现用例。 有关如何使用 Qualcomm IM SDK 部署 QNN 模型的说明,请参阅 Qualcomm IM SDK 概述 。 使用 QAIRT 部署模型 模型 .bin 可以通过启用了 QAIRT 的应用(使用 QAIRT C/C++ API 编写的应用)进行部署。QAIRT 提供了动态加载模型 .bin 并使用所选后端在硬件上运行模型的 API。 QAIRT 提供了一个预构建工具(qairt-net-run),它可以动态加载此模型 .bin,并使用提供的输入在所选后端上执行推理。 对于 CPU、GPU 或 HTP 执行,qairt-net-run 需要以下参数:
**模型文件:**用于在 HTP 上推理的由 qairt-dlc-prepare 生成的 .bin 文件,以及用于在 CPU 和 GPU 上推理的由 qairt-converter 生成的 .dlc 文件。
**后端文件:**目标后端的 .so 文件。
CPU 后端使用 libQairtCpu.so。
GPU 后端使用 libQairtGpu.so。
HTP 后端使用 libQairtHtp.so。
**输入列表:**文本文件,类似于量化时使用的 input_list.txt 文件,不同之处在于此列表中的输入 raw 文件用于推理。为简单起见,本示例中推理使用与量化相同的输入列表。
在 x86 主机上运行 DLC 转换后的 QAIRT DLC 可以使用 qairt-net-run 工具运行,该工具以模型 .dlc、后端库 .so 和输入列表作为参数。例如,以下命令加载 inceptionv3.serialized.bin 模型并在 x86 CPU 上运行该模型。它将输出文件生成到 ~/models/output_x86/。 运行以下命令在 x86 机器上对模型进行推理: 准备在目标设备上运行模型 要在目标设备上运行模型,qairt-net-run 需要模型 .bin、.dlc、QAIRT 二进制文件和运行时库以及输入列表来运行推理以生成输出。
在目标设备上运行之前,请确保已将 QAIRT SDK 二进制文件和运行时库推送到目标设备。
使用来自 ${QAIRT_ROOT}/bin/aarch64-oe-linux-gcc11.2 和 ${QAIRT_ROOT}/lib/aarch64-oe-linux-gcc11.2 的工件。 为 Qualcomm 评估套件使用正确的 DSP Hexagon 架构库: 在主机上运行以下 scp 命令,将 QAIRT SDK 库和二进制文件复制到设备。
对于 IQ-8275,将 <dsp-arch> 替换为 75;对于 IQ-9075,替换为 73;对于 Qualcomm Dragonwing™ RB3 Gen 2,替换为 68。
运行以下命令,将所有模型、input.txt 和 raw 文件推送到目标设备 在基于 Arm 的 CPU 上运行 QAIRT .dlc 在基于 Arm 的 CPU 上运行模型时,qairt-net-run 需要模型 .dlc、后端 .so 库和输入列表来运行推理以生成输出。
例如,以下命令将输出文件写入 /opt/output_cpu/。 在 GPU 上运行 QAIRT 模型 运行以下命令以启用 GPU 委托和后端: 在 Adreno GPU 上执行模型时,qairt-net-run 需要模型 .dlc、后端 .so 库(libQairtGpu.so)和输入列表来运行推理以生成输出。
例如,以下命令将输出文件写入 /opt/output_gpu/。 在 HTP 上运行 QAIRT 模型 要在 HTP 后端上运行模型,请使用模型 .bin 文件和 libQairtHtp.so 后端库,并将输出保存在 output_htp 目录中。 验证输出 对于馈送给 qairt-net-run 的每个 raw 输入文件(通过 input_list 文件),都会生成一个输出文件夹,其中包含 raw 输出文件,其大小与模型的输出层相匹配,如下图所示。 在此 inception_v3 示例中,raw 输出文件是一个二进制文件,包含 1000 个分类类别的概率。您可以使用 Python 脚本将该文件读取为 NumPy 数组,以执行后处理和输出验证。以下示例脚本检查 HTP 预测是否与 CPU 预测相同。 将 qairt-net-run 工具的输出从设备复制到主机后,创建一个简单的 Python 脚本,加载 CPU 和 HTP 执行的输出并使用 NumPy 进行比较。 输出: 使用 QAIRT API 进行部署 QAIRT SDK 提供 C/C++ API,用于创建/开发能够加载已编译 .bin 模型并在所选后端(CPU、GPU 或 HTP)上以加速方式运行的应用。请参阅演示 QAIRT C/C++ API 的示例应用 。