Android 向けアクセラレーション サービス (ベータ版)

ハードウェア アクセラレーションに GPU、NPU、DSP などの特殊なプロセッサを使用すると、推論パフォーマンス (場合によっては最大 10 倍高速な推論) と ML 対応 Android アプリケーションのユーザー エクスペリエンスが大幅に向上します。ただし、ユーザーが使用するハードウェアとドライバーが多様であることを考慮すると、各ユーザーのデバイスに最適なハードウェア アクセラレーション構成を選択するのは困難な場合があります。さらに、デバイス上で間違った構成を有効にすると、待ち時間が長くなったり、まれにハードウェアの互換性がないためにランタイム エラーや精度の問題が発生したりするため、ユーザー エクスペリエンスが低下する可能性があります。

Android 用アクセラレーション サービスは、実行時エラーや精度の問題のリスクを最小限に抑えながら、特定のユーザー デバイスと.tfliteモデルに最適なハードウェア アクセラレーション構成を選択するのに役立つ API です。

Acceleration Service は、TensorFlow Lite モデルで内部推論ベンチマークを実行することにより、ユーザー デバイス上のさまざまなアクセラレーション設定を評価します。これらのテストの実行は、モデルによって異なりますが、通常は数秒で完了します。推論時間前にすべてのユーザー デバイスでベンチマークを 1 回実行し、結果をキャッシュして推論中に使用できます。これらのベンチマークはプロセス外で実行されます。これにより、アプリがクラッシュするリスクが最小限に抑えられます。

モデル、データ サンプル、および予想される結果 (「ゴールデン」入出力) を提供すると、アクセラレーション サービスが内部 TFLite 推論ベンチマークを実行して、ハードウェアの推奨事項を提供します。

画像

Acceleration Service は Android のカスタム ML スタックの一部であり、 Google Play サービスの TensorFlow Liteと連携して動作します。

依存関係をプロジェクトに追加する

次の依存関係をアプリケーションの build.gradle ファイルに追加します。

implementation  "com.google.android.gms:play-services-tflite-
acceleration-service:16.0.0-beta01"

Acceleration Service API は、Google Play Services の TensorFlow Liteと連携して動作します。 Play Services 経由で提供される TensorFlow Lite ランタイムをまだ使用していない場合は、依存関係を更新する必要があります。

アクセラレーション サービス API の使用方法

アクセラレーション サービスを使用するには、モデル (OpenGL を使用した GPU など) に対して評価するアクセラレーション構成を作成することから始めます。次に、モデル、いくつかのサンプル データ、および予想されるモデル出力を使用して検証構成を作成します。最後に、高速化設定と検証設定の両方を渡してvalidateConfig()を呼び出します。

画像

アクセラレーション構成を作成する

アクセラレーション構成は、実行時にデリゲートに変換されるハードウェア構成を表現したものです。その後、高速化サービスはこれらの構成を内部で使用してテスト推論を実行します。

現時点では、アクセラレーション サービスを使用すると、 GpuAccelerationConfigを使用して GPU 構成 (実行中に GPU デリゲートに変換される) と CPU 推論 ( CpuAccelerationConfigを使用) を評価できます。今後、より多くの参加者が他のハードウェアにアクセスできるように取り組んでいます。

GPUアクセラレーション構成

次のように GPU アクセラレーション構成を作成します。

AccelerationConfig accelerationConfig = new GpuAccelerationConfig.Builder()
  .setEnableQuantizedInference(false)
  .build();

モデルが量子化を使用するかどうかをsetEnableQuantizedInference()で指定する必要があります。

CPUアクセラレーション設定

次のように CPU アクセラレーションを作成します。

AccelerationConfig accelerationConfig = new CpuAccelerationConfig.Builder()
  .setNumThreads(2)
  .build();

setNumThreads()メソッドを使用して、CPU 推論の評価に使用するスレッドの数を定義します。

検証構成の作成

検証構成を使用すると、高速化サービスによる推論の評価方法を定義できます。それらを使用して以下を渡します。

  • 入力サンプル、
  • 期待される出力、
  • 精度検証ロジック。

モデルの良好なパフォーマンスが期待できる入力サンプル (「ゴールデン」サンプルとも呼ばれます) を必ず提供してください。

