Android 用 LiteRT をビルドする

このドキュメントでは、LiteRT Android ライブラリを独自にビルドする方法について説明します。通常、LiteRT Android ライブラリをローカルでビルドする必要はありません。

Nightly Snapshot を使用する

ナイトリー スナップショットを使用するには、ルート 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 のすべての使用が、https://developer.android.com/studio/terms で入手可能な Android ソフトウェア開発キット ライセンス契約(この URL は 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. ネイティブ(C/C++)LiteRT コードをビルドするには、Android NDK が必要です。現在の推奨バージョンは 25b です。こちらで確認できます。
    1. Android SDK とビルドツールは、こちらから入手できます。また、Android Studio の一部として入手することもできます。LiteRT のビルドには、ビルドツール API >= 23 が推奨バージョンです。

WORKSPACE と .bazelrc を構成する

これは、LiteRT ライブラリをビルドするために必要な 1 回限りの構成手順です。ルートの 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')
}

ローカルの Maven リポジトリに AAR をインストールする

ルート チェックアウト ディレクトリから次のコマンドを実行します。

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 を使用できます。