目录

构建一个ExecuTorch Android演示应用

这是从 PyTorch Android Demo App 分支出来的。

本指南介绍了如何使用演示应用程序在Android上设置ExecuTorch。该应用程序使用DeepLab v3模型进行图像分割任务。模型通过XNNPACK FP32后端导出到ExecuTorch。

你将学到什么
  • 如何为 Android arm64-v8a 设置构建目标

  • 如何使用 JNI 包装器为 Android 构建所需的 ExecuTorch 运行时

  • 如何使用所需的 JNI 库和模型文件构建应用

先决条件

注意

此演示应用和教程仅在 arm64-v8a ABI 上经过验证。

构建

Ahead-Of-Time

我们在 Android 示例应用中为 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后端

高通Hexagon NPU

要委托给Qualcomm Hexagon NPU,请按照这里的教程操作。

生成模型后,将模型复制到 assets 目录。

python -m examples.qualcomm.scripts.deeplab_v3 -b build-android -m SM8450 -s <adb_connected_device_serial>
cp deeplab_v3/dlv3_qnn.pte examples/demo-apps/android/ExecuTorchDemo/app/src/main/assets/

运行时

我们构建了所需的 ExecuTorch 运行时库以运行模型。

XNNPACK

  1. 构建使用 XNNPACK 后端的库的 CMake 目标:

export ANDROID_NDK=<path-to-android-ndk>
export ANDROID_ABI=arm64-v8a

# Run the following lines from the `executorch/` folder
./install_requirements.sh --clean
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 \
  -DEXECUTORCH_BUILD_EXTENSION_RUNNER_UTIL=ON \
  -DEXECUTORCH_BUILD_EXTENSION_TENSOR=ON \
  -Bcmake-android-out

cmake --build cmake-android-out -j16 --target install

当我们将 EXECUTORCH_BUILD_XNNPACK=ON 设置为值时,我们将构建目标 xnnpack_backend,该目标通过 CMake 链接到 libexecutorch_jni。

  1. 构建 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

  1. 构建用于 Qualcomm 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>

./install_requirements.sh --clean
mkdir 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 \
    -DEXECUTORCH_BUILD_EXTENSION_RUNNER_UTIL=ON \
    -DEXECUTORCH_BUILD_EXTENSION_TENSOR=ON \
    -Bcmake-android-out

cmake --build cmake-android-out -j16 --target install

与XNNPACK库类似,通过此设置,我们编译 libexecutorch_jni.so,但还添加了一个额外的静态库 qnn_executorch_backend,该库封装了Qualcomm HTP运行时库并注册了Qualcomm HTP后端。这之后会暴露给Java应用。

qnn_executorch_backend 是在我们开启 CMake 选项 EXECUTORCH_BUILD_QNN 时构建的。它将包含来自 backends/qualcomm 的 CMakeLists.txt,我们在其中 add_library(qnn_executorch_backend STATIC)

  1. 构建 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

在设备上部署 via 演示应用

模型通过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应用以XNNPACK后端加载ExecuTorch运行时作为JNI库。之后,此共享库将在Java代码中通过NativePeer.java加载。

通过Qualcomm的AI Engine Direct部署模型的步骤

mkdir -p ../examples/demo-apps/android/ExecuTorchDemo/app/src/main/jniLibs/arm64-v8a

我们需要向应用程序推送一些额外的Qualcomm HTP后端库。请参考这里的Qualcomm文档

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

运行应用

  1. 用 Android Studio 打开项目 examples/demo-apps/android/ExecuTorchDemo

  2. 运行应用程序 (^R)。

Android Studio View

在手机或模拟器上,您可以尝试运行模型: Android Demo

要点

通过本教程,我们学习了如何使用 XNNPACK(或 Qualcomm HTP)后端构建 ExecuTorch 运行时库,并将其暴露给 JNI 层以构建运行分割模型的 Android 应用。

报告问题

如果您在按照本教程操作时遇到任何错误或问题,请在此处提交错误/问题至 Github


1

此部分仅在应用程序需要Qualcomm HTP后端时适用。具有标题Qualcomm Hexagon NPU的部分也适用。

文档

访问 PyTorch 的全面开发人员文档

查看文档

教程

获取面向初学者和高级开发人员的深入教程

查看教程

资源

查找开发资源并解答您的问题

查看资源