次のようにCustomValidationConfig.Builderを使用してValidationConfig作成します。

ValidationConfig validationConfig = new CustomValidationConfig.Builder()
   .setBatchSize(5)
   .setGoldenInputs(inputs)
   .setGoldenOutputs(outputBuffer)
   .setAccuracyValidator(new MyCustomAccuracyValidator())
   .build();

setBatchSize()でゴールデン サンプルの数を指定します。 setGoldenInputs()を使用して、ゴールデン サンプルの入力を渡します。 setGoldenOutputs()で渡された入力に対して期待される出力を提供します。

setInferenceTimeoutMillis()を使用して最大推論時間を定義できます (デフォルトでは 5000 ミリ秒)。推論に定義した時間よりも長い時間がかかる場合、構成は拒否されます。

オプションで、次のようにカスタムAccuracyValidatorを作成することもできます。

class MyCustomAccuracyValidator implements AccuracyValidator {
   boolean validate(
      BenchmarkResult benchmarkResult,
      ByteBuffer[] goldenOutput) {
        for (int i = 0; i < benchmarkResult.actualOutput().size(); i++) {
            if (!goldenOutputs[i]
               .equals(benchmarkResult.actualOutput().get(i).getValue())) {
               return false;
            }
         }
         return true;

   }
}

ユースケースに適した検証ロジックを必ず定義してください。

検証データがすでにモデルに埋め込まれている場合は、 EmbeddedValidationConfig使用できることに注意してください。

検証出力を生成する

ゴールデン出力はオプションであり、ゴールデン入力を指定する限り、アクセラレーション サービスは内部でゴールデン出力を生成できます。 setGoldenConfig()を呼び出して、これらのゴールデン出力の生成に使用されるアクセラレーション構成を定義することもできます。

ValidationConfig validationConfig = new CustomValidationConfig.Builder()
   .setBatchSize(5)
   .setGoldenInputs(inputs)
   .setGoldenConfig(customCpuAccelerationConfig)
   [...]
   .build();

アクセラレーション構成の検証

アクセラレーション構成と検証構成を作成したら、モデルに対してそれらを評価できます。

以下を実行して、Play Services ランタイムを備えた TensorFlow Lite が適切に初期化されていること、およびデバイスで GPU デリゲートが利用可能であることを確認します。

TfLiteGpu.isGpuDelegateAvailable(context)
   .onSuccessTask(gpuAvailable -> TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(gpuAvailable)
        .build()
      )
   );

AccelerationService.create()を呼び出してAccelerationServiceをインスタンス化します。

次に、 validateConfig()を呼び出して、モデルのアクセラレーション構成を検証できます。

