使用图形处理单元 (GPU) 运行机器学习 (ML) 模型可以显着提高机器学习支持的应用程序的性能和用户体验。在 Android 设备上,您可以使用 委托 和以下 API 之一启用模型的 GPU 加速执行
本指南介绍了 GPU 委托在 C API、C++ API 和量化模型使用方面的进阶用法。有关使用 TensorFlow Lite GPU 委托的更多信息,包括最佳实践和高级技术,请参阅 GPU 委托 页面。
启用 GPU 加速
使用 TensorFlow Lite GPU 委托在 Android 上的 C 或 C++ 中,通过使用 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 上的 C 或 C++ 中的 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
TasktfLiteHandleTask = 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 代理概述。