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

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

  • 解譯 API - 指南
  • Native (C/C++) API - 本指南

本指南說明 C API 和 C++ API 的 GPU 委派進階用途,以及量化模型的使用方式。如要進一步瞭解如何使用 TensorFlow Lite 的 GPU 委派功能 (包括最佳做法和進階技術),請參閱 GPU 委派頁面。

啟用 GPU 加速功能

在 C 或 C++ 中使用 TfLiteGpuDelegateV2Create() 建立委派,並使用 TfLiteGpuDelegateV2Delete() 將其刪除,以在 C 或 C++ 中使用適用於 Android 的 TensorFlow Lite GPU 委派功能,如以下範例程式碼所示:

// 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 不存在,委派項目會在內部建立一個,但您必須確保系統一律從呼叫 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)
    }
        

您也需要更新 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 委派總覽。