TensorFlow 演算子を選択する

LiteRT 組み込み演算子ライブラリは、限られた数の TensorFlow 演算子のみをサポートしているため、すべてのモデルを変換できるわけではありません。詳細については、演算子の互換性をご覧ください。

変換を許可するには、LiteRT モデルで特定の TensorFlow オペレーションの使用を有効にします。ただし、TensorFlow オペレーションで LiteRT モデルを実行するには、コア TensorFlow ランタイムをプルする必要があります。これにより、LiteRT インタープリタのバイナリサイズが増加します。Android では、必要な TensorFlow オペレーションのみを選択的にビルドすることで、これを回避できます。詳しくは、バイナリサイズを縮小するをご覧ください。

このドキュメントでは、選択したプラットフォームで TensorFlow 演算を含む LiteRT モデルを変換して実行する方法について説明します。また、パフォーマンスとサイズに関する指標既知の制限事項についても説明します。

モデルを変換する

次の例は、選択した TensorFlow オペレーションを使用して LiteRT モデルを生成する方法を示しています。

import tensorflow as tf

converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.target_spec.supported_ops = [
  tf.lite.OpsSet.TFLITE_BUILTINS, # enable LiteRT ops.
  tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

推論を実行する

一部の TensorFlow オペレーションのサポートを使用して変換された LiteRT モデルを使用する場合、クライアントは必要な TensorFlow オペレーションのライブラリを含む LiteRT ランタイムも使用する必要があります。

Android AAR

バイナリサイズを縮小するには、次のセクションのガイドに沿って、独自のカスタム AAR ファイルをビルドしてください。バイナリサイズがそれほど重要でない場合は、MavenCentral でホストされている TensorFlow オペレーションを含む事前構築済み AAR を使用することをおすすめします。

これは、次のように標準の LiteRT AAR とともに build.gradle 依存関係で指定できます。

dependencies {
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
    // This dependency adds the necessary TF op support.
    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.0.0-nightly-SNAPSHOT'
}

ナイトリー スナップショットを使用するには、Sonatype スナップショット リポジトリを追加していることを確認してください。

依存関係を追加すると、グラフの TensorFlow オペレーションを処理するために必要なデリゲートが、必要なグラフに自動的にインストールされます。

: TensorFlow ops の依存関係は比較的大きいため、abiFilters を設定して .gradle ファイルで不要な x86 ABI を除外することをおすすめします。

android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a'
        }
    }
}

Android AAR をビルドする

バイナリサイズを縮小する場合やその他の高度なケースでは、ライブラリを手動でビルドすることもできます。動作中の LiteRT ビルド環境があることを前提として、次のように選択した TensorFlow オペレーションで Android AAR をビルドします。

sh tensorflow/lite/tools/build_aar.sh \
  --input_models=/a/b/model_one.tflite,/c/d/model_two.tflite \
  --target_archs=x86,x86_64,arm64-v8a,armeabi-v7a

これにより、LiteRT の組み込みオペレーションとカスタム オペレーション用の AAR ファイル bazel-bin/tmp/tensorflow-lite.aar が生成され、TensorFlow オペレーション用の AAR ファイル bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar が生成されます。動作するビルド環境がない場合は、docker を使用して上記のファイルをビルドすることもできます。

ここから、AAR ファイルをプロジェクトに直接インポートするか、カスタム AAR ファイルをローカルの Maven リポジトリに公開できます。

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

最後に、アプリの build.gradlemavenLocal() 依存関係があることを確認し、標準の 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'
    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.1.100'
}

iOS

CocoaPods を使用する

LiteRT は、arm64 用の TF ops CocoaPods を選択して、毎晩ビルド済みで提供します。これは、TensorFlowLiteSwift または TensorFlowLiteObjC CocoaPods とともに依存できます。

: x86_64 シミュレータで一部の TF オペレーションを使用する必要がある場合は、選択オペレーション フレームワークを自分で構築できます。詳しくは、Bazel と Xcode の使用セクションをご覧ください。

# In your Podfile target:
  pod 'TensorFlowLiteSwift'   # or 'TensorFlowLiteObjC'
  pod 'TensorFlowLiteSelectTfOps', '~> 0.0.1-nightly'

pod install を実行したら、追加のリンカーフラグを指定して、選択した TF ops フレームワークをプロジェクトに強制的に読み込む必要があります。Xcode プロジェクトで、Build Settings -> Other Linker Flags に移動し、以下を追加します。

バージョン 2.9.0 以降の場合:

-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.xcframework/ios-arm64/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps

バージョン 2.9.0 より前のバージョン:

-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps

