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.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'
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 で使用できる入出力型のフルセットをサポートしていない場合があります。