赞
踩
本教程介绍如何使用 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
这将产生以下工件:
${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
这将产生以下工件:
./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
这将生成一个量化的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/linux−x8664/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
这将为每个目标生成一个文件夹:
./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
在 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
在设备上设置 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
在 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
在设备上设置 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
Windows
设置
本教程假设已在安装中遵循一般安装说明。
请使用“x86_x64 Cross Tools Command Prompt for VS 2022”设置QNN_SDK_ROOT:
$ set QNN_SDK_ROOT=\path\to\QNN_SDK_ROOT
建造
请在此步骤中使用“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
执行上面的命令后,您应该能够看到:
对于 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
执行上面的命令后,您应该能够看到:
生成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
执行上面的命令后,您应该能够看到:
%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
要为特定后端生成可执行文件,请使用以下命令进行构建。 的有效选项是 =x64 的 cpu,以及 =ARM64 的 cpu、dsp 或 htp。
$ cmake --build ./ --config Release --target [cpu, dsp, htp]
执行上面的命令后,您应该能够看到:
跑步
请使用“命令提示符”执行,并确保与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
在 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
对于数字信号处理
在 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
执行:
对于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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。