Qualcomm® AI Engine Direct 使用手册(22)

本博客是关于 Qualcomm® AI Engine Direct 的教程,重点介绍使用 QNN 转换并执行 CNN 模型。从获取 Inception V3 模型文件开始,涵盖模型转换、量化、构建等步骤,还详细说明了在 Linux、Android、Windows 等不同主机及 CPU、DSP、GPU、HTP、LPAI 等后端的执行方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qualcomm® AI Engine Direct 使用手册(22)


9 教程

本部分包含有用的教程,可帮助用户熟悉 Qualcomm® AI Engine Direct工作流程,并能够与 Qualcomm® AI Engine Direct API 和工具进行交互,以实现基于深度学习的用例。

8.1 入门

8.1.1 使用 QNN 转换并执行 CNN 模型

以下教程将演示QNN 工具 和QNN API的端到端用法。此过程从经过训练的源框架模型开始,使用 QNN 转换器将其转换并构建到一系列 QNN API 调用中,然后在特定后端上执行。

本教程将使用 Inception V3 作为源框架模型,并qnn-net-run使用可执行文件作为示例应用程序。执行将显示主机(CPU 和 HTP)和设备上的 CPU、GPU、DSP 和 HTP 后端的使用情况。

教程设置
本教程假设已在安装中遵循一般安装说明。

此外,本教程需要获取 Inception V3 Tensorflow 模型文件和示例图像。这是由提供的安装脚本处理的setup_inceptionv3.py。该脚本位于:

${QNN_SDK_ROOT}/examples/Models/InceptionV3/scripts/setup_inceptionv3.py

用法如下:

usage: setup_inceptionv3.py [-h] -a ASSETS_DIR [-d] [-c] [-q]

Prepares the inception_v3 assets for tutorial examples.

required arguments:
  -a ASSETS_DIR, --assets_dir ASSETS_DIR
                        directory containing the inception_v3 assets

optional arguments:
  -d, --download        Download inception_v3 assets to inception_v3 example
                        directory
  -c, --convert_model   Convert and compile model once acquired.
  -q, --quantize_model  Quantize the model during conversion. Only available
                        if --c or --convert_model option is chosen

在使用脚本之前,请将环境变量设置TENSORFLOW_HOME为指向TensorFlow包的安装位置。该脚本使用 TensorFlow 实用程序,例如 optimize_for_inference.py,它们位于 TensorFlow 安装目录中。要查找 TensorFlow 包的位置,请运行以下命令:

$ python3 -m pip show tensorflow

使用上述命令输出中的 Location 字段设置环境变量:

$ export TENSORFLOW_HOME=<tensorflow-location>/tensorflow_core

要运行脚本,请使用:

$ python3 ${QNN_SDK_ROOT}/examples/Models/InceptionV3/scripts/setup_inceptionv3.py -a ~/tmpdir -d

这将填充模型文件:

${QNN_SDK_ROOT}/examples/Models/InceptionV3/tensorflow/inception_v3_2016_08_28_frozen.pb

原始图像位于:

