Google Play 開発者サービスの LiteRT には、ネイティブ API に加えて、Java API を使用してアクセスすることもできます。Java API は、Java コードまたは Kotlin コードから使用できます。特に、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 開発者サービスを介して提供され、Play 開発者サービス版の Interpreter API と同様に動的に読み込まれます。
デバイスの互換性の確認
すべてのデバイスが 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 を使用する場合は、アプリのサイズを削減できるように、build.gradle ファイルから既存の LiteRT ランタイム ライブラリの依存関係(
org.tensorflow:tensorflow-lite:*
を含むエントリ)を削除する必要があります。 - コード内の
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 バージョンと互換性がありません。