使用圖形處理單元 (GPU) 執行機器學習 (ML) 模型可以大幅改善 ML 應用程式的效能和使用者體驗。在 Android 裝置上,您可以使用 委派 和下列其中一個 API,啟用模型的 GPU 加速執行
本指南涵蓋 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
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 委派總覽。