${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped

型号转换
获取模型资产后,可以将模型转换为一系列 QNN API 调用,并随后构建供应用程序使用。

笔记
HTP 和 DSP 后端需要使用量化模型。请参阅模型量化以生成量化模型。

对于 x86_64-windows 下的模型转换,请在设置 python 依赖项Windows Platform Dependencies后,在命令前面执行带有 command 的 Python 脚本。下面是一个例子: $ py -3 qnn-tensorflow-converter py -3

在下面的 x86_64-windows 代码块中查看 Inception V3 模型的更多详细信息:

要转换 Inception V3 模型,请使用qnn-tensorflow-converter:

$ ${QNN_SDK_ROOT}/bin/x86_64-linux-clang/qnn-tensorflow-converter \
  --input_network ${QNN_SDK_ROOT}/examples/Models/InceptionV3/tensorflow/inception_v3_2016_08_28_frozen.pb \
  --input_dim input 1,299,299,3 \
  --out_node InceptionV3/Predictions/Reshape_1 \
  --output_path ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model/Inception_v3.cpp \

在 x86_64-windows 中,

$ py -3 ${QNN_SDK_ROOT}\bin\x86_64-windows-msvc\qnn-tensorflow-converter `
  --input_network ${QNN_SDK_ROOT}/examples/Models/InceptionV3/tensorflow/inception_v3_2016_08_28_frozen.pb `
  --input_dim input 1,299,299,3 `
  --out_node InceptionV3/Predictions/Reshape_1 `
  --output_path ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model/Inception_v3.cpp `

这将产生以下工件:

  • ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model/Inception_v3.cpp

  • ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model/Inception_v3.bin

  • ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model/Inception_v3_net.json

这些工件包括包含 API 调用序列的 .cpp 文件,以及包含与模型关联的静态数据的 .bin 文件。

模型量化
要使用量化模型而不是浮点模型,请按照以下步骤操作:

$ ${QNN_SDK_ROOT}/bin/x86_64-linux-clang/qnn-tensorflow-converter \
  --input_network ${QNN_SDK_ROOT}/examples/Models/InceptionV3/tensorflow/inception_v3_2016_08_28_frozen.pb \
  --input_dim input 1,299,299,3 \
  --out_node InceptionV3/Predictions/Reshape_1 \
  --output_path ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model/Inception_v3_quantized.cpp \
  --input_list ${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped/raw_list.txt

这将产生以下工件:

  • ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model/Inception_v3_quantized.cpp

  • ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model/Inception_v3_quantized.bin

  • ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model/Inception_v3_quantized_net.json

笔记
在转换期间量化模型时,输入列表必须包含输入数据的绝对路径。

模型构建
模型转换后,将使用以下命令构建qnn-model-lib-generator:

Linux 主机上的模型构建

$ ${QNN_SDK_ROOT}/bin/x86_64-linux-clang/qnn-model-lib-generator \
  -c ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model/Inception_v3.cpp \
  -b ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model/Inception_v3.bin \
  -o ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model_libs # This can be any path

这将产生以下工件:

  • ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model_libs/aarch64-android/libInception_v3.so

  • ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model_libs/x86_64-linux-clang/libInception_v3.so

笔记
默认情况下,库是为所有目标构建的。要针对特定​​目标进行编译,请将 -t 选项与 qnn-model-lib-generator 结合使用。 的选择是 aarch64-android 和 x86_64-linux-clang。

或者,可以使用提供的设置脚本完成上述步骤(模型转换和模型构建)。要使用脚本转换并构建 Inception v3 模型,请运行:

$ python3 ${QNN_SDK_ROOT}/examples/Models/InceptionV3/scripts/setup_inceptionv3.py -a ~/tmpdir -d -c

这将产生与上面相同的工件。

构建量化模型的步骤与上述相同:

$ ${QNN_SDK_ROOT}/bin/x86_64-linux-clang/qnn-model-lib-generator \
  -c ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model/Inception_v3_quantized.cpp \
  -b ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model/Inception_v3_quantized.bin \
  -o ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model_libs # This can be any path

这将产生以下工件:

  • ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model_libs/aarch64-android/libInception_v3_quantized.so

  • ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model_libs/x86_64-linux-clang/libInception_v3_quantized.so

或者,可以使用提供的设置脚本完成上述步骤。要使用以下脚本转换、量化和构建模型 Inception V3:

$ python3 ${QNN_SDK_ROOT}/examples/Models/InceptionV3/scripts/setup_inceptionv3.py -a ~/tmpdir -d -c -q

这将产生与上面相同的工件。

Windows 主机上的模型构建
要将模型文件构建到 Windows 主机上的 DLL 库中,我们需要打开.Developer PowerShell for VS 2022

$ mkdir C:\tmp\qnn_tmp

将以下文件复制到c:\tmp\qnn_tmp

- ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model/Inception_v3.cpp
- ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model/Inception_v3.bin

确保您已使用Windows 环境设置${QNN_SDK_ROOT}设置了环境变量。

最后,我们可以通过以下方式生成模型 DLL 库:

$ cd C:\tmp\qnn_tmp

$ py -3 ${QNN_SDK_ROOT}\bin\x86_64-windows-msvc\qnn-model-lib-generator `
    -c .\Inception_v3.cpp `
    -b .\Inception_v3.bin `
    -o model_libs `
    -t windows-x86_64 # you can also specify windows-aarch64 for ARM64 platform

现在您将在 下找到 Inception_v3.dll C:\tmp\qnn_tmp\model_libs\x64,并准备好执行推理。

笔记
通过指定所需的平台,可以为 x64 或 ARM64 平台构建模型 DLL 库。

同样,要将量化模型文件构建到 Windows 主机上的 DLL 库中,我们需要打开.Developer PowerShell for VS 2022

$ mkdir C:\tmp\qnn_tmp

将以下文件复制到c:\tmp\qnn_tmp

- ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model/Inception_v3_quantized.cpp
- ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model/Inception_v3_quantized.bin

确保您已使用Windows 环境设置${QNN_SDK_ROOT}设置了环境变量。

最后,我们可以通过以下方式生成模型 DLL 库:

$ cd C:\tmp\qnn_tmp

$ py -3 ${QNN_SDK_ROOT}\bin\x86_64-windows-msvc\qnn-model-lib-generator `
    -c .\Inception_v3_quantized.cpp `
    -b .\Inception_v3_quantized.bin `
    -o model_libs `
    -t windows-aarch64

现在你将拥有Inception_v3_quantized.dll下C:\tmp\qnn_tmp\model_libs\ARM64。

要在 Windows 主机上执行推理,需要复制输入数据。

将以下文件和目录复制到 Windows 主机C:\tmp\qnn_tmp。

- ${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped
- ${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/target_raw_list.txt
- ${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/imagenet_slim_labels
- ${QNN_SDK_ROOT}/examples/Models/InceptionV3/scripts/show_inceptionv3_classifications.py

我们现在已准备好在 Windows 主机上执行部分。

CPU后端执行
在Linux主机上执行
qnn-net-run编译模型库后,可以使用以下命令执行模型:

$ cd ${QNN_SDK_ROOT}/examples/Models/InceptionV3
$ ${QNN_SDK_ROOT}/bin/x86_64-linux-clang/qnn-net-run \
              --backend ${QNN_SDK_ROOT}/lib/x86_64-linux-clang/libQnnCpu.so \
              --model ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model_libs/x86_64-linux-clang/libInception_v3.so \
              --input_list data/cropped/raw_list.txt

这将产生以下结果:

  • ${QNN_SDK_ROOT}/examples/Models/InceptionV3/output

要查看结果,请使用:

$ python3 ${QNN_SDK_ROOT}/examples/Models/InceptionV3/scripts/show_inceptionv3_classifications.py -i data/cropped/raw_list.txt \
                                                                               -o output/ \
                                                                               -l data/imagenet_slim_labels.txt

在Android上执行
在 Android 目标上运行 CPU 后端与在 Linux x86 目标上运行非常相似。

首先,在设备上为示例创建一个目录:

# make inception_v3 if necessary
$ adb shell "mkdir /data/local/tmp/inception_v3"

现在将必要的库推送到设备:

$ adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnCpu.so /data/local/tmp/inception_v3
$ adb push ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model_libs/aarch64-android/*.so /data/local/tmp/inception_v3

现在将输入数据和输入列表推送到设备:

$ adb push ${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped /data/local/tmp/inception_v3
$ adb push ${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/target_raw_list.txt /data/local/tmp/inception_v3

推送qnn-net-run工具:

$ adb push ${QNN_SDK_ROOT}/bin/aarch64-android/qnn-net-run /data/local/tmp/inception_v3

现在在设备上设置环境:

$ adb shell
$ cd /data/local/tmp/inception_v3
$ export LD_LIBRARY_PATH=/data/local/tmp/inception_v3

qnn-net-run最后,与以下内容一起使用:

$ ./qnn-net-run --backend libQnnCpu.so --model libInception_v3.so --input_list target_raw_list.txt
运行的输出将位于默认的 ./output 目录中。退出设备并查看结果:

$ exit
$ cd ${QNN_SDK_ROOT}/examples/Models/InceptionV3
$ adb pull /data/local/tmp/inception_v3/output output_android
$ python3 ${QNN_SDK_ROOT}/examples/Models/InceptionV3/scripts/show_inceptionv3_classifications.py -i data/cropped/raw_list.txt \
                                                                               -o output_android/ \
                                                                               -l data/imagenet_slim_labels.txt

在 Windows 主机上执行
请确保在继续之前已完成Windows 主机上的模型构建部分。

首先,在 Windows 主机上创建以下文件夹:C:\qnn_test_package。

现在,将必要的库复制到工作目录:C:\qnn_test_package

- ${QNN_SDK_ROOT}\lib\x86_64-windows-msvc\QnnCpu.dll
- C:\tmp\qnn_tmp\model_lib\x64\Inception_v3.dll (generated above)

现在,将输入数据和输入列表复制到C:\qnn_test_package

- C:\tmp\qnn_tmp\cropped
- C:\tmp\qnn_tmp\target_raw_list.txt
- C:\tmp\qnn_tmp\imagenet_slim_labels
- C:\tmp\qnn_tmp\show_inceptionv3_classifications.py

现在,将该qnn-net-run.exe工具复制到C:\qnn_test_package:

- ${QNN_SDK_ROOT}\bin\x86_64-windows-msvc\qnn-net-run.exe

要运行qnn-net-run.exe工具,请打开:“Developer PowerShell for VS 2022”

$ cd C:\qnn_test_package

$ .\qnn-net-run.exe `
   --model .\Inception_v3.dll `
   --input_list .\target_raw_list.txt `
   --backend .\QnnCpu.dll

推理完成后,我们可以检查分类结果。默认情况下,运行的输出将位于该.\output目录中。

然后,打开运行:“Developer PowerShell for VS 2022”

$ cd C:\qnn_test_package

$ py -3 .\show_inceptionv3_classifications.py `
     -i .\cropped\raw_list.txt `
     -o output `
     -l .\imagenet_slim_labels.txt

分类结果应为:

${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped/trash_bin.raw   0.777344 413 ashcan
${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped/chairs.raw      0.253906 832 studio couch
${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped/plastic_cup.raw 0.980469 648 measuring cup
${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped/notice_sign.raw 0.167969 459 brass

DSP后端执行
在Android上执行
在 Android 目标上运行 DSP 后端与在 Android 目标上运行 CPU、HTP 和 GPU 后端非常相似。本节的其余部分将假设目标具有 v66 DSP。

与HTP后端类似,DSP后端也需要量化模型。要生成量化模型,请参阅模型量化。首先,在设备上为示例创建一个目录:

# make inception_v3 if necessary
$ adb shell "mkdir /data/local/tmp/inception_v3"

现在将必要的库推送到设备:

$ adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnDsp.so /data/local/tmp/inception_v3
$ adb push ${QNN_SDK_ROOT}/lib/hexagon-v66/unsigned/libQnnDspV66Skel.so /data/local/tmp/inception_v3
$ adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnDspV66Stub.so /data/local/tmp/inception_v3
$ adb push ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model_libs/aarch64-android/* /data/local/tmp/inception_v3

现在将输入数据和输入列表推送到设备:

$ adb push ${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped /data/local/tmp/inception_v3
$ adb push ${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/target_raw_list.txt /data/local/tmp/inception_v3

推送qnn-net-run工具:

$ adb push ${QNN_SDK_ROOT}/bin/aarch64-android/qnn-net-run /data/local/tmp/inception_v3

现在在设备上设置环境:

$ adb shell
$ cd /data/local/tmp/inception_v3
$ export VENDOR_LIB=/vendor/lib/ # /vendor/lib64/ if aarch64
$ export LD_LIBRARY_PATH=/data/local/tmp/inception_v3:/vendor/dsp/cdsp:$VENDOR_LIB
$ export ADSP_LIBRARY_PATH="/data/local/tmp/inception_v3;/vendor/dsp/cdsp;/vendor/lib/rfsa/adsp;/system/lib/rfsa/adsp;/dsp"

qnn-net-run最后,与以下内容一起使用:

$ ./qnn-net-run --backend libQnnDsp.so --model libInception_v3_quantized.so --input_list target_raw_list.txt --output_dir output_android

运行的输出将位于 ./output_android 目录中。退出设备并查看结果:

$ exit
$ cd ${QNN_SDK_ROOT}/examples/Models/InceptionV3
$ adb pull /data/local/tmp/inception_v3/output_android
$ python3 ${QNN_SDK_ROOT}/examples/Models/InceptionV3/scripts/show_inceptionv3_classifications.py -i data/cropped/raw_list.txt \
                                                                               -o output_android/ \
                                                                               -l data/imagenet_slim_labels.txt

在 Windows 设备上执行
本节介绍在具有 v66 DSP 后端的 Windows 主机上执行推理。这些步骤类似于在具有 CPU 或 HTP 后端的 Windows 主机上执行。

DSP 后端的执行需要量化模型。请完成上面“在 Windows 主机上构建模型”部分中构建量化模型的步骤。

首先,使用以下命令连接到 Windows 设备:

$ mstsc -v <your device IP>

C:\qnn_test_package然后,在设备上创建文件夹。

现在,将必要的库从 Windows 主机复制到 Windows 设备C:\qnn_test_package

- ${QNN_SDK_ROOT}\lib\aarch64-windows-msvc\QnnDsp.dll
- ${QNN_SDK_ROOT}\lib\aarch64-windows-msvc\QnnDspV66Stub.dll
- ${QNN_SDK_ROOT}\lib\hexagon-v66\unsigned\libQnnDspV66Skel.so
- C:\tmp\qnn_tmp\model_lib\ARM64\Inception_v3_quantized.dll (generated above)

现在,将输入数据和输入列表从 Windows 主机复制到 Windows 设备C:\qnn_test_package

- C:\tmp\qnn_tmp\cropped
- C:\tmp\qnn_tmp\target_raw_list.txt

现在,将该qnn-net-run.exe工具复制到 Windows 设备:

- ${QNN_SDK_ROOT}\bin\aarch64-windows-msvc\qnn-net-run.exe

要运行qnn-net-run.exe工具,请打开:“Administrator:Windows Power Shell”

$ cd C:\qnn_test_package

$ .\qnn-net-run.exe `
   --model .\Inception_v3_quantized.dll `
   --input_list .\target_raw_list.txt `
   --backend .\QnnDsp.dll

推理完成后,我们可以检查分类结果。默认情况下,运行的输出将位于该.\output目录中。我们需要将结果复制回 Windows 主机。

copy C:\qnn_test_package\output to C:\tmp\qnn_tmp

然后,打开运行:“Developer PowerShell for VS 2022”

$ cd C:\tmp\qnn_tmp

$ py -3 .\show_inceptionv3_classifications.py `
     -i .\cropped\raw_list.txt `
     -o output `
     -l .\imagenet_slim_labels.txt

分类结果应为:

${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped/trash_bin.raw   0.777344 413 ashcan
${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped/chairs.raw      0.253906 832 studio couch
${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped/plastic_cup.raw 0.980469 648 measuring cup
${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped/notice_sign.raw 0.167969 459 brass

GPU后端执行
笔记
不支持在 Windows 设备上运行 GPU 后端。

在Android上执行
在 Android 目标上运行 GPU 后端与在 Android 目标上运行 CPU 后端非常相似。

首先,在设备上为示例创建一个目录:

# make inception_v3 if necessary
$ adb shell "mkdir /data/local/tmp/inception_v3"

现在将必要的库推送到设备:

$ adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnGpu.so /data/local/tmp/inception_v3
$ adb push ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model_libs/aarch64-android/*.so /data/local/tmp/inception_v3

现在将输入数据和输入列表推送到设备:

$ adb push ${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped /data/local/tmp/inception_v3
$ adb push ${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/target_raw_list.txt /data/local/tmp/inception_v

3
推送qnn-net-run工具:

$ adb push ${QNN_SDK_ROOT}/bin/aarch64-android/qnn-net-run /data/local/tmp/inception_v3

现在在设备上设置环境:

$ adb shell
$ cd /data/local/tmp/inception_v3
$ export LD_LIBRARY_PATH=/data/local/tmp/inception_v3

qnn-net-run最后,与以下内容一起使用:

$ ./qnn-net-run --backend libQnnGpu.so --model libInception_v3.so --input_list target_raw_list.txt

运行的输出将位于默认的 ./output 目录中。退出设备并查看结果:

$ exit
$ cd ${QNN_SDK_ROOT}/examples/Models/InceptionV3
$ adb pull /data/local/tmp/inception_v3/output output_android
$ python3 ${QNN_SDK_ROOT}/examples/Models/InceptionV3/scripts/show_inceptionv3_classifications.py -i data/cropped/raw_list.txt \
                                                                               -o output_android/ \
                                                                               -l data/imagenet_slim_labels.txt

HTP 后端执行
在Linux主机上执行
可以通过使用 HTP 模拟后端在 Linux 主机上运行 HTP 后端。qnn-net-run编译模型库后,可以使用以下命令执行模型:

$ cd ${QNN_SDK_ROOT}/examples/Models/InceptionV3
$ ${QNN_SDK_ROOT}/bin/x86_64-linux-clang/qnn-net-run \
              --backend ${QNN_SDK_ROOT}/lib/x86_64-linux-clang/libQnnHtp.so \
              --model ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model_libs/x86_64-linux-clang/libInception_v3_quantized.so \
              --input_list data/cropped/raw_list.txt

笔记
为了使用 HTP 仿真后端,需要一个量化模型。有关量化的更多信息,请参阅模型量化。

这将产生以下结果:

${QNN_SDK_ROOT}/examples/Models/InceptionV3/output

要查看结果,请使用:

$ python3 ${QNN_SDK_ROOT}/examples/Models/InceptionV3/scripts/show_inceptionv3_classifications.py -i data/cropped/raw_list.txt \
                                                                               -o output/ \
                                                                               -l data/imagenet_slim_labels.txt

在Android上执行
在 Android 目标上运行 HTP 后端与在 Android 目标上运行 CPU 和 GPU 后端非常相似。

一个区别是 HTP 后端需要量化模型。有关量化的更多信息,请参阅模型量化。此外,在设备上运行 HTP 需要生成序列化上下文。要生成上下文,请运行:

$ ${QNN_SDK_ROOT}/bin/x86_64-linux-clang/qnn-context-binary-generator \
              --backend ${QNN_SDK_ROOT}/lib/x86_64-linux-clang/libQnnHtp.so \
              --model ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model_libs/x86_64-linux-clang/libInception_v3_quantized.so \
              --binary_file Inception_v3_quantized.serialized

这会在以下位置创建上下文:

${QNN_SDK_ROOT}/examples/Models/InceptionV3/output/Inception_v3_quantized.serialized.bin

首先,在设备上为示例创建一个目录:

# make inception_v3 if necessary
$ adb shell "mkdir /data/local/tmp/inception_v3"

现在将必要的库推送到设备:

$ adb push ${QNN_SDK_ROOT}/lib/hexagon-v68/unsigned/libQnnHtpV68Skel.so /data/local/tmp/inception_v3
$ adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnHtpV68Stub.so /data/local/tmp/inception_v3
$ adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnHtp.so /data/local/tmp/inception_v3
$ adb push ${QNN_SDK_ROOT}/examples/Models/InceptionV3/output/Inception_v3_quantized.serialized.bin /data/local/tmp/inception_v3

笔记
本节将通过离线准备的图形步骤演示 Android 上的 HTP 执行。如果我们想执行设备上(在线)准备好的图表,请将设备上准备库也推送到设备。

$ adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnHtpPrepare.so /data/local/tmp/inception_v3

现在将输入数据和输入列表推送到设备:

$ adb push ${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped /data/local/tmp/inception_v3
$ adb push ${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/target_raw_list.txt /data/local/tmp/inception_v3

推送qnn-net-run工具:

$ adb push ${QNN_SDK_ROOT}/bin/aarch64-android/qnn-net-run /data/local/tmp/inception_v3

现在在设备上设置环境:

$ adb shell
$ cd /data/local/tmp/inception_v3
$ export LD_LIBRARY_PATH=/data/local/tmp/inception_v3
$ export ADSP_LIBRARY_PATH="/data/local/tmp/inception_v3"

qnn-net-run最后,与以下内容一起使用:

$ ./qnn-net-run --backend libQnnHtp.so --input_list target_raw_list.txt --retrieve_context Inception_v3_quantized.serialized.bin
运行的输出将位于默认的 ./output 目录中。退出设备并查看结果:

$ exit
$ cd ${QNN_SDK_ROOT}/examples/Models/InceptionV3
$ adb pull /data/local/tmp/inception_v3/output output_android
$ python3 ${QNN_SDK_ROOT}/examples/Models/InceptionV3/scripts/show_inceptionv3_classifications.py -i data/cropped/raw_list.txt \
                                                                               -o output_android/ \
                                                                               -l data/imagenet_slim_labels.txt

在 Windows 设备上执行
qnn-net-run本节说明如何使用两种不同的方式在 HTP 上运行端到端推理:

  1. 使用离线准备的图在 windows-aarch64 上运行 HTP 后端

  2. 使用设备上准备好的图表在 windows-aarch64 上运行 HTP 后端

使用离线准备图通过 HTP 后端执行

首先,按照此处的步骤准备序列化上下文。以下假设 Windows 设备具有 v68 DSP。

连接到 Windows 设备:

$ mstsc -v <your device IP>

C:\qnn_test_package在设备上创建文件夹。

现在,将必要的库从 Windows 主机复制到 Windows 设备C:\qnn_test_package

- ${QNN_SDK_ROOT}\lib\aarch64-windows-msvc\QnnHtp.dll
- ${QNN_SDK_ROOT}\lib\aarch64-windows-msvc\QnnHtpV68Stub.dll
- ${QNN_SDK_ROOT}\lib\hexagon-v68\unsigned\libQnnHtpV68Skel.so
- Inception_v3_quantized.serialized.bin (serialized context prepared above)

现在,将输入数据和输入列表从 Windows 主机复制到 Windows 设备C:\qnn_test_package

- C:\tmp\qnn_tmp\cropped
- C:\tmp\qnn_tmp\target_raw_list.txt

现在,将该qnn-net-run.exe工具复制到 Windows 设备:

- ${QNN_SDK_ROOT}\bin\aarch64-windows-msvc\qnn-net-run.exe

要运行qnn-net-run.exe工具,请打开:“Administrator:Windows Power Shell”

$ cd C:\qnn_test_package

$ .\qnn-net-run.exe `
   --retrieve_context .\Inception_v3_quantized.serialized.bin `
   --input_list .\target_raw_list.txt `
   --backend .\QnnHtp.dll

进行推理后,我们可以检查分类结果。默认情况下,运行的输出将位于该.\output目录中。我们需要将结果复制回 Windows 主机。

copy C:\qnn_test_package\output to C:\tmp\qnn_tmp

然后,打开运行:“Developer PowerShell for VS 2022”

$ cd C:\tmp\qnn_tmp

$ py -3 .\show_inceptionv3_classifications.py `
     -i .\cropped\raw_list.txt `
     -o output `
     -l .\imagenet_slim_labels.txt

那么,分类结果应该是:

${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped/trash_bin.raw   0.777344 413 ashcan
${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped/chairs.raw      0.253906 832 studio couch
${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped/plastic_cup.raw 0.980469 648 measuring cup
${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped/notice_sign.raw 0.167969 459 brass

使用设备上准备好的图形通过 HTP 后端执行

首先,按照“在 Windows 主机上构建模型”部分中的步骤构建量化模型。这将生成所需的 DLL 库。

以下假设 Windows 设备具有 v68 DSP。

连接到 Windows 设备:

$ mstsc -v <your device IP>

C:\qnn_test_package在设备上创建文件夹。

将以下库从 Windows 主机复制到 Windows 设备的文件夹中:C:\qnn_test_package

- ${QNN_SDK_ROOT}\lib\aarch64-windows-msvc\QnnHtp.dll
- ${QNN_SDK_ROOT}\lib\aarch64-windows-msvc\QnnHtpV68Stub.dll
- ${QNN_SDK_ROOT}\lib\aarch64-windows-msvc\QnnHtpPrepare.dll
- ${QNN_SDK_ROOT}\lib\hexagon-v68\unsigned\libQnnHtpV68Skel.so
- Inception_v3_quantized.dll (Quantized model (*.dll) as described in prerequisite)

现在,将输入数据和输入列表从 Windows 主机复制到 Windows 设备C:\qnn_test_package

- C:\tmp\qnn_tmp\cropped
- C:\tmp\qnn_tmp\target_raw_list.txt

现在,将该qnn-net-run.exe工具复制到 Windows 设备:

- ${QNN_SDK_ROOT}\bin\aarch64-windows-msvc\qnn-net-run.exe

要运行qnn-net-run.exe工具,请打开:“Administrator:Windows Power Shell”

$ cd C:\qnn_test_package

$ .\qnn-net-run.exe `
   --model .\Inception_v3_quantized.dll `
   --input_list .\target_raw_list.txt `
   --backend .\QnnHtp.dll

进行推理后,我们可以检查分类结果。默认情况下,运行的输出将位于该.\output目录中。我们需要将结果复制回 Windows 主机。

copy C:\qnn_test_package\output to C:\tmp\qnn_tmp

然后,打开运行:“Developer PowerShell for VS 2022”

$ cd C:\tmp\qnn_tmp

$ py -3 .\show_inceptionv3_classifications.py `
     -i .\cropped\raw_list.txt `
     -o output `
     -l .\imagenet_slim_labels.txt

那么,分类结果应该是:

${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped/trash_bin.raw   0.777344 413 ashcan
${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped/chairs.raw      0.253906 832 studio couch
${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped/plastic_cup.raw 0.980469 648 measuring cup
${QNN_SDK_ROOT}/examples/Models/InceptionV3/data/cropped/notice_sign.raw 0.167969 459 brass

LPAI 后端执行

LPAI 后端仅设计用于离线模型准备。离线生成的模型将由单独发布的LPAI SDK执行。按照 LPAI SDK 文档中的说明执行模型。

为模拟器编译 LPAI 模型
准备具有适当参数的 Json 文件以生成模拟器模型

文件示例config.json:

{
   "backend_extensions": {
   "shared_library_path": "${QNN_SDK_ROOT}/lib/x86_64-linux-clang/libQnnLpaiNetRunExtentions.so",
   "config_file_path": "./lpaiParams.conf"
   }
}

文件示例lpaiParams.conf:

{
   "target_env": "x86",
   "enable_hw_ver": "v4",
   "enable_layer_fusion": true
}

lpaiParams.conf文件可以包含一个或多个与默认值不同的参数,如下所述:

"target_env"              "arm/adsp/x86/tensilica, default adsp"
"enable_hw_ver"           "v1/v2/v3/v4, default v4"
"enable_layer_fusion"     "true/false, default true"
"enable_batchnorm_fold"   "true/false, default true"
"enable_channel_align"    "true/false, default false"
"pad_split"               "true/false, default false"
"exclude_io"              "true/false, default false"

使用上下文二进制生成器生成离线 LPAI 模型。

$ cd ${QNN_SDK_ROOT}/examples/QNN/converter/models
$ ${QNN_SDK_ROOT}/bin/x86_64-linux-clang/qnn-context-binary-generator \
              --backend ${QNN_SDK_ROOT}/lib/x86_64-linux-clang/libQnnLpai.so \
              --model ${QNN_SDK_ROOT}/examples/Models/InceptionV3/model_libs/x86_64-linux-clang/<libQnnModel.so> \
              --config_file <config.json> \
              --log_level verbose \
              --backend_binary <output_graph.eai> \
              --binary_file tmp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值