建立 ExecuTorch Android 示範應用程式¶
這是從 PyTorch Android 示範應用程式 分岔而來。
本指南說明如何使用示範應用程式設定 Android 的 ExecuTorch。該應用程式採用 DeepLab v3 模型來進行影像分割任務。模型使用 XNNPACK FP32 後端 匯出至 ExecuTorch。
如何為 Android arm64-v8a 設定建立目標
如何使用 Android 的 JNI 封裝建立所需的 ExecuTorch 執行階段
如何使用所需的 JNI 函式庫和模型檔案建立應用程式
請參考設定 ExecuTorch 以設定儲存庫和開發環境。
下載並安裝 Android Studio 和 SDK。
支援的主機作業系統:CentOS、macOS Ventura (M1/x86_64)。有關 Qualcomm HTP 的特定要求,請參閱下文。
僅限 Qualcomm HTP1: 若要在 Qualcomm 的 AI Engine Direct 上建置和執行,請依照使用 Qualcomm AI Engine Direct 後端建置和執行 ExecuTorch 中的硬體和軟體先決條件進行設定。本教學課程使用的版本為 2.19。本教學課程使用的晶片為 SM8450。
注意
此示範應用程式和教學課程僅通過 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 後端。
執行階段¶
我們建置所需的 ExecuTorch 執行階段函式庫以執行模型。
XNNPACK¶
使用 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。
建置 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¶
使用 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)
。
建置 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
執行應用程式¶
使用 Android Studio 開啟專案
examples/demo-apps/android/ExecuTorchDemo
。執行應用程式 (^R)。
在手機或模擬器上,您可以嘗試執行模型:
重點¶
透過本教學課程,我們學習了如何使用 XNNPACK(或 Qualcomm HTP)後端建置 ExecuTorch 執行階段函式庫,並將其暴露給 JNI 層以建置執行分段模型的 Android 應用程式。