使用 C/C++ API 的 GPU 加速委派

使用圖形處理器 (GPU) 執行機器學習 (ML) 模型 大幅改善產品效能和使用者體驗 支援機器學習的應用程式在 Android 裝置上,您可以啟用 GPU 加速功能 使用委派和 下列 API:

  • 解譯器 API - 指南
  • 原生 (C/C++) API - 本指南

本指南說明 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 不存在,委派項目會在內部建立一個,但 您必須確保 Interpreter::Invoke() 一律會從 呼叫 Interpreter::ModifyGraphWithDelegate() 的執行緒。

使用 Google Play 服務的 LiteRT:

如果您是在 Google Play 服務 C API 中使用 LiteRT, 您需要使用 Java/Kotlin API 檢查是否可用 GPU 委派 才能初始化 LiteRT 執行階段。

將 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 推論功能,請使用 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 委派程式庫預設支援量化模型。你不需要 變更任何程式碼,才能搭配 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 委派總覽。