TensorFlow 演算子を選択する

TensorFlow Lite 組み込みオペレーター ライブラリでサポートされる TensorFlow 演算子の数が限られているため、すべてのモデルが変換可能とは限りません。詳しくは、演算子の互換性をご覧ください。

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

このドキュメントでは、任意のプラットフォームで TensorFlow オペレーションを含む TensorFlow Lite モデルを変換してrunする方法について説明します。また、パフォーマンス指標とサイズ指標既知の制限事項についても説明します。

モデルを変換する

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

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 TensorFlow Lite ops.
  tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

推論を実行する

一部の TensorFlow 演算をサポートするように変換された TensorFlow Lite モデルを使用する場合、クライアントは TensorFlow 演算の必要なライブラリを含む TensorFlow Lite ランタイムも使用する必要があります。

Android の AAR

バイナリサイズを減らすには、次のセクションの手順に沿って、独自のカスタム AAR ファイルを作成してください。バイナリサイズをそれほど問題にしない場合は、MavenCentral でホストされる TensorFlow 演算でビルド済みの AAR を使用することをおすすめします。

次のように、標準の TensorFlow Lite 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 op を処理するために必要なデリゲートが、それを必要とするグラフに対して自動的にインストールされます。

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

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

Android AAR を作成する

バイナリサイズを削減する場合や、その他の高度なケースでは、ライブラリを手動でビルドすることもできます。TensorFlow Lite ビルド環境が動作していると仮定して、次のように特定の 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

これにより、TensorFlow Lite の組み込み演算とカスタム オペレーション用の 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() 依存関係があることを確認し、標準の 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'
    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.1.100'
}

iOS

CocoaPods を使用する

TensorFlow Lite では、arm64 に対して夜間にビルド済みの厳選された TF オペレーションの CocoaPods が提供されます。これは、TensorFlowLiteSwift または TensorFlowLiteObjC CocoaPods とともに依存できます。

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

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

pod install を実行した後、追加のリンカーフラグを指定して、選択した TF オペレーション フレームワークをプロジェクトに強制的に読み込む必要があります。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 を有効にして変換されたファイルに置き換えます。
  • 指示に沿って、TensorFlowLiteSelectTfOps 依存関係を Podfile に追加します。
  • 上記のようにリンカーフラグを追加します。
  • サンプルアプリを実行して、モデルが正しく動作するかどうかを確認します。

Bazel + Xcode の使用

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

iOS サポートを有効にしてワークスペースを構成したら、次のコマンドを使用して、通常の TensorFlowLiteC.framework に追加できる、厳選された TF オペレーションのアドオン フレームワークをビルドできます。一部の 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/ ディレクトリにフレームワークが生成されます。この新しいフレームワークは、iOS ビルドガイドの Xcode プロジェクトの設定セクションに記載されている同様の手順で、Xcode プロジェクトに追加できます。

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

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

C/C++

Bazel または CMake を使用して TensorFlow Lite インタープリタをビルドする場合は、TensorFlow Lite 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 オペレーションを含む TensorFlow Lite は、TensorFlow pip パッケージとともに自動的にインストールされます。TensorFlow Lite Interpreter pip パッケージのみをインストールすることもできます。

指標

パフォーマンス

組み込みの TensorFlow 演算と一部の TensorFlow 演算を組み合わせて使用する場合は、変換後のモデルでも同じ TensorFlow Lite 最適化と最適化された組み込み演算を使用できます。

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

ビルド 時間(ミリ秒)
組み込み演算のみ(TFLITE_BUILTIN 2,607
TF オペレーションのみの使用(SELECT_TF_OPS 2,645

バイナリサイズ

次の表は、各ビルドの TensorFlow Lite のバイナリサイズを示しています。これらのターゲットは、--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 モデル用に選択的にビルドされています。詳しくは、TensorFlow Lite のバイナリサイズを縮小するをご覧ください。

既知の制限事項

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

最新情報

  • バージョン 2.6
    • GraphDef 属性ベースの演算子と HashTable リソースの初期化のサポートが改善されました。
  • バージョン 2.5
    • トレーニング後量子化と呼ばれる最適化を適用できます。
  • バージョン 2.4
    • ハードウェア アクセラレーションの委任との互換性を改善しました