Utiliser des processeurs graphiques (GPU) pour exécuter vos modèles de machine learning (ML) peut considérablement améliorer les performances et l'expérience utilisateur les applications compatibles avec le ML. Sur les appareils Android, vous pouvez activer l'exécution de vos modèles à l'aide d'un délégué et d'un autre des API suivantes:
- API Interpreter – Guide
- API native (C/C++) : ce guide
Ce guide couvre les utilisations avancées du délégué de GPU pour l'API C, l'API C++ et des modèles quantifiés. Pour en savoir plus sur l'utilisation du délégué de GPU pour LiteRT, y compris les bonnes pratiques et les techniques avancées, consultez la page GPU délégués.
Activer l'accélération GPU
Utilisez le délégué de GPU LiteRT pour Android en C ou C++ en créant le
délégué avec TfLiteGpuDelegateV2Create()
et le détruire avec
TfLiteGpuDelegateV2Delete()
, comme illustré dans l'exemple de code suivant:
// 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);
Examiner le code d'objet TfLiteGpuDelegateOptionsV2
pour créer une instance déléguée
avec des options personnalisées. Vous pouvez initialiser les options par défaut avec
TfLiteGpuDelegateOptionsV2Default()
, puis modifiez-les si nécessaire.
Le délégué de GPU LiteRT pour Android en C ou C++ utilise le Système de compilation Bazel Vous pouvez créer le délégué à l'aide du la commande suivante:
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
Lorsque vous appelez Interpreter::ModifyGraphWithDelegate()
ou
Interpreter::Invoke()
, l'appelant doit avoir un EGLContext
dans la
Le thread et Interpreter::Invoke()
doivent être appelés à partir du même EGLContext
. Si
EGLContext
n'existe pas, le délégué en crée un en interne, mais
vous devez vous assurer que Interpreter::Invoke()
est toujours appelé à partir du même
thread dans lequel Interpreter::ModifyGraphWithDelegate()
a été appelé.
Avec LiteRT dans les services Google Play:
Si vous utilisez LiteRT dans l'API C des services Google Play, vous devez utiliser l'API Java/Kotlin pour vérifier si un délégué de GPU est disponible pour votre appareil avant d'initialiser l'environnement d'exécution LiteRT.
Ajoutez les dépendances Gradle déléguées par le GPU à votre application:
implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'
Vérifiez ensuite la disponibilité du GPU et initialisez TfLiteNative si la vérification est réussi:
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) }
Vous devez également mettre à jour votre configuration CMake pour y inclure le
Indicateur de compilation TFLITE_USE_OPAQUE_DELEGATE
:
add_compile_definitions(TFLITE_USE_OPAQUE_DELEGATE)
La bibliothèque FlatBuffers permet de configurer
délégué. Vous devez donc l'ajouter aux dépendances de votre code natif.
Vous pouvez utiliser la configuration de projet CMake
officielle comme suit:
target_include_directories(tflite-jni PUBLIC
third_party/headers # flatbuffers
...)
Vous pouvez également simplement regrouper les en-têtes dans votre application.
Enfin, pour utiliser l'inférence GPU dans votre code C, créez le délégué de GPU à l'aide de
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);
Modèles quantifiés
Par défaut, les bibliothèques déléguées de GPU Android sont compatibles avec les modèles quantifiés. Vous ne devez pas n'avez pas besoin de modifier le code pour utiliser des modèles quantifiés avec le délégué de GPU. La La section suivante explique comment désactiver la prise en charge quantifiée pour les tests ou à des fins expérimentales.
Désactiver la compatibilité avec les modèles quantifiés
Le code suivant montre comment désactiver la prise en charge des modèles quantifiés.
C++
TfLiteGpuDelegateOptionsV2 options = TfLiteGpuDelegateOptionsV2Default(); options.experimental_flags = TFLITE_GPU_EXPERIMENTAL_FLAGS_NONE; auto* delegate = TfLiteGpuDelegateV2Create(options); if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
Pour en savoir plus sur l'exécution de modèles quantifiés avec l'accélération GPU, consultez Présentation de la délégué de GPU.