画像処理装置(GPU)を使用して機械学習(ML)モデルを実行すると、ML 対応アプリケーションのパフォーマンスとユーザー エクスペリエンスが大幅に向上します。Android デバイスでは、デリゲートと次のいずれかの API を使用して、GPU によるモデルの高速実行を有効にできます。
- Interpreter API - ガイド
- ネイティブ(C/C++)API - このガイド
このガイドでは、C API と C++ API のための GPU デリゲートの高度な使用方法と量子化モデルの使用について説明します。ベスト プラクティスや高度な手法など、TensorFlow Lite 用の GPU デリゲートの使用について詳しくは、GPU デリゲートのページをご覧ください。
GPU アクセラレーションを有効にする
次のサンプルコードに示すように、C または C++ で Android 用の TensorFlow Lite 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 向け 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
が存在し、同じ EGLContext
から Interpreter::Invoke()
を呼び出す必要があります。EGLContext
が存在しない場合、デリゲートは内部でそれを作成しますが、Interpreter::ModifyGraphWithDelegate()
が呼び出されたのと同じスレッドから Interpreter::Invoke()
が必ず呼び出されるようにする必要があります。
Google Play 開発者サービスで TensorFlow Lite を使用する場合:
Google Play 開発者サービスの 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 を初期化します。
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) }
TFLITE_USE_OPAQUE_DELEGATE
コンパイラ フラグが含まれるように CMake 設定も更新する必要があります。
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 デリゲートの概要をご覧ください。