• 文件 >
  • 建立 ExecuTorch Android 示範應用程式
捷徑

建立 ExecuTorch Android 示範應用程式

這是從 PyTorch Android 示範應用程式 分岔而來。

本指南說明如何使用示範應用程式設定 Android 的 ExecuTorch。該應用程式採用 DeepLab v3 模型來進行影像分割任務。模型使用 XNNPACK FP32 後端 匯出至 ExecuTorch。

您將學到什麼
  • 如何為 Android arm64-v8a 設定建立目標

  • 如何使用 Android 的 JNI 封裝建立所需的 ExecuTorch 執行階段

  • 如何使用所需的 JNI 函式庫和模型檔案建立應用程式

先決條件

注意

此示範應用程式和教學課程僅通過 arm64-v8a ABI 驗證。

建置

預先編譯 (Ahead-Of-Time)

我們在 Android 示範應用程式中產生 ExecuTorch 執行階段的模型檔案。

XNNPACK 委派 (Delegation)

若要將 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 後端

Qualcomm 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 應用程式。

Qualcomm 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 應用程式。

當我們啟用 CMake 選項 EXECUTORCH_BUILD_QNN 時,會建置 qnn_executorch_backend。 它將包含來自 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

透過示範應用程式部署到裝置

透過 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 的全面開發人員文件

檢視文件

教學課程

取得初學者和進階開發人員的深入教學課程

檢視教學課程

資源

尋找開發資源並取得問題解答

檢視資源