使用 C/C++ API 的 GPU 加速代理

使用图形处理单元 (GPU) 运行机器学习 (ML) 模型可以显著提高支持机器学习的应用的性能和用户体验。在 Android 设备上,您可以使用委托和以下 API 之一来启用由 GPU 加速的模型执行方式:

  • Explainer 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,则需要使用 Java/Kotlin API 检查 GPU 代理是否适用于您的设备,然后再初始化 TensorFlow Lite 运行时。

将 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 代理概览。