Grafikprozessoren (Graphics Processing Units, GPUs) zum Ausführen Ihrer Modelle für maschinelles Lernen (ML) verwenden die Leistung und Nutzererfahrung Ihrer Anzeigen erheblich verbessern, ML-fähige Anwendungen Auf Android-Geräten können Sie Ausführung Ihrer Modelle mit einem Delegierten und einem der folgenden APIs:
- Interpreter API – Leitfaden
- Native (C/C++) API - dieser Leitfaden
In diesem Leitfaden wird die erweiterte Verwendung des GPU-Delegaten für die C API, die C++ API und quantisierten Modellen nutzen. Weitere Informationen zur Verwendung des GPU-Delegaten für LiteRT, einschließlich Best Practices und fortgeschrittener Techniken, siehe GPU Seite „Bevollmächtigte“.
GPU-Beschleunigung aktivieren
Verwenden Sie den LiteRT GPU-Delegaten für Android in C oder C++, indem Sie die Methode
mit TfLiteGpuDelegateV2Create()
delegieren und zerstören mit
TfLiteGpuDelegateV2Delete()
, wie im folgenden Beispielcode gezeigt:
// 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
-Objektcode prüfen, um eine delegierte Instanz zu erstellen
mit benutzerdefinierten Optionen. Sie können die Standardoptionen mit
TfLiteGpuDelegateOptionsV2Default()
und ändern Sie sie nach Bedarf.
Der LiteRT GPU-Delegate für Android in C oder C++ verwendet den Bazel-Build-System Sie können den Delegaten mithilfe der Methode folgenden Befehl:
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
Beim Aufrufen von Interpreter::ModifyGraphWithDelegate()
oder
Interpreter::Invoke()
, für den Aufrufer muss eine EGLContext
im aktuellen
Thread und Interpreter::Invoke()
müssen vom selben EGLContext
aus aufgerufen werden. Wenn
EGLContext
nicht vorhanden ist, erstellt der Bevollmächtigte intern ein solches, aber dann
müssen Sie darauf achten, dass Interpreter::Invoke()
immer vom selben
Thread, in dem Interpreter::ModifyGraphWithDelegate()
aufgerufen wurde.
Mit LiteRT in den Google Play-Diensten:
Wenn Sie LiteRT in der C API der Google Play Services verwenden, Sie müssen mit der Java/Kotlin API prüfen, ob ein GPU-Delegierung verfügbar ist. vor der Initialisierung der LiteRT-Laufzeit für Ihr Gerät.
Fügen Sie Ihrer Anwendung die Gradle-Abhängigkeiten des GPU-Delegaten hinzu:
implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'
Prüfen Sie dann die GPU-Verfügbarkeit und initialisieren Sie TfLiteNative, wenn die Prüfung erfolgreich:
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) }
Außerdem müssen Sie die CMake-Konfiguration aktualisieren, um den Parameter
Compiler-Flag TFLITE_USE_OPAQUE_DELEGATE
:
add_compile_definitions(TFLITE_USE_OPAQUE_DELEGATE)
Mit der Bibliothek FlatBuffers
Delegieren von Plug-ins, sodass Sie es den Abhängigkeiten Ihres nativen Codes hinzufügen müssen.
Sie können die offizielle CMake
-Projektkonfiguration so verwenden:
target_include_directories(tflite-jni PUBLIC
third_party/headers # flatbuffers
...)
Sie können die Header auch einfach in Ihrer App bündeln.
Um die GPU-Inferenz in Ihrem C-Code zu verwenden, erstellen Sie den
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);
Quantisierte Modelle
Android GPU Delegate-Bibliotheken unterstützen standardmäßig quantisierte Modelle. Du nicht Änderungen am Code vornehmen, um quantisierte Modelle mit dem GPU-Delegaten zu verwenden. Die Im folgenden Abschnitt wird erläutert, wie Sie die quantisierte Unterstützung für Tests oder zu experimentellen Zwecken.
Unterstützung quantisierter Modelle deaktivieren
Der folgende Code zeigt, wie Sie die Unterstützung für quantisierte Modelle deaktivieren.
C++
TfLiteGpuDelegateOptionsV2 options = TfLiteGpuDelegateOptionsV2Default(); options.experimental_flags = TFLITE_GPU_EXPERIMENTAL_FLAGS_NONE; auto* delegate = TfLiteGpuDelegateV2Create(options); if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
Weitere Informationen zum Ausführen quantisierter Modelle mit GPU-Beschleunigung finden Sie unter GPU Delegate