目录

构建 ExecuTorch Android 演示应用程序

这是从 PyTorch Android Demo App 分叉而来的。

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

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

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

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

先决条件

注意

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

提前

我们在 Android Demo App 中为 ExecuTorch 运行时生成模型文件。

XNNPACK 委派

要将 DeepLab v3 委托给 XNNPACK 后端,请执行以下操作以导出模型:

export FLATC_EXECUTABLE=$(realpath third-party/flatbuffers/cmake-out/flatc)
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 SM8550 -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>

rm -rf cmake-out && mkdir cmake-out && cd cmake-out
cmake .. \
    -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
    -DANDROID_ABI=arm64-v8a \
    -DBUCK2=/tmp/buck2 \
    -DEXECUTORCH_BUILD_ANDROID_DEMO_APP_JNI=ON \
    -DEXECUTORCH_BUILD_XNNPACK=ON \
    -DEXECUTORCH_BUILD_FLATC=OFF \
    -DEXECUTORCH_BUILD_EXTENSION_DATA_LOADER=ON

当我们设置 时,我们将构建目标,该目标又通过 CMake 链接到 libexecutorchdemo。EXECUTORCH_BUILD_XNNPACK=ON

libexecutorchdemo.so包装了所需的 XNNPACK 后端运行时库,并使用 fbjni 添加了一个额外的 JNI 层。这稍后将公开给 Java 应用程序。xnn_executor_runner_lib

  1. 构建库:

cmake --build . -j16

高通 Hexagon NPU

  1. 使用 Qualcomm Hexagon NPU (HTP) 后端(也包括 XNNPACK)为库配置 CMake 目标:

export ANDROID_NDK=<path-to-android-ndk>
export QNN_SDK=<path-to-qnn-sdk>

rm -rf cmake-out && mkdir cmake-out && cd cmake-out
cmake .. \
    -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
    -DANDROID_ABI=arm64-v8a \
    -DBUCK2=/tmp/buck2 \
    -DEXECUTORCH_BUILD_ANDROID_DEMO_APP_JNI=ON \
    -DEXECUTORCH_BUILD_XNNPACK=ON \
    -DEXECUTORCH_BUILD_FLATC=OFF \
    -DEXECUTORCH_BUILD_QNN=ON \
    -DQNN_SDK_ROOT=$QNN_SDK \
    -DEXECUTORCH_BUILD_EXTENSION_DATA_LOADER=ON

与 XNNPACK 库类似,通过此设置,我们进行编译,但它添加了一个额外的静态库,该库包装了 Qualcomm HTP 运行时库并注册了 Qualcomm HTP 后端。这稍后将公开给 Java 应用程序。libexecutorchdemo.soqnn_executorch_backend

qnn_executorch_backend在我们打开 CMake 选项 时构建。它将包括来自 backends/qualcomm 的 CMakeLists.txt,其中我们 .EXECUTORCH_BUILD_QNNadd_library(qnn_executorch_backend STATIC)

  1. 构建库:

cmake --build . -j16

通过 Demo App 在设备上部署

通过 XNNPACK 部署模型的步骤

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

复制核心库:

cp ./examples/demo-apps/android/jni/libexecutorchdemo.so \
   ../examples/demo-apps/android/ExecuTorchDemo/app/src/main/jniLibs/arm64-v8a

这允许 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/aarch64-android/libQnnHtpV69Skel.so ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnHtpStub.so ${QNN_SDK_ROOT}/lib/aarch64-android/libQnnSystem.so \
   ../examples/demo-apps/android/ExecuTorchDemo/app/src/main/jniLibs/arm64-v8a

复制核心库:

cp ./examples/demo-apps/android/jni/libexecutorchdemo.so \
   ../examples/demo-apps/android/ExecuTorchDemo/app/src/main/jniLibs/arm64-v8a

运行应用程序

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

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

Android Studio 视图

在手机或仿真器上,您可以尝试运行该模型:Android 演示

要点

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

报告问题

如果您在本教程后遇到任何错误或问题,请在 Github 上提交错误/问题。


1

仅当应用程序中需要 Qualcomm HTP Backend 时,此部分才适用。这同样适用于带有标题的章节。Qualcomm Hexagon NPU

文档

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

查看文档

教程

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

查看教程

资源

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

查看资源