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

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

インタープリタ API の使用

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

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 の初期化を追加する

Google Play 開発者サービス API の LiteRT コンポーネントを初期化する に次の作業を行っておく必要があります。

Kotlin

val initializeTask: Task<Void> by lazy { TfLite.initialize(this) }

Java

Task<Void> initializeTask = TfLite.initialize(context);

3. インタープリタを作成してランタイム オプションを設定する

InterpreterApi.create() を使用してインタープリタを作成し、以下を使用するように構成します。 Google Play 開発者サービスのランタイム(InterpreterApi.Options.setRuntime() を呼び出して、 これを次のサンプルコードに示します。

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 に対応しているかどうかを確認し、CPU を使用します。 GPU がサポートされていない場合の フォールバックとして使用します

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 デリゲートを有効にする: デリゲート ファクトリを GpuDelegateFactory には、addDelegateFactory() withinInterpreterApi.Options()` を呼び出します。

    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. コードを更新する前に、コードのパフォーマンスと精度のチェックを 特に、以前のバージョンの LiteRT を使用している場合に バージョン 2.1 よりバージョン 2.1 よりも優先されるため、 説明します。
  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 バージョンと互換性がありません。