Delegato di accelerazione GPU per Android

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

L'utilizzo di unità di elaborazione grafica (GPU) per eseguire i modelli di machine learning (ML) può migliorare notevolmente le prestazioni del modello e l'esperienza utente delle applicazioni abilitate per ML. Sui dispositivi Android, puoi abilitare l'uso dell'esecuzione con accelerazione GPU dei tuoi modelli utilizzando un delegato . I delegati fungono da driver hardware per TensorFlow Lite, consentendoti di eseguire il codice del tuo modello su processori GPU.

Questa pagina descrive come abilitare l'accelerazione GPU per i modelli TensorFlow Lite nelle app Android. Per ulteriori informazioni sull'utilizzo del delegato GPU per TensorFlow Lite, comprese le best practice e le tecniche avanzate, vedere la pagina dei delegati GPU .

Usa la GPU con le API della libreria delle attività

Le librerie di attività di TensorFlow Lite forniscono una serie di API specifiche per attività per la creazione di applicazioni di machine learning. Questa sezione descrive come utilizzare il delegato dell'acceleratore GPU con queste API.

Aggiungi le dipendenze del progetto

Consenti l'accesso alle API delegate della GPU con le librerie di attività TensorFlow Lite aggiungendo le seguenti dipendenze, aggiorna il file build.gradle dei progetti di sviluppo per includere il tensorflow-lite-gpu-delegate-plugin come mostrato nell'esempio di codice seguente:

dependencies {
  ...
  implementation 'org.tensorflow:tensorflow-lite-gpu-delegate-plugin'
}

Abilita accelerazione GPU

Abilita l'opzione del delegato GPU per la classe del modello dell'API Task con la classe BaseOptions . Ad esempio, puoi configurare la GPU in ObjectDetector come mostrato nei seguenti esempi di codice:

Kotlin

    import org.tensorflow.lite.task.core.BaseOptions
    import org.tensorflow.lite.task.gms.vision.detector.ObjectDetector

    val baseOptions = BaseOptions.builder().useGpu().build()

    val options =
        ObjectDetector.ObjectDetectorOptions.builder()
            .setBaseOptions(baseOptions)
            .setMaxResults(1)
            .build()

    val objectDetector = ObjectDetector.createFromFileAndOptions(
      context, model, options)

      

Giava

    import org.tensorflow.lite.task.core.BaseOptions
    import org.tensorflow.lite.task.gms.vision.detector.ObjectDetector

    BaseOptions baseOptions = BaseOptions.builder().useGpu().build();

    ObjectDetectorOptions options =
        ObjectDetectorOptions.builder()
            .setBaseOptions(baseOptions)
            .setMaxResults(1)
            .build();

    val objectDetector = ObjectDetector.createFromFileAndOptions(
      context, model, options);
      

Usa la GPU con l'API interprete

L' API dell'interprete TensorFlow Lite fornisce una serie di API generiche per la creazione di applicazioni di machine learning. Questa sezione descrive come utilizzare il delegato dell'acceleratore GPU con queste API.

Aggiungi le dipendenze del progetto

Consenti l'accesso alle API delegate della GPU aggiungendo le seguenti dipendenze, aggiorna il file build.gradle dei tuoi progetti di sviluppo per includere il org.tensorflow:tensorflow-lite-gpu come mostrato nel seguente esempio di codice:

dependencies {
    ...
    implementation 'org.tensorflow:tensorflow-lite'
    implementation 'org.tensorflow:tensorflow-lite-gpu'
}

Abilita accelerazione GPU

Quindi esegui TensorFlow Lite su GPU con TfLiteDelegate . In Java, puoi specificare GpuDelegate tramite Interpreter.Options .

Kotlin

    import org.tensorflow.lite.Interpreter
    import org.tensorflow.lite.gpu.CompatibilityList
    import org.tensorflow.lite.gpu.GpuDelegate

    val compatList = CompatibilityList()

    val options = Interpreter.Options().apply{
        if(compatList.isDelegateSupportedOnThisDevice){
            // if the device has a supported GPU, add the GPU delegate
            val delegateOptions = compatList.bestOptionsForThisDevice
            this.addDelegate(GpuDelegate(delegateOptions))
        } else {
            // if the GPU is not supported, run on 4 threads
            this.setNumThreads(4)
        }
    }

    val interpreter = Interpreter(model, options)

    // Run inference
    writeToInput(input)
    interpreter.run(input, output)
    readFromOutput(output)
      

Giava

    import org.tensorflow.lite.Interpreter;
    import org.tensorflow.lite.gpu.CompatibilityList;
    import org.tensorflow.lite.gpu.GpuDelegate;

    // Initialize interpreter with GPU delegate
    Interpreter.Options options = new Interpreter.Options();
    CompatibilityList compatList = CompatibilityList();

    if(compatList.isDelegateSupportedOnThisDevice()){
        // if the device has a supported GPU, add the GPU delegate
        GpuDelegate.Options delegateOptions = compatList.getBestOptionsForThisDevice();
        GpuDelegate gpuDelegate = new GpuDelegate(delegateOptions);
        options.addDelegate(gpuDelegate);
    } else {
        // if the GPU is not supported, run on 4 threads
        options.setNumThreads(4);
    }

    Interpreter interpreter = new Interpreter(model, options);

    // Run inference
    writeToInput(input);
    interpreter.run(input, output);
    readFromOutput(output);
      

Il delegato GPU può essere usato anche con l'associazione del modello ML in Android Studio. Per ulteriori informazioni, consulta Generare interfacce di modello utilizzando i metadati .

Supporto GPU avanzato

Questa sezione illustra gli usi avanzati del delegato GPU per Android, tra cui l'API C, l'API C++ e l'uso di modelli quantizzati.

API C/C++ per Android

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

// 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 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() .

Modelli quantizzati

Le librerie dei delegati GPU Android supportano i modelli quantizzati per impostazione predefinita. Non è necessario apportare modifiche al codice per utilizzare i 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.

Giava

GpuDelegate delegate = new GpuDelegate(new GpuDelegate.Options().setQuantizedModelsAllowed(false));

Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
      

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 dei delegati GPU .