C/C++ API を使用した GPU アクセラレーション デリゲート

グラフィックス プロセッシング ユニット (GPU) を使用して機械学習 (ML) モデルを実行すると、ML 対応アプリケーションのパフォーマンスとユーザー エクスペリエンスを大幅に向上させることができます。 Android デバイスでは、デリゲートと次の API のいずれかを使用して、モデルの GPU アクセラレーションによる実行を有効にすることができます。

  • インタプリタ API -ガイド
  • タスク ライブラリ API -ガイド
  • ネイティブ (C/C++) API - このガイド

このガイドでは、C API、C++ API の GPU デリゲートの高度な使用法、および量子化モデルの使用法について説明します。 TensorFlow Lite の GPU デリゲートの使用に関する詳細 (ベスト プラクティスや高度なテクニックなど) については、 GPU デリゲートのページを参照してください。

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

Android 用 TensorFlow Lite GPU デリゲートを C または C++ で使用するには、次のコード例に示すように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 用 TensorFlow Lite 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が存在しない場合、デリゲートは内部で EGLContext を作成しますが、 Interpreter::Invoke()常にInterpreter::ModifyGraphWithDelegate()呼び出されたのと同じスレッドから呼び出されるようにする必要があります。

Google Play サービスの TensorFlow Lite を使用すると:

Google Play Services C APIで TensorFlow Lite を使用している場合は、TensorFlow Lite ランタイムを初期化する前に、Java/Kotlin API を使用してデバイスで GPU デリゲートが利用可能かどうかを確認する必要があります。

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

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

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

ジャワ

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

コトリン

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 推論を使用するには、 TFLiteSettingsを使用して GPU デリゲートを作成します。

#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 デリゲート ライブラリは、デフォルトで量子化モデルをサポートします。 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 デリゲートの概要」を参照してください。