InterpreterApi interpreter;
InterpreterOptions interpreterOptions = InterpreterApi.Options();
AccelerationService.create(context)
   .validateConfig(model, accelerationConfig, validationConfig)
   .addOnSuccessListener(validatedConfig -> {
      if (validatedConfig.isValid() && validatedConfig.benchmarkResult().hasPassedAccuracyTest()) {
         interpreterOptions.setAccelerationConfig(validatedConfig);
         interpreter = InterpreterApi.create(model, interpreterOptions);
});

validateConfigs()を呼び出し、 Iterable<AccelerationConfig>オブジェクトをパラメーターとして渡すことによって、複数の構成を検証することもできます。

validateConfig()非同期タスクを有効にする Google Play サービスタスク APIからTask< ValidatedAccelerationConfigResult >を返します。
検証呼び出しから結果を取得するには、 addOnSuccessListener()コールバックを追加します。

インタープリターで検証済みの構成を使用する

コールバックで返されたValidatedAccelerationConfigResultが有効かどうかを確認した後、 interpreterOptions.setAccelerationConfig()を呼び出して、検証された構成をインタープリターのアクセラレーション構成として設定できます。

構成のキャッシュ

モデルに最適なアクセラレーション設定がデバイス上で変更される可能性はほとんどありません。したがって、満足のいくアクセラレーション設定を受け取ったら、別の検証を実行するのではなく、それをデバイスに保存し、アプリケーションでそれを取得して、次のセッション中にそれを使用してInterpreterOptionsを作成する必要があります。 ValidatedAccelerationConfigResultserialize()deserialize()メソッドを使用すると、保存と取得のプロセスが簡単になります。

サンプルアプリケーション

Acceleration Service のその場での統合を確認するには、サンプル アプリを参照してください。

制限事項

アクセラレーション サービスには、現在次の制限があります。

  • 現時点では CPU および GPU アクセラレーション構成のみがサポートされています。
  • TensorFlow Lite は Google Play サービスでのみサポートされており、TensorFlow Lite のバンドル版を使用している場合は使用できません。
  • ValidatedAccelerationConfigResultオブジェクトを使用してBaseOptions直接初期化できないため、TensorFlow Liteタスク ライブラリはサポートされていません。
  • Acceleration Service SDK は API レベル 22 以降のみをサポートします。

注意事項

特にこの SDK を運用環境で使用する予定がある場合は、次の注意事項をよく確認してください。

  • ベータ版を終了して高速化サービス API の安定バージョンをリリースする前に、現在のベータ版とは一部異なる可能性がある新しい SDK を公開します。 Acceleration Service を引き続き使用するには、この新しい SDK に移行し、適時にアプリに更新をプッシュする必要があります。そうしないと、ベータ SDK はしばらくすると Google Play サービスと互換性がなくなる可能性があるため、破損が発生する可能性があります。

  • Acceleration Service API 内の特定の機能、または API 全体が一般公開されるという保証はありません。無期限にベータ版のままになるか、シャットダウンされるか、または特定の開発者向けに設計されたパッケージに他の機能と組み合わされる可能性があります。 Acceleration Service API の一部の機能または API 全体が最終的に一般利用可能になる可能性がありますが、これに関する固定スケジュールはありません。

規約とプライバシー

利用規約

アクセラレーション サービス API の使用には、Google API の利用規約が適用されます。
さらに、アクセラレーション サービス API は現在ベータ版であるため、これを使用すると、上記の注意事項セクションで説明した潜在的な問題を認識し、アクセラレーション サービスが常に指定どおりに動作するとは限らないことを認識したことになります。

プライバシー

アクセラレーション サービス API を使用する場合、入力データ (画像、ビデオ、テキストなど) の処理は完全にデバイス上で行われ、アクセラレーション サービスはそのデータを Google サーバーに送信しません。その結果、デバイスから送信されるべきではない入力データを処理するために API を使用できるようになります。
アクセラレーション サービス API は、バグ修正、更新されたモデル、ハードウェア アクセラレータの互換性情報などを受信するために、Google サーバーに随時接続する場合があります。 Acceleration Service API は、アプリ内の API のパフォーマンスと使用率に関する指標も Google に送信します。 Google は、プライバシー ポリシーで詳細に説明されているように、この指標データをパフォーマンスの測定、API のデバッグ、維持および改善、誤用や悪用の検出に使用します。
あなたには、適用される法律の要求に従って、Google によるアクセラレーション サービス指標データの処理についてアプリのユーザーに通知する責任があります。
当社が収集するデータには次のものが含まれます。

  • デバイス情報 (メーカー、モデル、OS バージョン、ビルドなど) および利用可能な ML ハードウェア アクセラレータ (GPU および DSP)。診断と使用状況分析に使用されます。
  • アプリ情報 (パッケージ名/バンドル ID、アプリのバージョン)。診断と使用状況分析に使用されます。
  • API 設定 (画像形式や解像度など)。診断と使用状況分析に使用されます。
  • イベントの種類 (初期化、モデルのダウンロード、更新、実行、検出など)。診断と使用状況分析に使用されます。
  • エラーコード。診断に使用されます。
  • パフォーマンス指標。診断に使用されます。
  • ユーザーまたは物理デバイスを一意に識別しないインストールごとの識別子。リモート構成と使用状況分析の操作に使用されます。
  • ネットワーク要求の送信者の IP アドレス。リモート構成診断に使用されます。収集したIPアドレスは一時的に保管されます。

サポートとフィードバック

TensorFlow Issue Tracker を通じてフィードバックを提供し、サポートを受けることができます。 Google Play サービスの TensorFlow Lite の問題テンプレートを使用して、問題とサポート リクエストを報告してください。