构建 ExecuTorch Android 演示应用程序¶
本项目基于 PyTorch Android Demo App。
本指南介绍如何使用演示应用程序为 Android 设置 ExecuTorch。该应用程序使用 DeepLab v3 模型进行图像分割任务。模型使用 XNNPACK FP32 后端 导出到 ExecuTorch。
如何为 Android arm64-v8a 设置构建目标
如何构建 Android 的 JNI 包装器所需的 ExecuTorch 运行时
如何使用所需的 JNI 库和模型文件构建应用程序
请参考 设置 ExecuTorch 来设置仓库和开发环境。
下载并安装 Android Studio 和 SDK。
支持的主机操作系统:CentOS、macOS Ventura (M1/x86_64)。有关高通 HTP 的特定要求,请参见下文。
仅限高通 HTP1: 为了在高通的 AI 引擎直接上构建和运行,请遵循 使用高通 AI 引擎直接后端构建和运行 ExecuTorch 来获取硬件和软件先决条件。本教程中使用的版本是 2.19。本教程中使用的芯片是 SM8450。
注意
此演示应用程序和教程仅在 arm64-v8a ABI 上经过验证。
构建¶
提前编译¶
我们在 Android Demo App 中为 ExecuTorch 运行时生成模型文件。
XNNPACK 委托¶
要将 DeepLab v3 委托给 XNNPACK 后端,请执行以下操作来导出模型
python3 -m examples.xnnpack.aot_compiler --model_name="dl3" --delegate
mkdir -p examples/demo-apps/android/ExecuTorchDemo/app/src/main/assets/
cp dl3_xnnpack_fp32.pte examples/demo-apps/android/ExecuTorchDemo/app/src/main/assets/
有关降低到 XNNPACK 的更详细教程,请参见 XNNPACK 后端。
运行时¶
我们构建了运行模型所需的 ExecuTorch 运行时库。
XNNPACK¶
构建具有 XNNPACK 后端的库的 CMake 目标
export ANDROID_NDK=<path-to-android-ndk>
export ANDROID_ABI=arm64-v8a
rm -rf cmake-android-out && mkdir cmake-android-out
# Build the core executorch library
cmake . -DCMAKE_INSTALL_PREFIX=cmake-android-out \
-DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK}/build/cmake/android.toolchain.cmake" \
-DANDROID_ABI="${ANDROID_ABI}" \
-DEXECUTORCH_BUILD_XNNPACK=ON \
-DEXECUTORCH_BUILD_EXTENSION_DATA_LOADER=ON \
-DEXECUTORCH_BUILD_EXTENSION_MODULE=ON \
-Bcmake-android-out
cmake --build cmake-android-out -j16 --target install
当我们设置 EXECUTORCH_BUILD_XNNPACK=ON
时,我们将构建目标 xnnpack_backend
,该目标反过来通过 CMake 链接到 libexecutorch_jni。
构建 Android 扩展
# Build the android extension
cmake extension/android \
-DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK}"/build/cmake/android.toolchain.cmake \
-DANDROID_ABI="${ANDROID_ABI}" \
-DCMAKE_INSTALL_PREFIX=cmake-android-out \
-Bcmake-android-out/extension/android
cmake --build cmake-android-out/extension/android -j16
libexecutorch_jni.so
封装了来自 xnnpack_backend
的所需 XNNPACK 后端运行时库,并使用 fbjni 添加了额外的 JNI 层。这后来暴露给 Java 应用程序。
高通 Hexagon NPU¶
构建具有高通 Hexagon NPU (HTP) 后端(也包括 XNNPACK)的库的 CMake 目标
export ANDROID_NDK=<path-to-android-ndk>
export ANDROID_ABI=arm64-v8a
export QNN_SDK_ROOT=<path-to-qnn-sdk>
rm -rf cmake-android-out && mkdir cmake-android-out && cd cmake-android-out
cmake . -DCMAKE_INSTALL_PREFIX=cmake-android-out \
-DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK}/build/cmake/android.toolchain.cmake" \
-DANDROID_ABI="${ANDROID_ABI}" \
-DEXECUTORCH_BUILD_XNNPACK=ON \
-DEXECUTORCH_BUILD_QNN=ON \
-DQNN_SDK_ROOT="${QNN_SDK_ROOT}" \
-DEXECUTORCH_BUILD_EXTENSION_DATA_LOADER=ON \
-DEXECUTORCH_BUILD_EXTENSION_MODULE=ON \
-Bcmake-android-out
cmake --build cmake-android-out -j16 --target install
与 XNNPACK 库类似,通过这种设置,我们编译 libexecutorch_jni.so
,但它添加了一个额外的静态库 qnn_executorch_backend
,该库封装了高通 HTP 运行时库并注册了高通 HTP 后端。这后来暴露给 Java 应用程序。
qnn_executorch_backend
是在我们打开 CMake 选项 EXECUTORCH_BUILD_QNN
时构建的。它将包含来自 backends/qualcomm 的 CMakeLists.txt,我们在其中 add_library(qnn_executorch_backend STATIC)
。
构建 Android 扩展
cmake extension/android \
-DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK}"/build/cmake/android.toolchain.cmake \
-DANDROID_ABI="${ANDROID_ABI}" \
-DCMAKE_INSTALL_PREFIX=cmake-android-out \
-Bcmake-android-out/extension/android
cmake --build cmake-android-out/extension/android -j16
通过演示应用程序部署到设备¶
通过 XNNPACK 部署模型的步骤¶
mkdir -p examples/demo-apps/android/ExecuTorchDemo/app/src/main/jniLibs/arm64-v8a
cp cmake-android-out/extension/android/libexecutorch_jni.so \
examples/demo-apps/android/ExecuTorchDemo/app/src/main/jniLibs/arm64-v8a/libexecutorch.so
这允许 Android 应用程序将 ExecuTorch 运行时与 XNNPACK 后端作为 JNI 库加载。稍后,此共享库将由 Java 代码中的 NativePeer.java
加载。
通过高通 AI 引擎直接部署模型的步骤¶
mkdir -p ../examples/demo-apps/android/ExecuTorchDemo/app/src/main/jniLibs/arm64-v8a
我们需要将一些额外的 Qualcomm HTP 后端库推送到应用程序。请参考 高通文档。
cp ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnHtp.so ${QNN_SDK_ROOT}/lib/hexagon-v69/unsigned/libQnnHtpV69Skel.so ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnHtpV69Stub.so ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnSystem.so \
examples/demo-apps/android/ExecuTorchDemo/app/src/main/jniLibs/arm64-v8a
复制核心库
cp cmake-android-out/extension/android/libexecutorch_jni.so \
examples/demo-apps/android/ExecuTorchDemo/app/src/main/jniLibs/arm64-v8a/libexecutorch.so
cp cmake-android-out/lib/libqnn_executorch_backend.so \
examples/demo-apps/android/ExecuTorchDemo/app/src/main/jniLibs/arm64-v8a/libqnn_executorch_backend.so
运行应用程序¶
使用 Android Studio 打开项目
examples/demo-apps/android/ExecuTorchDemo
。运行 应用程序 (^R)。
在手机或模拟器上,您可以尝试运行模型:
要点¶
通过本教程,我们学习了如何构建具有 XNNPACK(或 Qualcomm HTP)后端的 ExecuTorch 运行时库,并将其公开到 JNI 层以构建运行分割模型的 Android 应用程序。