Como usar unidades de processamento gráfico (GPUs) para executar modelos de machine learning (ML) pode melhorar drasticamente o desempenho e a experiência do usuário do seu os aplicativos habilitados para ML. Em dispositivos Android, é possível ativar a execução dos seus modelos usando um delegado e um das seguintes APIs:
- API Interpreter: guia
- API Native (C/C++): este guia
Este guia aborda os usos avançados do delegado da GPU para a API C, a API C++ e e uso de modelos quantizados. Para mais informações sobre como usar o delegado da GPU para LiteRT, incluindo práticas recomendadas e técnicas avançadas, consulte a GPU delegados.
Ativar aceleração de GPU
Use o delegado da GPU LiteRT para Android em C ou C++ criando a
delegar com TfLiteGpuDelegateV2Create()
e destruí-lo com
TfLiteGpuDelegateV2Delete()
, conforme mostrado no seguinte código de exemplo:
// 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 o código de objeto TfLiteGpuDelegateOptionsV2
para criar uma instância delegada
com opções personalizadas. É possível inicializar as opções padrão com
TfLiteGpuDelegateOptionsV2Default()
e faça as modificações necessárias.
O delegado da GPU LiteRT para Android em C ou C++ usa a Bazel (em inglês). 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 autor da chamada precisa ter um EGLContext
na
linha de execução e Interpreter::Invoke()
precisam ser chamados no mesmo EGLContext
. Se
não existir um EGLContext
, o delegado criará um internamente, mas
é necessário garantir que Interpreter::Invoke()
seja sempre chamado do mesmo
linha de execução em que Interpreter::ModifyGraphWithDelegate()
foi chamado.
Com o LiteRT no Google Play Services:
Se você usa o LiteRT na API C do Google Play Services: use a API Java/Kotlin para verificar se há um delegado da GPU disponível para seu dispositivo antes de inicializar o ambiente de execução LiteRT.
Adicione as dependências do Gradle do delegado da GPU ao aplicativo:
implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'
Em seguida, verifique a disponibilidade da GPU e inicialize TfLiteNative se a verificação for bem-sucedido:
Java
Task<Void> 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) }
Também é necessário atualizar a configuração do CMake para incluir o
Sinalização do compilador TFLITE_USE_OPAQUE_DELEGATE
:
add_compile_definitions(TFLITE_USE_OPAQUE_DELEGATE)
A biblioteca FlatBuffers é usada para configurar
delegue plug-ins, portanto, será necessário adicioná-los às dependências do seu código nativo.
Você pode usar a configuração oficial do projeto CMake
da seguinte maneira:
target_include_directories(tflite-jni PUBLIC
third_party/headers # flatbuffers
...)
Você também pode simplesmente agrupar os cabeçalhos no seu aplicativo.
Por fim, para usar a inferência de GPU no seu código C, crie o delegado de GPU usando
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);
Modelos quantizados
As bibliotecas de delegação de GPU do Android oferecem suporte a modelos quantizados por padrão. Você não precisará fazer alterações no código para usar modelos quantizados com o delegado da GPU. A seção a seguir explica como desativar o suporte quantizado para testes ou para fins experimentais.
Desativar o suporte a modelos quantizados
O código a seguir mostra como desativar o suporte a 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 mais informações sobre como executar modelos quantizados com aceleração de GPU, consulte Visão geral do delegado da GPU.