当前位置:   article > 正文

Qualcomm® AI Engine Direct 使用手册(24)_高通qnn

高通qnn

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


8.1.2 Saver 教程:使用 Saver 保存执行序列并在后端重放

本教程介绍如何使用 QNN Saver 后端捕获 QNN API 的执行序列。然后可以在任何 QNN 后端编译和重放捕获的输出。

Linux

生成saver_output.c
saver_output.c 是通过在 Saver 后端运行模型而生成的工件。源框架中的模型可以使用 QNN 转换器model.cpp转换为。示例和文件位于 .model.binmodel.cppmodel.bin${QNN_SDK_ROOT}/examples/QNN/converter/models/

model.cpp并model.bin用于创建model.so过孔qnn-model-lib-generator。

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

  • 1
  • 2
  • 3
  • 4
  • 5

这将产生以下工件:

  • ${QNN_SDK_ROOT}/examples/QNN/converter/model_libs/aarch64-android/libqnn_model_float.so

  • ${QNN_SDK_ROOT}/examples/QNN/converter/model_libs/x86_64-linux-clang/libqnn_model_float.so

结果model.so可以使用以下命令在 Saver 后端运行qnn-net-run:

$ cd ${QNN_SDK_ROOT}/examples/QNN/converter/models/
$ ${QNN_SDK_ROOT}/bin/x86_64-linux-clang/qnn-net-run \
              --backend ${QNN_SDK_ROOT}/lib/x86_64-linux-clang/libQnnSaver.so \
              --model ${QNN_SDK_ROOT}/examples/QNN/converter/model_libs/x86_64-linux-clang/libqnn_model_float.so \
              --input_list input_list_float.txt

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这将产生以下工件:

  • ./saver_output/saver_output.c

  • ./saver_output/params.bin

有关将模型从源框架转换为 QNN 共享库格式的更多信息,请参阅教程:使用 QNN 转换和执行 CNN 模型。

或者,为了方便起见,可以使用以下脚本执行上述步骤。

$ cd ${QNN_SDK_ROOT}/examples/QNN/NetRun/linux-x86_64
$ ./linux-qnn-net-run.sh -b saver

  • 1
  • 2
  • 3

这将生成一个量化的in saver_output.c以便在 DSP 或 HTP 后端重放,以及一个非量化的in 以便在 CPU 或 GPU 后端上重放。params.bin Q N N S D K R O O T / e x a m p l e s / Q N N / N e t R u n / l i n u x − x 8 6 6 4 / s a v e r o u t p u t / q u a n t i z e d / s a v e r o u t p u t . c p a r a m s . b i n {QNN_SDK_ROOT}/examples/QNN/NetRun/linux-x86_64/saver_output/quantized/saver_output.cparams.bin QNNSDKROOT/examples/QNN/NetRun/linuxx8664/saveroutput/quantized/saveroutput.cparams.bin{QNN_SDK_ROOT}/examples/QNN/NetRun/linux-x86_64/saver_output/non_quantized/

编译saver_output.c
要编译 saver_output.c 以在后端重播,请使用Makefile位于 ${QNN_SDK_ROOT}/examples/QNN/Saver. 此 makefile 可用于在兼容平台上为指定的 QNN 后端编译 saver_output.c。

笔记
编译 x86 目标需要 clang。
针对 Android 目标进行编译需要 Android NDK。
在 Android 目标上编译 DSP/HTP 后端需要 Hexagon SDK。

请参阅安装程序来设置适当的环境变量。

位于与saver_output.c相同的目录中Makefile,运行以编译受支持目标上的所有 QNN 后端。make all

$ cp ./saver_output/saver_output.c ${QNN_SDK_ROOT}/examples/QNN/Saver
$ cp ./saver_output/params.bin ${QNN_SDK_ROOT}/examples/QNN/Saver
$ cd ${QNN_SDK_ROOT}/examples/QNN/Saver
$ make x86 android

  • 1
  • 2
  • 3
  • 4
  • 5

这将为每个目标生成一个文件夹:

  • ./x86_64-linux-clang

  • ./aarch64-android

这些文件夹将包含名为 的目标上可用的每个后端的一个可执行文件 saver_output_。

要为特定目标上的所有后端创建可执行文件,请运行. 的有效选项是x86或aarch64。make

要为特定目标上的特定后端创建可执行文件,请运行 . 的有效选项是cpu或htp(对于 =x86),以及cpu、gpu、dsp、hta或htp(对于 =aarch64)。make _

在 x86 上重放 saver_output.c
要在 x86 后端上重播,请将 LD_LIBRARY_PATH 设置为指向所需的 QNN 后端库并运行可执行文件。确保params.bin位于当前工作目录中。

$ cd ${QNN_SDK_ROOT}/examples/QNN/Saver
$ export QNN_BACKEND=<backend> # where <backend> is QnnCpu or QnnHtp
$ export LD_LIBRARY_PATH=${QNN_SDK_ROOT}/lib/x86_64-linux-clang:$LD_LIBRARY_PATH
$ ./x86_64-linux-clang/saver_output_${QNN_BACKEND} [--logging <verbose,debug,info,warn,error>] # optionally enable logging

  • 1
  • 2
  • 3
  • 4
  • 5

