C/C++ API による GPU アクセラレーション デリゲート

画像処理装置(GPU)を使用して機械学習(ML)モデルを実行する パフォーマンスとユーザーエクスペリエンスが ML 対応アプリケーションAndroid デバイスでは、GPU アクセラレーションを使用する デリゲートと 1 つのデリゲートを使用してモデルを実行する 説明します。

  • Interpreter API - ガイド
  • ネイティブ(C/C++)API - このガイド

このガイドでは、GPU デリゲートの C API、C++ API、 量子化モデルの使用ですGPU デリゲートの使用に関する詳細については、 ベスト プラクティスや高度な手法を含む LiteRT については、GPU 代理人のページをご覧ください。

GPU アクセラレーションを有効にする

C または C++ で Android 用の LiteRT GPU デリゲートを使用するには、 TfLiteGpuDelegateV2Create() でデリゲートし、次で破棄する 次のサンプルコードに示すように、TfLiteGpuDelegateV2Delete() を設定します。

// Set up interpreter.
auto model = FlatBufferModel::BuildFromFile(model_path);
if (!model) return false;
ops::builtin::BuiltinOpResolver op_resolver;
std::unique_ptr<Interpreter> interpreter;
InterpreterBuilder(*model, op_resolver)(&interpreter);

// NEW: Prepare GPU delegate.
auto* delegate = TfLiteGpuDelegateV2Create(/*default options=*/nullptr);
if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;

// Run inference.
WriteToInputTensor(interpreter->typed_input_tensor<float>(0));
if (interpreter->Invoke() != kTfLiteOk) return false;
ReadFromOutputTensor(interpreter->typed_output_tensor<float>(0));

// NEW: Clean up.
TfLiteGpuDelegateV2Delete(delegate);

TfLiteGpuDelegateOptionsV2 オブジェクト コードを確認して委任インスタンスを作成する カスタムオプションを利用できますデフォルトのオプションを初期化するには、 TfLiteGpuDelegateOptionsV2Default()] をクリックし、必要に応じて変更します。

C または C++ の Android 用 LiteRT GPU デリゲートは、 Bazel ビルドシステム。デリゲートを作成するには、 次のコマンドを実行します。

bazel build -c opt --config android_arm64 tensorflow/lite/delegates/gpu:delegate                           # for static library
bazel build -c opt --config android_arm64 tensorflow/lite/delegates/gpu:libtensorflowlite_gpu_delegate.so  # for dynamic library

Interpreter::ModifyGraphWithDelegate() または Interpreter::Invoke() の呼び出し側には、EGLContext を現在の スレッドと Interpreter::Invoke() は同じ EGLContext から呼び出す必要があります。条件 EGLContext が存在しない場合、デリゲートは内部で 1 つ作成しますが、 Interpreter::Invoke() は常に同じプロバイダから呼び出されるようにし、 Interpreter::ModifyGraphWithDelegate()が呼び出されたスレッドに戻ります

Google Play 開発者サービスの LiteRT を使用する場合:

Google Play 開発者サービスの C API で LiteRT を使用している場合は、 Java/Kotlin API を使用して、GPU デリゲートが使用可能かどうかを確認する 初期化する前に、デバイスの認証情報を確認してください。

アプリに GPU デリゲート Gradle 依存関係を追加します。

implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'

次に、GPU の可用性を確認し、チェックに問題がない場合は TfLiteNative を初期化します 成功:

Java

Task<Void> tfLiteHandleTask =
TfLiteGpu.isGpuDelegateAvailable(this)
   .onSuccessTask(gpuAvailable -> {
      TfLiteInitializationOptions options =
        TfLiteInitializationOptions.builder()
          .setEnableGpuDelegateSupport(gpuAvailable).build();
        return TfLiteNative.initialize(this, options);
      }
    );
      

Kotlin

val tfLiteHandleTask = TfLiteGpu.isGpuDelegateAvailable(this)
    .onSuccessTask { gpuAvailable ->
        val options = TfLiteInitializationOptions.Builder()
            .setEnableGpuDelegateSupport(gpuAvailable)
            .build()
        TfLiteNative.initialize(this, options)
    }
        

また、CMake の設定を更新して TFLITE_USE_OPAQUE_DELEGATE コンパイラ フラグ:

add_compile_definitions(TFLITE_USE_OPAQUE_DELEGATE)

FlatBuffers ライブラリを使用して、 プラグインをデリゲートするため、ネイティブ コードの依存関係に追加する必要があります。 公式の CMake プロジェクト構成を使用するには、次のようにします。

target_include_directories(tflite-jni PUBLIC
        third_party/headers # flatbuffers
     ...)

また、ヘッダーをアプリにバンドルすることもできます。

最後に、C コードで GPU 推論を使用するには、次を使用して GPU デリゲートを作成します。 TFLiteSettings:

#include "flatbuffers/flatbuffers.h"
#include "tensorflow/lite/acceleration/configuration/configuration_generated.h"

flatbuffers::FlatBufferBuilder fbb;
tflite::TFLiteSettingsBuilder builder(fbb);
const tflite::TFLiteSettings* tflite_settings =
    flatbuffers::GetTemporaryPointer(fbb, builder.Finish());

const TfLiteOpaqueDelegatePlugin* pluginCApi = TfLiteGpuDelegatePluginCApi();
TfLiteOpaqueDelegate* gpu_delegate = pluginCApi->create(tflite_settings);

量子化モデル

Android GPU デリゲート ライブラリはデフォルトで量子化モデルをサポートしています。Google GPU デリゲートで量子化モデルを使用するには、コードを変更する必要があります。「 次のセクションでは、テストやイベントで量子化サポートを無効にする方法について説明します。 使用します。

量子化モデルのサポートを無効にする

次のコードは、量子化モデルのサポートを無効にする方法を示しています。

C++

TfLiteGpuDelegateOptionsV2 options = TfLiteGpuDelegateOptionsV2Default();
options.experimental_flags = TFLITE_GPU_EXPERIMENTAL_FLAGS_NONE;

auto* delegate = TfLiteGpuDelegateV2Create(options);
if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
      

GPU アクセラレーションを使用した量子化モデルの実行について詳しくは、以下をご覧ください。 GPU デリゲートの概要。