これにより、SELECT_TF_OPS で変換されたモデルを iOS アプリで実行できるようになります。たとえば、画像分類 iOS アプリを変更して、選択した TF オペレーション機能をテストできます。

  • モデルファイルを、SELECT_TF_OPS を有効にして変換したファイルに置き換えます。
  • 指示に従って、PodfileTensorFlowLiteSelectTfOps 依存関係を追加します。
  • 上記のように、追加のリンカーフラグを追加します。
  • サンプルアプリを実行して、モデルが正しく動作するかどうかを確認します。

Bazel + Xcode を使用する

iOS 用の TensorFlow オペレーションを選択した LiteRT は、Bazel を使用してビルドできます。まず、iOS ビルドの手順に沿って、Bazel ワークスペースと .bazelrc ファイルを正しく構成します。

iOS サポートを有効にしてワークスペースを構成したら、次のコマンドを使用して、通常の TensorFlowLiteC.framework の上に追加できる TF ops アドオン フレームワークを選択してビルドできます。選択した TF オペレーション フレームワークは i386 アーキテクチャ用にビルドできないため、i386 を除くターゲット アーキテクチャのリストを明示的に指定する必要があります。

bazel build -c opt --config=ios --ios_multi_cpus=arm64,x86_64 \
  //tensorflow/lite/ios:TensorFlowLiteSelectTfOps_framework

これにより、bazel-bin/tensorflow/lite/ios/ ディレクトリにフレームワークが生成されます。この新しいフレームワークを Xcode プロジェクトに追加するには、iOS ビルドガイドの Xcode プロジェクトの設定セクションで説明されている手順と同様の手順を行います。

フレームワークをアプリ プロジェクトに追加した後、選択した TF ops フレームワークを強制的に読み込むために、アプリ プロジェクトで追加のリンカーフラグを指定する必要があります。Xcode プロジェクトで、Build Settings -> Other Linker Flags に移動し、以下を追加します。

-force_load <path/to/your/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps>

C/C++

Bazel または CMake を使用して LiteRT インタープリタをビルドする場合は、LiteRT Flex デリゲート共有ライブラリをリンクすることで Flex デリゲートを有効にできます。次のコマンドを使用して、Bazel でビルドできます。

bazel build -c opt --config=monolithic tensorflow/lite/delegates/flex:tensorflowlite_flex

このコマンドは、bazel-bin/tensorflow/lite/delegates/flex に次の共有ライブラリを生成します。

プラットフォーム ライブラリ名
Linux libtensorflowlite_flex.so
macOS libtensorflowlite_flex.dylib
Windows tensorflowlite_flex.dll

共有ライブラリがリンクされていれば、実行時にインタープリタを作成する際に必要な TfLiteDelegate が自動的にインストールされます。他のデリゲート タイプで通常必要となるデリゲート インスタンスを明示的にインストールする必要はありません。

注: この機能はバージョン 2.7 以降で利用できます。

Python

選択した TensorFlow 演算を含む LiteRT は、TensorFlow pip パッケージとともに自動的にインストールされます。LiteRT Interpreter pip パッケージのみをインストールすることもできます。

指標

パフォーマンス

組み込みの TensorFlow オペレーションと選択した TensorFlow オペレーションの両方を使用する場合、同じ LiteRT 最適化と最適化された組み込みオペレーションはすべて、変換されたモデルで使用できます。

次の表は、Pixel 2 で MobileNet の推論を実行するのにかかる平均時間を示しています。記載されている時間は 100 回の実行の平均です。これらのターゲットは、フラグ --config=android_arm64 -c opt を使用して Android 向けにビルドされました。

ビルド 時間(ミリ秒)
組み込みオペレーションのみ(TFLITE_BUILTIN 260.7
TF 演算のみを使用する(SELECT_TF_OPS 264.5

バイナリサイズ

次の表に、各ビルドの LiteRT のバイナリ サイズを示します。これらのターゲットは、--config=android_arm -c opt を使用して Android 向けにビルドされました。

ビルド C++ バイナリサイズ Android APK のサイズ
組み込みオペレーションのみ 796 KB 561 KB
組み込みオペレーション + TF オペレーション 23.0 MB 8.0 MB
組み込みオペレーション + TF オペレーション(1) 4.1 MB 1.8 MB

(1)これらのライブラリは、8 個の TFLite ビルトイン オペレーションと 3 個の TensorFlow オペレーションを含む i3d-kinetics-400 モデル用に選択的にビルドされます。詳しくは、LiteRT バイナリのサイズを縮小するをご覧ください。

既知の制限事項

  • サポートされていない型: 特定の TensorFlow 演算は、通常 TensorFlow で使用可能な入出力型の完全なセットをサポートしていない場合があります。

アップデート

  • バージョン 2.6
    • GraphDef 属性ベースの演算子と HashTable リソースの初期化のサポートが改善されました。
  • バージョン 2.5
  • バージョン 2.4
    • ハードウェア アクセラレーテッド デリゲートとの互換性が向上しました