使用图形处理单元 (GPU) 运行机器学习 (ML) 模型 可以极大地改进网站的性能和用户体验, 采用机器学习技术的应用。在 Android 设备上,您可以启用 GPU 加速 使用 delegate 和 以下 API:
- Interpreter API - 指南
- 原生 (C/C++) API - 本指南
本指南介绍了适用于 C API、C++ API 和 量化模型的使用。详细了解如何使用 GPU 委托 请参阅 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
必须从同一 EGLContext
调用线程和 Interpreter::Invoke()
。如果
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 代理概览。