Delegado de aceleración GPU para Android

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

El uso de unidades de procesamiento de gráficos (GPU) para ejecutar sus modelos de aprendizaje automático (ML) puede mejorar drásticamente el rendimiento de su modelo y la experiencia del usuario de sus aplicaciones habilitadas para ML. En los dispositivos Android, puede habilitar el uso de la ejecución acelerada por GPU de sus modelos mediante un delegado . Los delegados actúan como controladores de hardware para TensorFlow Lite, lo que le permite ejecutar el código de su modelo en procesadores GPU.

Esta página describe cómo habilitar la aceleración de GPU para los modelos TensorFlow Lite en las aplicaciones de Android. Para obtener más información sobre el uso del delegado de GPU para TensorFlow Lite, incluidas las prácticas recomendadas y las técnicas avanzadas, consulte la página de delegados de GPU .

Usar GPU con las API de la biblioteca de tareas

Las bibliotecas de tareas de TensorFlow Lite proporcionan un conjunto de API específicas de tareas para crear aplicaciones de aprendizaje automático. Esta sección describe cómo usar el delegado del acelerador de GPU con estas API.

Agregar dependencias del proyecto

Habilite el acceso a las API delegadas de GPU con las bibliotecas de tareas de TensorFlow Lite agregando las siguientes dependencias, actualice el archivo build.gradle de sus proyectos de desarrollo para incluir el tensorflow-lite-gpu-delegate-plugin como se muestra en el siguiente código de ejemplo:

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

Habilitar la aceleración de GPU

Habilite la opción de delegado de GPU para su clase de modelo de API de tareas con la clase BaseOptions . Por ejemplo, puede configurar GPU en ObjectDetector como se muestra en los siguientes ejemplos de código:

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)

      

Java

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

Usar GPU con API de intérprete

La API de intérprete de TensorFlow Lite proporciona un conjunto de API de uso general para crear aplicaciones de aprendizaje automático. Esta sección describe cómo usar el delegado del acelerador de GPU con estas API.

Agregar dependencias del proyecto

Habilite el acceso a las API delegadas de GPU agregando las siguientes dependencias, actualice el archivo build.gradle de sus proyectos de desarrollo para incluir el org.tensorflow:tensorflow-lite-gpu como se muestra en el siguiente código de ejemplo:

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

Habilitar la aceleración de GPU

Luego ejecute TensorFlow Lite en GPU con TfLiteDelegate . En Java, puede especificar el GpuDelegate a través de 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)
      

Java

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

El delegado de GPU también se puede usar con el enlace de modelos ML en Android Studio. Para obtener más información, consulte Generar interfaces de modelo mediante metadatos .

Compatibilidad con GPU avanzada

Esta sección cubre los usos avanzados del delegado de GPU para Android, incluida la API de C, la API de C++ y el uso de modelos cuantificados.

API de C/C++ para Android

Usa el delegado GPU de TensorFlow Lite para Android en C o C++ creando el delegado con TfLiteGpuDelegateV2Create() y destruyéndolo con TfLiteGpuDelegateV2Delete() , como se muestra en el siguiente código de ejemplo:

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

Revise el código de objeto TfLiteGpuDelegateOptionsV2 para crear una instancia de delegado con opciones personalizadas. Puede inicializar las opciones predeterminadas con TfLiteGpuDelegateOptionsV2Default() y luego modificarlas según sea necesario.

El delegado de GPU TensorFlow Lite para Android en C o C++ usa el sistema de compilación Bazel . Puede construir el delegado usando el siguiente comando:

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

Al llamar a Interpreter::ModifyGraphWithDelegate() o Interpreter::Invoke() , la persona que llama debe tener un EGLContext en el subproceso actual e Interpreter::Invoke() debe llamarse desde el mismo EGLContext . Si no existe un EGLContext , el delegado crea uno internamente, pero luego debe asegurarse de que Interpreter::Invoke() siempre se llame desde el mismo subproceso en el que se llamó a Interpreter::ModifyGraphWithDelegate() .

modelos cuantificados

Las bibliotecas de delegados de GPU de Android admiten modelos cuantificados de forma predeterminada. No tiene que realizar ningún cambio de código para usar modelos cuantificados con el delegado de GPU. La siguiente sección explica cómo deshabilitar el soporte cuantificado para fines de prueba o experimentales.

Deshabilitar el soporte de modelo cuantificado

El siguiente código muestra cómo deshabilitar la compatibilidad con modelos cuantificados.

Java

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;
      

Para obtener más información sobre cómo ejecutar modelos cuantificados con aceleración de GPU, consulte Información general sobre delegados de GPU .