Google Play 開発者サービスの LiteRT には、ネイティブ API に加えて、Java または Kotlin コードから使用できる Java API を使用してアクセスすることもできます。特に、Google Play サービスの LiteRT は LiteRT Interpreter API を通じて利用できます。
Interpreter API の使用
TensorFlow ランタイムが提供する LiteRT インタープリタ API は、ML モデルの構築と実行のための汎用インターフェースを提供します。Google Play 開発者サービス ランタイムで TensorFlow Lite を使用して Interpreter API で推論を実行する手順は次のとおりです。
1. プロジェクトの依存関係を追加する
LiteRT の Play サービス API にアクセスするには、アプリ プロジェクトのコードに次の依存関係を追加します。
dependencies {
...
// LiteRT dependencies for Google Play services
implementation 'com.google.android.gms:play-services-tflite-java:16.1.0'
// Optional: include LiteRT Support Library
implementation 'com.google.android.gms:play-services-tflite-support:16.1.0'
...
}
2. LiteRT の初期化を追加
LiteRT API を使用する前に、Google Play 開発者サービス API の LiteRT コンポーネントを初期化します。
Kotlin
val initializeTask: Task<Void> by lazy { TfLite.initialize(this) }
Java
Task<Void> initializeTask = TfLite.initialize(context);
3. インタープリタを作成してランタイム オプションを設定する
次のコード例に示すように、InterpreterApi.create()
を使用してインタープリタを作成し、InterpreterApi.Options.setRuntime()
を呼び出して Google Play 開発者サービス ランタイムを使用するように構成します。
Kotlin
import org.tensorflow.lite.InterpreterApi import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime ... private lateinit var interpreter: InterpreterApi ... initializeTask.addOnSuccessListener { val interpreterOption = InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) interpreter = InterpreterApi.create( modelBuffer, interpreterOption )} .addOnFailureListener { e -> Log.e("Interpreter", "Cannot initialize interpreter", e) }
Java
import org.tensorflow.lite.InterpreterApi import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime ... private InterpreterApi interpreter; ... initializeTask.addOnSuccessListener(a -> { interpreter = InterpreterApi.create(modelBuffer, new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)); }) .addOnFailureListener(e -> { Log.e("Interpreter", String.format("Cannot initialize interpreter: %s", e.getMessage())); });
上記の実装を使用すると、Android ユーザー インターフェース スレッドのブロックを回避できます。スレッド実行をより厳密に管理する必要がある場合は、インタープリタの作成に Tasks.await()
呼び出しを追加できます。
Kotlin
import androidx.lifecycle.lifecycleScope ... lifecycleScope.launchWhenStarted { // uses coroutine initializeTask.await() }
Java
@BackgroundThread InterpreterApi initializeInterpreter() { Tasks.await(initializeTask); return InterpreterApi.create(...); }
4. 推論を実行する
作成した interpreter
オブジェクトを使用して、run()
メソッドを呼び出して推論を生成します。
Kotlin
interpreter.run(inputBuffer, outputBuffer)
Java
interpreter.run(inputBuffer, outputBuffer);
ハードウェア アクセラレーション
LiteRT を使用すると、グラフィック プロセッシング ユニット(GPU)などの専用ハードウェア プロセッサを使用してモデルのパフォーマンスを高速化できます。これらの特殊なプロセッサは、デリゲートと呼ばれるハードウェア ドライバを使用して活用できます。
GPU デリゲートは Google Play 開発者サービスを通じて提供され、Interpreter API の Play 開発者サービス バージョンと同様に動的に読み込まれます。
デバイスの互換性を確認する
すべてのデバイスが TFLite で GPU ハードウェア アクセラレーションをサポートしているわけではありません。エラーやクラッシュの可能性を軽減するため、TfLiteGpu.isGpuDelegateAvailable
メソッドを使用して、デバイスが GPU デリゲートと互換性があるかどうかを確認します。
このメソッドを使用して、デバイスが GPU と互換性があるかどうかを確認し、GPU がサポートされていない場合は CPU をフォールバックとして使用します。
useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)
useGpuTask
などの変数があれば、デバイスが GPU デリゲートを使用するかどうかを判断できます。
Kotlin
val interpreterTask = useGpuTask.continueWith { task -> val interpreterOptions = InterpreterApi.Options() .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) if (task.result) { interpreterOptions.addDelegateFactory(GpuDelegateFactory()) } InterpreterApi.create(FileUtil.loadMappedFile(context, MODEL_PATH), interpreterOptions) }
Java
Task<InterpreterApi.Options> interpreterOptionsTask = useGpuTask.continueWith({ task -> InterpreterApi.Options options = new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY); if (task.getResult()) { options.addDelegateFactory(new GpuDelegateFactory()); } return options; });
インタープリタ API を使用した GPU
Interpreter API で GPU デリゲートを使用するには:
プロジェクトの依存関係を更新して、Play 開発者サービスの GPU デリゲートを使用します。
implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'
TFlite の初期化で GPU デリゲート オプションを有効にします。
Kotlin
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build())
Java
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build());
インタープリタ オプションで GPU デリゲートを有効にします。
addDelegateFactory() within
InterpreterApi.Options()` を呼び出して、デリゲート ファクトリを GpuDelegateFactory に設定します。Kotlin
val interpreterOption = InterpreterApi.Options() .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) .addDelegateFactory(GpuDelegateFactory())
Java
Options interpreterOption = InterpreterApi.Options() .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) .addDelegateFactory(new GpuDelegateFactory());
スタンドアロン LiteRT からの移行
アプリをスタンドアロンの LiteRT から Play サービス API に移行する場合は、アプリ プロジェクトのコードを更新するための次の追加のガイダンスをご覧ください。
- 制限事項のセクションを確認して、ユースケースがサポートされていることを確認します。
- コードを更新する前に、モデルのパフォーマンスと精度を確認することをおすすめします。特に、バージョン 2.1 より前の LiteRT(TF Lite)のバージョンを使用している場合は、新しい実装と比較するためのベースラインを確保してください。
- LiteRT 用の Play サービス API を使用するようにすべてのコードを移行した場合は、アプリのサイズを縮小できるように、既存の LiteRT ランタイム ライブラリの依存関係(
org.tensorflow:tensorflow-lite:*
を含むエントリ)を build.gradle ファイルから削除する必要があります。 - コード内の
new Interpreter
オブジェクトの作成箇所をすべて特定し、それぞれがInterpreterApi.create()
呼び出しを使用するように変更します。新しいTfLite.initialize
は非同期です。つまり、ほとんどの場合、ドロップイン置換ではありません。呼び出しが完了したときにリスナーを登録する必要があります。ステップ 3 のコード スニペットを参照してください。 org.tensorflow.lite.Interpreter
クラスまたはorg.tensorflow.lite.InterpreterApi
クラスを使用して、ソースファイルにimport org.tensorflow.lite.InterpreterApi;
とimport org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime;
を追加します。InterpreterApi.create()
の呼び出しの結果に引数が 1 つしかないものがある場合は、引数リストにnew InterpreterApi.Options()
を追加します。InterpreterApi.create()
の呼び出しの最後の引数に.setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
を追加します。org.tensorflow.lite.Interpreter
クラスの他のすべての出現をorg.tensorflow.lite.InterpreterApi
に置き換えます。
スタンドアロンの LiteRT と Play 開発者サービス API を並行して使用する場合は、LiteRT(TF Lite)バージョン 2.9 以降を使用する必要があります。LiteRT(TF Lite)バージョン 2.8 以前は、Play サービス API バージョンと互換性がありません。