Delegado de aceleración de GPU con API C/C++

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 y la experiencia del usuario de sus aplicaciones habilitadas para ML. En dispositivos Android, puede habilitar la ejecución acelerada por GPU de sus modelos mediante un delegado y una de las siguientes API:

  • API de intérprete - guía
  • API de la biblioteca de tareas: guía
  • API nativa (C/C++): esta guía

Esta guía cubre los usos avanzados del delegado de GPU para la API de C, la API de C++ y el uso de modelos cuantificados. Para obtener más información sobre el uso del delegado de GPU para TensorFlow Lite, incluidas las mejores prácticas y técnicas avanzadas, consulte la página de delegados de GPU .

Habilitar la aceleración de GPU

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 y Interpreter::Invoke() debe llamarse desde el mismo EGLContext . Si no existe un EGLContext , el delegado crea uno internamente, pero debe asegurarse de que siempre se llame a Interpreter::Invoke() 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.

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 .