建構 Android 適用的 LiteRT

本文說明如何自行建構 LiteRT Android 程式庫。一般來說,您不需要在本機建構 LiteRT Android 程式庫。

使用每晚快照

如要使用每夜快照,請將下列存放區新增至根 Gradle 建構設定。

allprojects {
    repositories {      // should be already there
        mavenCentral()  // should be already there
        maven {         // add this repo to use snapshots
          name 'ossrh-snapshot'
          url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
    }
}

在 build.gradle 中將每夜快照新增至依附元件 (或視需要編輯)

...
dependencies {
    ...
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
    implementation 'com.google.ai.edge.litert:litert-gpu:0.0.0-nightly-SNAPSHOT'
    implementation 'com.google.ai.edge.litert:litert-support:0.0.0-nightly-SNAPSHOT'
    ...
}
...

在本機建構 LiteRT

在某些情況下,您可能會想使用 LiteRT 的本機版本。舉例來說,您可能正在建構包含從 TensorFlow 選取運算的自訂二進位檔,或是想對 LiteRT 進行本機變更。

使用 Docker 設定建構環境

  • 下載 Docker 檔案。下載 Docker 檔案即表示您同意下列服務條款:

按一下接受即表示您同意,Android Studio 和 Android Native Development Kit 的所有使用行為,均受《Android 軟體開發套件授權協議》規範,該協議位於 https://developer.android.com/studio/terms (Google 可能不時更新或變更該網址)。

您必須確認服務條款,才能下載檔案。

  • 您可以視需要變更 Android SDK 或 NDK 版本。將下載的 Docker 檔案放在空白資料夾中,然後執行下列指令來建構 Docker 映像檔:
docker build . -t tflite-builder -f tflite-android.Dockerfile
  • 將目前資料夾掛接到容器內的 /host_dir,以互動方式啟動 Docker 容器 (請注意,/tensorflow_src 是容器內的 TensorFlow 存放區):
docker run -it -v $PWD:/host_dir tflite-builder bash

如果您在 Windows 上使用 PowerShell,請將「$PWD」替換為「pwd」。

如要在主機上使用 TensorFlow 存放區,請改為掛接該主機目錄 (-v hostDir:/host_dir)。

  • 進入容器後,您可以執行下列指令,下載其他 Android 工具和程式庫 (請注意,您可能需要接受授權):
sdkmanager \
  "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" \
  "platform-tools" \
  "platforms;android-${ANDROID_API_LEVEL}"

現在請前往「設定 WORKSPACE 和 .bazelrc」一節,設定建構設定。

建構完程式庫後,您可以將程式庫複製到容器內的 /host_dir,以便在主機上存取。

設定不含 Docker 的建構環境

安裝 Bazel 和 Android 先決條件

Bazel 是 TensorFlow 的主要建構系統。如要使用該版本建構應用程式,您必須在系統上安裝該版本,以及 Android NDK 和 SDK。

  1. 安裝最新版本的 Bazel 建構系統
  2. 您必須使用 Android NDK 建構原生 (C/C++) LiteRT 程式碼。目前建議使用 25b 版,您可以在這裡找到該版本。
    1. 您可以在這裡取得 Android SDK 和建構工具,也可以透過 Android Studio 取得。建構工具 建議使用 API 23 以上版本建構 LiteRT。

設定 WORKSPACE 和 .bazelrc

這是建構 LiteRT 程式庫時必須執行的單次設定步驟。在根 TensorFlow 結帳目錄中執行 ./configure 指令碼,並在指令碼要求以互動方式設定 Android 建構的 ./WORKSPACE 時回答「Yes」。指令碼會嘗試使用下列環境變數設定:

  • ANDROID_SDK_HOME
  • ANDROID_SDK_API_LEVEL
  • ANDROID_NDK_HOME
  • ANDROID_NDK_API_LEVEL

如果未設定這些變數,則必須在指令碼提示中以互動方式提供。設定成功後,根資料夾的 .tf_configure.bazelrc 檔案中應會出現類似下列的項目:

build --action_env ANDROID_NDK_HOME="/usr/local/android/android-ndk-r25b"
build --action_env ANDROID_NDK_API_LEVEL="21"
build --action_env ANDROID_BUILD_TOOLS_VERSION="30.0.3"
build --action_env ANDROID_SDK_API_LEVEL="30"
build --action_env ANDROID_SDK_HOME="/usr/local/android/android-sdk-linux"

建構及安裝

正確設定 Bazel 後,您就能從根結帳目錄建構 LiteRT AAR,如下所示:

bazel build -c opt --cxxopt=--std=c++17 --config=android_arm64 \
  --fat_apk_cpu=x86,x86_64,arm64-v8a,armeabi-v7a \
  --define=android_dexmerger_tool=d8_dexmerger \
  --define=android_incremental_dexing_tool=d8_dexbuilder \
  //tensorflow/lite/java:tensorflow-lite

這會在 bazel-bin/tensorflow/lite/java/ 中產生 AAR 檔案。請注意,這會建構包含多種不同架構的「胖」AAR;如果不需要所有架構,請使用適合部署環境的子集。

您可以只指定一組模型,建構較小的 AAR 檔案,如下所示:

bash tensorflow/lite/tools/build_aar.sh \
  --input_models=model1,model2 \
  --target_archs=x86,x86_64,arm64-v8a,armeabi-v7a

上述指令碼會產生 tensorflow-lite.aar 檔案,如果其中一個模型使用 Tensorflow 作業,則會產生 tensorflow-lite-select-tf-ops.aar 檔案 (選用)。詳情請參閱「減少 LiteRT 二進位檔大小」一節。

直接將 AAR 新增至專案

tensorflow-lite.aar 檔案移到專案中名為 libs 的目錄。修改應用程式的 build.gradle 檔案,參照新目錄並將現有的 LiteRT 依附元件替換為新的本機程式庫,例如:

allprojects {
    repositories {
        mavenCentral()
        maven {  // Only for snapshot artifacts
            name 'ossrh-snapshot'
            url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
        flatDir {
            dirs 'libs'
        }
    }
}

dependencies {
    compile(name:'tensorflow-lite', ext:'aar')
}

將 AAR 安裝至本機 Maven 存放區

在根結帳目錄中執行下列指令:

mvn install:install-file \
  -Dfile=bazel-bin/tensorflow/lite/java/tensorflow-lite.aar \
  -DgroupId=org.tensorflow \
  -DartifactId=tensorflow-lite -Dversion=0.1.100 -Dpackaging=aar

在應用程式的 build.gradle 中,確認您有 mavenLocal() 依附元件,並將標準 LiteRT 依附元件替換為支援選取 TensorFlow 作業的依附元件:

allprojects {
    repositories {
        mavenCentral()
        maven {  // Only for snapshot artifacts
            name 'ossrh-snapshot'
            url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
        mavenLocal()
    }
}

dependencies {
    implementation 'org.tensorflow:tensorflow-lite:0.1.100'
}

請注意,此處的 0.1.100 版本僅供測試/開發用途。安裝本機 AAR 後,您可以在應用程式程式碼中使用標準的 LiteRT Java 推論 API