Delegato dell'accelerazione GPU con API C/C++

L'utilizzo di unità di elaborazione grafica (GPU) per eseguire i modelli di machine learning (ML) può migliorare notevolmente le prestazioni e l'esperienza utente delle tue applicazioni abilitate per ML. Sui dispositivi Android, puoi abilitare l'esecuzione accelerata dalla GPU dei tuoi modelli utilizzando un delegato e una delle seguenti API:

  • API interprete - guida
  • API della libreria attività - guida
  • API nativa (C/C++): questa guida

Questa guida illustra gli usi avanzati del delegato GPU per l'API C, l'API C++ e l'uso di modelli quantizzati. Per ulteriori informazioni sull'utilizzo del delegato GPU per TensorFlow Lite, incluse best practice e tecniche avanzate, consulta la pagina dei delegati GPU .

Abilita l'accelerazione GPU

Utilizza il delegato GPU TensorFlow Lite per Android in C o C++ creando il delegato con TfLiteGpuDelegateV2Create() ed distruggendolo con TfLiteGpuDelegateV2Delete() , come mostrato nel seguente codice di esempio:

// 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);

Esaminare il codice oggetto TfLiteGpuDelegateOptionsV2 per creare un'istanza del delegato con opzioni personalizzate. È possibile inizializzare le opzioni predefinite con TfLiteGpuDelegateOptionsV2Default() e quindi modificarle secondo necessità.

Il delegato GPU TensorFlow Lite per Android in C o C++ utilizza il sistema di build Bazel . È possibile creare il delegato utilizzando il comando seguente:

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

Quando si chiama Interpreter::ModifyGraphWithDelegate() o Interpreter::Invoke() , il chiamante deve avere un EGLContext nel thread corrente e Interpreter::Invoke() deve essere chiamato dallo stesso EGLContext . Se un EGLContext non esiste, il delegato ne crea uno internamente, ma è necessario assicurarsi che Interpreter::Invoke() venga sempre chiamato dallo stesso thread in cui è stato chiamato Interpreter::ModifyGraphWithDelegate() .

Con TensorFlow Lite in Google Play Services:

Se utilizzi TensorFlow Lite nell'API C di Google Play Services, dovrai utilizzare l'API Java/Kotlin per verificare se è disponibile un delegato GPU per il tuo dispositivo prima di inizializzare il runtime TensorFlow Lite.

Aggiungi le dipendenze del grado del delegato GPU alla tua applicazione:

implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'

Quindi, controlla la disponibilità della GPU e inizializza TfLiteNative se il controllo ha esito positivo:

Giava

Task 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)
    }
        

È inoltre necessario aggiornare la configurazione di CMake per includere il flag del compilatore TFLITE_USE_OPAQUE_DELEGATE :

add_compile_definitions(TFLITE_USE_OPAQUE_DELEGATE)

La libreria FlatBuffers viene utilizzata per configurare i plug-in delegati, quindi è necessario aggiungerla alle dipendenze del codice nativo. Puoi utilizzare la configurazione ufficiale del progetto CMake come segue:

target_include_directories(tflite-jni PUBLIC
        third_party/headers # flatbuffers
     ...)

Puoi anche semplicemente raggruppare le intestazioni nella tua app.

Infine, per utilizzare l'inferenza GPU nel codice C, crea il delegato GPU utilizzando 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);

Modelli quantizzati

Le librerie dei delegati GPU Android supportano i modelli quantizzati per impostazione predefinita. Non è necessario apportare modifiche al codice per utilizzare modelli quantizzati con il delegato GPU. La sezione seguente spiega come disabilitare il supporto quantizzato per scopi di test o sperimentali.

Disabilita il supporto del modello quantizzato

Il codice seguente mostra come disabilitare il supporto per i modelli quantizzati.

C++

TfLiteGpuDelegateOptionsV2 options = TfLiteGpuDelegateOptionsV2Default();
options.experimental_flags = TFLITE_GPU_EXPERIMENTAL_FLAGS_NONE;

auto* delegate = TfLiteGpuDelegateV2Create(options);
if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
      

Per ulteriori informazioni sull'esecuzione di modelli quantizzati con accelerazione GPU, vedere Panoramica del delegato GPU .