在 Android 上重放 saver_output.c
在 QNN CPU、QNN HTA 或 QNN GPU 后端上回放
在设备上创建一个目录,推送 QNN 后端库、saver_output.c可执行文件,然后 params.bin:

$ export QNN_BACKEND=<backend> # where <backend> is QnnCpu, QnnHta, or QnnGpu
$ adb shell "mkdir /data/local/tmp/saver"
$ adb push ${QNN_SDK_ROOT}/lib/aarch64-android/lib${QNN_BACKEND}.so /data/local/tmp/saver
$ adb push ${QNN_SDK_ROOT}/examples/QNN/Saver/aarch64-android/saver_output_${QNN_BACKEND} /data/local/tmp/saver
$ adb push ./saver_output/params.bin /data/local/tmp/saver

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在设备上设置 LD_LIBRARY_PATH 并执行

$ adb shell
$ cd /data/local/tmp/saver
$ export LD_LIBRARY_PATH=/data/local/tmp/saver:$LD_LIBRARY_PATH
$ ./saver_output_${QNN_BACKEND} [-l <verbose,debug,info,warn,error>] # optionally enable logging

  • 1
  • 2
  • 3
  • 4
  • 5

在 QNN DSP 或 QNN HTP 后端重放
在设备上创建一个目录,推送 QNN 后端存根/skel、saver_output.c可执行文件,以及 params.bin:

$ export QNN_BACKEND=<backend>  # where <backend> is QnnDsp or QnnHtp
$ export HEXAGON_ARCH=<v65,v66,v68,v69,v73,v75>  # based on device
$ adb shell "mkdir data/local/tmp/saver"
$ adb push ${QNN_SDK_ROOT}/lib/aarch64-android/lib${QNN_BACKEND}.so /data/local/tmp/saver
$ adb push ${QNN_SDK_ROOT}/lib/aarch64-android/lib${QNN_BACKEND}${HEXAGON_ARCH^}Stub.so /data/local/tmp/saver
$ adb push ${QNN_SDK_ROOT}/lib/hexagon-${HEXAGON_ARCH}/unsigned/lib${QNN_BACKEND}${HEXAGON_ARCH^}Skel.so /data/local/tmp/saver
$ adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnHtpPrepare.so /data/local/tmp/saver  # if QNN_BACKEND=QnnHtp
$ adb push ${QNN_SDK_ROOT}/examples/QNN/Saver/aarch64-android/saver_output_${QNN_BACKEND} /data/local/tmp/saver
$ adb push ${QNN_SDK_ROOT}/examples/QNN/Saver/params.bin /data/local/tmp/saver

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在设备上设置 LD_LIBRARY_PATH 和 ADSP_LIBRARY_PATH 并执行:

$ adb shell
$ cd /data/local/tmp/saver
$ export LD_LIBRARY_PATH=/data/local/tmp/saver:$LD_LIBRARY_PATH
$ export ADSP_LIBRARY_PATH=/data/local/tmp/saver:$ADSP_LIBRARY_PATH
$ ./saver_output_${QNN_BACKEND} [-l <verbose,debug,info,warn,error>] # optionally enable logging

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Windows

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

请使用“x86_x64 Cross Tools Command Prompt for VS 2022”设置QNN_SDK_ROOT:

$ set QNN_SDK_ROOT=\path\to\QNN_SDK_ROOT

  • 1
  • 2

建造
请在此步骤中使用“x86_x64 Cross Tools Command Prompt for VS 2022”。

生成模型
对于CPU,生成非量化模型:

$ cd "%QNN_SDK_ROOT%\examples\QNN\Saver"
$ mkdir model && cd model
$ xcopy "%QNN_SDK_ROOT%\examples\QNN\converter\models\qnn_model_float.cpp" .
$ xcopy "%QNN_SDK_ROOT%\examples\QNN\converter\models\qnn_model_float.bin" .
$ py -3 "%QNN_SDK_ROOT%\bin\x86_64-windows-msvc\qnn-model-lib-generator" ^
           -c .\qnn_model_float.cpp ^
           -b .\qnn_model_float.bin ^
           -o .\model_libs ^
           -t windows-x86_64

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

执行上面的命令后,您应该能够看到:

  • %QNN_SDK_ROOT%\examples\QNN\Saver\model\model_libs\x64\qnn_model_float.dll

对于 DSP & HTP,生成量化模型:

$ cd "%QNN_SDK_ROOT%\examples\QNN\Saver"
$ mkdir model && cd model
$ xcopy "%QNN_SDK_ROOT%\examples\QNN\converter\models\qnn_model_8bit_quantized.cpp" .
$ xcopy "%QNN_SDK_ROOT%\examples\QNN\converter\models\qnn_model_8bit_quantized.bin" .
$ py -3 "%QNN_SDK_ROOT%\bin\x86_64-windows-msvc\qnn-model-lib-generator" ^
           -c .\qnn_model_8bit_quantized.cpp ^
           -b .\qnn_model_8bit_quantized.bin ^
           -o .\model_libs ^
           -t windows-x86_64
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

