Delegado de aceleração de GPU com API C/C++

O uso de unidades de processamento gráfico (GPUs) para executar seus modelos de aprendizado de máquina (ML) pode melhorar drasticamente o desempenho e a experiência do usuário de seus aplicativos habilitados para ML. Em dispositivos Android, você pode habilitar a execução acelerada por GPU de seus modelos usando um delegado e uma das seguintes APIs:

  • API do intérprete - guia
  • API da biblioteca de tarefas - guia
  • API nativa (C/C++) - este guia

Este guia aborda usos avançados do delegado de GPU para API C, API C++ e uso de modelos quantizados. Para obter mais informações sobre como usar o delegado de GPU para TensorFlow Lite, incluindo práticas recomendadas e técnicas avançadas, consulte a página de delegados de GPU .

Ativar aceleração de GPU

Use o delegado de GPU do TensorFlow Lite para Android em C ou C++ criando o delegado com TfLiteGpuDelegateV2Create() e destruindo-o com TfLiteGpuDelegateV2Delete() , conforme mostrado no código de exemplo a seguir:

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

Examine o código de objeto TfLiteGpuDelegateOptionsV2 para criar uma instância delegada com opções personalizadas. Você pode inicializar as opções padrão com TfLiteGpuDelegateOptionsV2Default() e modificá-las conforme necessário.

O delegado de GPU do TensorFlow Lite para Android em C ou C++ usa o sistema de compilação Bazel . Você pode criar o delegado usando o seguinte 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

Ao chamar Interpreter::ModifyGraphWithDelegate() ou Interpreter::Invoke() , o responsável pela chamada deve ter um EGLContext no encadeamento atual e Interpreter::Invoke() deve ser chamado a partir do mesmo EGLContext . Se um EGLContext não existir, o delegado criará um internamente, mas você deverá garantir que Interpreter::Invoke() seja sempre chamado a partir do mesmo encadeamento no qual Interpreter::ModifyGraphWithDelegate() foi chamado.

modelos quantizados

As bibliotecas delegadas de GPU do Android oferecem suporte a modelos quantizados por padrão. Você não precisa fazer nenhuma alteração de código para usar modelos quantizados com o delegado de GPU. A seção a seguir explica como desativar o suporte quantizado para fins de teste ou experimentais.

Desativar o suporte ao modelo quantizado

O código a seguir mostra como desabilitar o suporte para modelos quantizados.

C++

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

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

Para obter mais informações sobre a execução de modelos quantizados com aceleração de GPU, consulte visão geral do delegado de GPU .