Google Play 開発者サービスの Java(および Kotlin)API の LiteRT

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 デリゲートを使用するには:

  1. プロジェクトの依存関係を更新して、Play 開発者サービスの GPU デリゲートを使用します。

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'
    
  2. TFlite の初期化で GPU デリゲート オプションを有効にします。

    Kotlin

    TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(true)
        .build())

    Java

    TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(true)
        .build());
  3. インタープリタ オプションで GPU デリゲートを有効にします。addDelegateFactory() withinInterpreterApi.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 に移行する場合は、アプリ プロジェクトのコードを更新するための次の追加のガイダンスをご覧ください。

  1. 制限事項のセクションを確認して、ユースケースがサポートされていることを確認します。
  2. コードを更新する前に、モデルのパフォーマンスと精度を確認することをおすすめします。特に、バージョン 2.1 より前の LiteRT(TF Lite)のバージョンを使用している場合は、新しい実装と比較するためのベースラインを確保してください。
  3. LiteRT 用の Play サービス API を使用するようにすべてのコードを移行した場合は、アプリのサイズを縮小できるように、既存の LiteRT ランタイム ライブラリの依存関係(org.tensorflow:tensorflow-lite:* を含むエントリ)を build.gradle ファイルから削除する必要があります。
  4. コード内の new Interpreter オブジェクトの作成箇所をすべて特定し、それぞれが InterpreterApi.create() 呼び出しを使用するように変更します。新しい TfLite.initialize は非同期です。つまり、ほとんどの場合、ドロップイン置換ではありません。呼び出しが完了したときにリスナーを登録する必要があります。ステップ 3 のコード スニペットを参照してください。
  5. org.tensorflow.lite.Interpreter クラスまたは org.tensorflow.lite.InterpreterApi クラスを使用して、ソースファイルに import org.tensorflow.lite.InterpreterApi;import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime; を追加します。
  6. InterpreterApi.create() の呼び出しの結果に引数が 1 つしかないものがある場合は、引数リストに new InterpreterApi.Options() を追加します。
  7. InterpreterApi.create() の呼び出しの最後の引数に .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) を追加します。
  8. org.tensorflow.lite.Interpreter クラスの他のすべての出現を org.tensorflow.lite.InterpreterApi に置き換えます。

スタンドアロンの LiteRT と Play 開発者サービス API を並行して使用する場合は、LiteRT(TF Lite)バージョン 2.9 以降を使用する必要があります。LiteRT(TF Lite)バージョン 2.8 以前は、Play サービス API バージョンと互換性がありません。