Android 用 TensorFlow Lite を構築する

このドキュメントでは、TensorFlow Lite Android ライブラリを自分で構築する方法について説明します。通常、TensorFlow Lite Android ライブラリをローカルに構築する必要はありません。これを使用したいだけの場合は、Android プロジェクトでの使用方法の詳細については、 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 ネイティブ開発キットのすべての使用が、 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. Android NDK は、ネイティブ (C/C++) TensorFlow Lite コードをビルドするために必要です。現在推奨されているバージョンは 25b です。これはここ にあります。
  3. Android SDK とビルド ツールはここから入手することも、 Android Studioの一部として入手することもできます。ビルド ツール API >= 23 は、TensorFlow Lite をビルドするための推奨バージョンです。

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ファイルを生成し、モデルの 1 つが Tensorflow ops を使用している場合はオプションで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')
}

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()依存関係があることを確認し、標準の 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を使用できます。