Google Play 開発者サービス Java API の LiteRT

Google Play 開発者サービスの LiteRT には、Java API を使用してアクセスすることもできます。 ネイティブ API の追加が可能です特に、Google Play の LiteRT LiteRT Interpreter インタープリタ API

Interpreter API の使用

TensorFlow ランタイムで提供される LiteRT Interpreter API は、ML モデルを構築して実行するための汎用インターフェースを提供します。Google Play 開発者サービスのランタイムで TensorFlow Lite を使用して Interpreter API で推論を実行する手順は次のとおりです。

1. プロジェクトの依存関係を追加する

Play にアクセスするには、アプリ プロジェクトのコードに次の依存関係を追加します。 Services API for LiteRT:

dependencies {
...
    // LiteRT dependencies for Google Play services
    implementation 'com.google.android.gms:play-services-tflite-java:16.0.1'
    // Optional: include LiteRT Support Library
    implementation 'com.google.android.gms:play-services-tflite-support:16.0.1'
...
}

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;
});
    

GPU とインタープリタ API

Interpreter API で GPU デリゲートを使用するには:

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

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.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 を使用している場合は、新しい実装と比較するためのベースラインを用意します。
  3. すべてのコードを移行し、Google Play 開発者サービスの API を LiteRT を使用するには、既存の LiteRT ランタイムを削除する必要があります。 ライブラリ依存関係( org.tensorflow:tensorflow-lite:* など)を build.gradle から アプリのサイズを小さくすることができます。
  4. コード内で発生した new Interpreter オブジェクトをすべて特定します。 InterpreterApi.create() 呼び出しを使用するように各要素を変更します。「 新しい TfLite.Initialize は非同期です。つまり、ほとんどの場合、 ドロップイン置換: 呼び出しの応答時にリスナーを登録し、 表示されます。ステップ 3 のコード スニペットを参照してください。
  5. import org.tensorflow.lite.InterpreterApi;import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime; を任意のソースに追加 使用する場合は、org.tensorflow.lite.Interpreter または org.tensorflow.lite.InterpreterApi クラス。
  6. 結果として得られる InterpreterApi.create() の呼び出しに、 単一の引数の場合は、引数リストに new InterpreterApi.Options() を追加します。
  7. 最後の引数に .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) を追加します。 InterpreterApi.create() への呼び出し。
  8. org.tensorflow.lite.Interpreter クラスの他の箇所をすべて置き換える org.tensorflow.lite.InterpreterApi に置き換えます。

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