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

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

  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 を使用する場合は、アプリのサイズを削減できるように、build.gradle ファイルから既存の LiteRT ランタイム ライブラリの依存関係(org.tensorflow:tensorflow-lite:* を含むエントリ)を削除する必要があります。
  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 バージョンと互換性がありません。