TensorFlow Lite for Android をビルドする

このドキュメントでは、TensorFlow Lite Android ライブラリを独自にビルドする方法について説明します。通常、TensorFlow Lite 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 'org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly-SNAPSHOT'
    implementation 'org.tensorflow:tensorflow-lite-support:0.0.0-nightly-SNAPSHOT'
    ...
}
...

TensorFlow Lite をローカルでビルドする

場合によっては、TensorFlow Lite のローカルビルドを使用したいことがあります。たとえば、TensorFlow から選択された演算を含むカスタム バイナリをビルドする場合や、TensorFlow Lite をローカルで変更する場合などです。

Docker を使用してビルド環境を設定する

  • Docker ファイルをダウンロードします。Docker ファイルをダウンロードすると、その使用に次の利用規約が適用されることに同意したものとみなされます。

デベロッパーは、クリックして同意することにより、Android Studio および Android Native Development Kit のすべての使用に、Android ソフトウェア開発キットのライセンス契約(https://developer.android.com/studio/terms)が適用されることに同意したものとみなされます(この 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 の主要なビルドシステムです。SDK を使用してビルドするには、Android NDK と SDK をシステムにインストールしておく必要があります。

  1. 最新バージョンの Bazel ビルドシステムをインストールします。
  2. Android NDK は、ネイティブ(C/C++)TensorFlow Lite コードをビルドするために必要です。現在の推奨バージョンは 25b です(こちらをご覧ください)。
  3. Android SDK とビルドツールは、こちらで入手するか、Android Studio の一部として入手できます。TensorFlow Lite のビルドには、Build Tools API 23 以上が推奨バージョンです。

WORKSPACE と .bazelrc の設定

これは、TF Lite ライブラリのビルドに必要な 1 回限りの構成手順です。TensorFlow チェックアウトのルート ディレクトリで ./configure スクリプトを実行します。Android ビルド用に ./WORKSPACE をインタラクティブに構成するようにスクリプトから要求された場合は、「はい」と答えます。このスクリプトは、次の環境変数を使用して設定の構成を試みます。

  • 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 が正しく構成されたら、次のようにして、ルート チェックアウト ディレクトリから TensorFlow Lite 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 ファイルを生成します。詳しくは、TensorFlow Lite のバイナリサイズを削減するをご覧ください。

AAR をプロジェクトに直接追加

tensorflow-lite.aar ファイルをプロジェクトの libs というディレクトリに移動します。新しいディレクトリを参照するようにアプリの build.gradle ファイルを変更し、既存の TensorFlow Lite 依存関係を新しいローカル ライブラリに置き換えます。次に例を示します。

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() 依存関係があることを確認し、標準の TensorFlow Lite 依存関係を、選択した 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 をインストールすると、アプリのコードで標準の TensorFlow Lite Java 推論 API を使用できます。