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 上运行端到端推理:
-
使用离线准备的图在 windows-aarch64 上运行 HTP 后端
-
使用设备上准备好的图表在 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