使用 Qualcomm AI Engine Direct 后端构建和运行 ExecuTorch¶
在本教程中,我们将引导您完成设置的过程 为 Qualcomm AI Engine Direct 构建 ExecuTorch 并在其上运行模型。
Qualcomm AI Engine Direct 在源代码和文档中也称为 QNN。
在本教程中,您将学习如何降低和部署 Qualcomm AI Engine Direct 的模型。
什么是 Qualcomm AI Engine Direct?¶
Qualcomm AI Engine Direct 旨在为 AI 开发提供统一的低级 API。
开发人员可以使用这组 API 与 Qualcomm SoC 上的各种加速器进行交互,包括 Kryo CPU、Adreno GPU 和 Hexagon 处理器。更多详情可在此处找到。
目前,此 ExecuTorch 后端可以通过 Qualcomm AI Engine Direct API 将 AI 计算委托给 Hexagon 处理器。
先决条件 (硬件和软件)¶
主机操作系统¶
QNN 后端验证的 Linux 主机操作系统是 Ubuntu 20.04 LTS x64。
但是,由于 Qualcomm Package Manager (QPM) 过去需要下载必要的 SDK(见下文) 仅支持 Ubuntu,我们建议用户正确练习本教程 在 Ubuntu 20.04 上。
硬件:¶
您需要一部连接了 adb 的 Android 智能手机,在以下 Qualcomm SoC 之一上运行:
SM8450(骁龙 8 第 1 代)
SM8475 (骁龙 8 Gen 1+)
SM8550(骁龙 8 第 2 代)
此示例使用 SM8550 和 SM8450 进行了验证。
软件:¶
遵循 ExecuTorch 推荐的 Python 版本。
用于编译 AOT 部件的编译器。Ubuntu20.04 附带的 GCC 9.4 已经过验证。
Android NDK 的 NDK 版本。此示例已通过 NDK 25c 进行验证。
-
点击下载按钮。登录后,在 鑫安科技 中搜索 Qualcomm AI Stack 工具 控制板。
您可以在 AI Stack 组下找到 Qualcomm AI Engine Direct SDK。
请下载 Linux 版本,然后按照页面上的说明解压文件。
默认情况下,SDK 应安装到某个位置。
/opt/qcom/aistack/qnn
也可以将其放在其他地方。我们没有对 SDK 的绝对路径进行假设。
此示例已使用版本 2.12.0 进行验证。
已安装 Qualcomm AI Engine Direct SDK 的目录如下所示:
$ tree -L 1 /opt/qcom/aistack/qnn/<version>/
/opt/qcom/aistack/qnn/<version>/
├── benchmarks
├── bin
├── docs
├── examples
├── include
├── lib
├── LICENSE.pdf
├── QNN_NOTICE.txt
├── QNN_README.txt
├── QNN_ReleaseNotes.txt
├── share
└── Uninstall
设置开发人员环境¶
约定¶
$QNN_SDK_ROOT
指 Qualcomm AI Engine Direct SDK 的根,
即包含 .QNN_README.txt
$ANDROID_NDK
是指 Android NDK 的根。
$EXECUTORCH_ROOT
引用 executorch git 仓库的根目录。
设置环境变量¶
我们设置以确保动态链接器可以找到 QNN 库。LD_LIBRARY_PATH
此外,我们设置了 因为开发和导入 ExecuTorch 更容易
Pytho API。PYTHONPATH
export LD_LIBRARY_PATH=$QNN_SDK_ROOT/lib/x86_64-linux-clang/:$LD_LIBRARY_PATH
export PYTHONPATH=$EXECUTORCH_ROOT/..
建¶
下面是一个示例脚本,用于下面的构建说明。
AOT(预先)组件:¶
需要 x64 上的 Python API 才能将模型编译为 Qualcomm AI Engine Direct 二进制文件。
cd $EXECUTORCH_ROOT
mkdir build_x86_64
cd build_x86_64
cmake .. -DEXECUTORCH_BUILD_QNN=ON -DQNN_SDK_ROOT=${QNN_SDK_ROOT}
cmake --build . -t "PyQnnManagerAdaptor" "PyQnnWrapperAdaptor" -j8
# install Python APIs to correct import path
# The filename might vary depending on your Python and host version.
cp -f backends/qualcomm/PyQnnManagerAdaptor.cpython-310-x86_64-linux-gnu.so $EXECUTORCH_ROOT/backends/qualcomm/python
cp -f backends/qualcomm/PyQnnWrapperAdaptor.cpython-310-x86_64-linux-gnu.so $EXECUTORCH_ROOT/backends/qualcomm/python
运行:¶
示例可执行文件将用于运行编译后的模型。qnn_executor_runner
pte
为 Android 构建的命令:qnn_executor_runner
cd $EXECUTORCH_ROOT
mkdir build_android
cd build_android
cmake .. -DQNN_SDK_ROOT=$QNN_SDK_ROOT \
-DEXECUTORCH_BUILD_QNN=ON \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
-DANDROID_ABI='arm64-v8a' \
-DANDROID_NATIVE_API_LEVEL=23 \
-DBUCK2=buck2
cmake --build . -j8
您可以在 .qnn_executor_runner
build_android/examples/qualcomm/
在设备上部署和运行¶
AOT 编译模型¶
您可以参考此脚本了解确切的流程。 在本教程中,我们以 deeplab-v3-resnet101 为例。运行以下命令进行编译:
cd $EXECUTORCH_ROOT
python -m examples.qualcomm.scripts.deeplab_v3 -b build_android -m SM8550 --compile_only --download
您可能会看到如下内容:
[INFO][Qnn ExecuTorch] Destroy Qnn context
[INFO][Qnn ExecuTorch] Destroy Qnn device
[INFO][Qnn ExecuTorch] Destroy Qnn backend
opcode name target args kwargs
------------- ------------------------ --------------------------- ----------------------------- --------
placeholder arg684_1 arg684_1 () {}
get_attr lowered_module_0 lowered_module_0 () {}
call_function executorch_call_delegate executorch_call_delegate (lowered_module_0, arg684_1) {}
call_function getitem <built-in function getitem> (executorch_call_delegate, 0) {}
call_function getitem_1 <built-in function getitem> (executorch_call_delegate, 1) {}
output output output ([getitem_1, getitem],) {}
编译后的模型为 ../deeplab_v3/dlv3_qnn.pte
在配备 Qualcomm SoC 的 Android 智能手机上运行模型推理¶
步骤 1.我们需要将所需的 QNN 库推送到设备。
# make sure you have write-permission on below path.
DEVICE_DIR=/data/local/tmp/executorch_qualcomm_tutorial/
adb shell "mkdir -p ${DEVICE_DIR}"
adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnHtp.so ${DEVICE_DIR}
adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnHtpV69Stub.so ${DEVICE_DIR}
adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnHtpV73Stub.so ${DEVICE_DIR}
adb push ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnSystem.so ${DEVICE_DIR}
adb push ${QNN_SDK_ROOT}/lib/hexagon-v69/unsigned/libQnnHtpV69Skel.so ${DEVICE_DIR}
adb push ${QNN_SDK_ROOT}/lib/hexagon-v73/unsigned/libQnnHtpV73Skel.so ${DEVICE_DIR}
步骤 2。我们还需要在 Android 和 Hexagon 上指示动态链接器
通过设置 和 在何处查找这些库。
所以,我们可以像ADSP_LIBRARY_PATH
LD_LIBRARY_PATH
qnn_executor_runner
adb push ./deeplab_v3/dlv3_qnn.pte ${DEVICE_DIR}
adb push ${EXECUTORCH_ROOT}/build_android/examples/qualcomm/qnn_executor_runner ${DEVICE_DIR}
adb shell "cd ${DEVICE_DIR} \
&& export LD_LIBRARY_PATH=${DEVICE_DIR} \
&& export ADSP_LIBRARY_PATH=${DEVICE_DIR} \
&& ./qnn_executor_runner --model_path ./dlv3_qnn.pte"
您应该会看到如下所示的内容:
I 00:00:01.835706 executorch:qnn_executor_runner.cpp:298] 100 inference took 1096.626000 ms, avg 10.966260 ms
[INFO][Qnn ExecuTorch] Destroy Qnn backend parameters
[INFO][Qnn ExecuTorch] Destroy Qnn context
[INFO][Qnn ExecuTorch] Destroy Qnn device
[INFO][Qnn ExecuTorch] Destroy Qnn backend
通过 ExecuTorch 的 android 演示应用程序运行模型¶
可以使用 Qualcomm AI Engine Direct Backend 的 Android 演示应用程序,请参阅 。请参考 android demo app 教程。examples
即将发生的事情¶
使用量化 mobilebert 求解多类文本分类的示例。
更多 Qualcomm AI Engine Direct 加速器,例如 GPU。
常见问题¶
如果您在复制本教程时遇到任何问题,请提交 github
ExecuTorch 存储库和标签 use 标签上的问题#qcom_aisw