GPU 加速委派與 C/C++ API

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

  • Interpreter API - 指南
  • Task library 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() 初始化預設選項,然後視需要修改這些選項。

Android 版 TensorFlow Lite GPU 委派在 C 或 C++ 中使用 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::Invoke() 永遠是從呼叫 Interpreter::ModifyGraphWithDelegate() 的同一個執行緒呼叫。

搭配 Google Play 服務中的 TensorFlow Lite

如果您使用的是 Google Play 服務 C API 中的 TensorFlow Lite,則需要使用 Java/Kotlin API 來檢查您的裝置是否有 GPU 委派可用,才能初始化 TensorFlow Lite 執行階段。

將 GPU 委派 Gradle 依附元件新增至您的應用程式

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

然後,檢查 GPU 可用性,並在檢查成功時初始化 TfLiteNative

Java

Task 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 委派總覽。