执行上面的命令后,您应该能够看到:

  • %QNN_SDK_ROOT%\examples\QNN\Saver\model\model_libs\x64\qnn_model_8bit_quantized.dll

生成saver_output.c和params.bin
请检查 .dll 的路径并替换为以下命令:

$ cd "%QNN_SDK_ROOT%\examples\QNN\Saver"
$ mkdir source && cd source
$ xcopy "%QNN_SDK_ROOT%\examples\QNN\converter\models\input_data_float" .\input_data_float /i
$ xcopy "%QNN_SDK_ROOT%\examples\QNN\converter\models\input_list_float.txt" .
$ xcopy "%QNN_SDK_ROOT%\examples\QNN\Saver\model\model_libs\x64\<model>.dll" .
$ "%QNN_SDK_ROOT%\bin\x86_64-windows-msvc\qnn-net-run.exe" ^
           --backend "%QNN_SDK_ROOT%\lib\x86_64-windows-msvc\QnnSaver.dll" ^
           --model <model>.dll ^
           --input_list .\input_list_float.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

执行上面的命令后,您应该能够看到:

  • %QNN_SDK_ROOT%\examples\QNN\Saver\source\saver_output\saver_output.c

  • %QNN_SDK_ROOT%\examples\QNN\Saver\source\saver_output\params.bin

构建 saver_output.c
请在[x64, ARM64]之间选择一个目标作为“-A”配置的参数。saver_output_将生成指定目标上所有后端的可执行文件。

$ cd "%QNN_SDK_ROOT%\examples\QNN\Saver"
$ xcopy "%QNN_SDK_ROOT%\examples\QNN\Saver\source\saver_output\saver_output.c" .
$ mkdir build && cd build
$ cmake -S ../ -B ./ -T ClangCL -A [x64, ARM64]
$ cmake --build ./ --config Release
  • 1
  • 2
  • 3
  • 4
  • 5

要为特定后端生成可执行文件,请使用以下命令进行构建。 的有效选项是 =x64 的 cpu,以及 =ARM64 的 cpu、dsp 或 htp。

$ cmake --build ./ --config Release --target [cpu, dsp, htp]
  • 1

执行上面的命令后,您应该能够看到:

  • %QNN_SDK_ROOT%\examples\QNN\Saver\build\Release\saver_output_.exe

跑步
请使用“命令提示符”执行,并确保与buildparams.bin中生成的文件相同。

中央处理器用
在 x86 上运行。

请将以下文件推送到文件夹:

  • %QNN_SDK_ROOT%\examples\QNN\Saver\build\Release\saver_output_QnnCpu.exe

  • %QNN_SDK_ROOT%\lib\x86_64-windows-msvc\QnnCpu.dll

  • %QNN_SDK_ROOT%\examples\QNN\Saver\source\saver_output\params.bin

执行:

$ .\saver_output_QnnCpu.exe [--logging <verbose,debug,info,warn,error>] # optionally enable logging

  • 1
  • 2

在 aarch64 上运行。

请将以下文件推送到设备:

  • %QNN_SDK_ROOT%\examples\QNN\Saver\build\Release\saver_output_QnnCpu.exe

  • %QNN_SDK_ROOT%\lib\aarch64-windows-msvc\QnnCpu.dll

  • %QNN_SDK_ROOT%\examples\QNN\Saver\source\saver_output\params.bin

执行:

$ .\saver_output_QnnCpu.exe [--logging <verbose,debug,info,warn,error>] # optionally enable logging

  • 1
  • 2

对于数字信号处理
在 aarch64 上运行。

请将以下文件推送到设备:

  • %QNN_SDK_ROOT%\examples\QNN\Saver\build\Release\saver_output_QnnDsp.exe

  • %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

  • %QNN_SDK_ROOT%\examples\QNN\Saver\source\saver_output\params.bin

执行:

  • $ .\saver_output_QnnDsp.exe [–logging <verbose,debug,info,warn,error>] # optionally enable logging

对于HTP
在 aarch64 上运行。

请将以下文件推送到设备:

  • %QNN_SDK_ROOT%\examples\QNN\Saver\build\Release\saver_output_QnnHtp.exe

  • %QNN_SDK_ROOT%\lib\aarch64-windows-msvc\QnnHtp.dll

  • %QNN_SDK_ROOT%\lib\aarch64-windows-msvc\QnnHtpPrepare.dll

  • %QNN_SDK_ROOT%\lib\aarch64-windows-msvc\QnnHtpStub.dll

  • %QNN_SDK_ROOT%\lib\hexagon-v68\unsigned\libQnnHtpSkel.so

  • %QNN_SDK_ROOT%\examples\QNN\Saver\source\saver_output\params.bin

执行:

$ .\saver_output_QnnHtp.exe [--logging <verbose,debug,info,warn,error>] # optionally enable logging
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/445182
推荐阅读
  

闽ICP备14008679号