Serviço de aceleração para Android (Beta)

O uso de processadores especializados, como GPUs, NPUs ou DSPs para aceleração de hardware, pode melhorar drasticamente o desempenho de inferência (inferência até 10 vezes mais rápida em alguns casos) e a experiência do usuário de seu aplicativo Android habilitado para ML. No entanto, dada a variedade de hardware e drivers que seus usuários podem ter, escolher a configuração de aceleração de hardware ideal para o dispositivo de cada usuário pode ser um desafio. Além disso, habilitar a configuração errada em um dispositivo pode criar uma experiência ruim para o usuário devido à alta latência ou, em alguns casos raros, erros de tempo de execução ou problemas de precisão causados ​​por incompatibilidades de hardware.

Acceleration Service for Android é uma API que ajuda você a escolher a configuração de aceleração de hardware ideal para um determinado dispositivo de usuário e seu modelo .tflite , minimizando o risco de erros de tempo de execução ou problemas de precisão.

O Acceleration Service avalia diferentes configurações de aceleração em dispositivos de usuários executando benchmarks de inferência internos com seu modelo TensorFlow Lite. Essas execuções de teste geralmente são concluídas em alguns segundos, dependendo do seu modelo. Você pode executar os benchmarks uma vez em cada dispositivo do usuário antes do tempo de inferência, armazenar em cache o resultado e usá-lo durante a inferência. Esses benchmarks são executados fora do processo; o que minimiza o risco de falhas no seu aplicativo.

Forneça seu modelo, amostras de dados e resultados esperados (entradas e saídas "douradas") e o Acceleration Service executará um benchmark de inferência TFLite interno para fornecer recomendações de hardware.

imagem

O Acceleration Service faz parte da pilha de ML personalizada do Android e funciona com o TensorFlow Lite nos serviços do Google Play .

Adicione as dependências ao seu projeto

Adicione as seguintes dependências ao arquivo build.gradle de seu aplicativo:

implementation  "com.google.android.gms:play-services-tflite-
acceleration-service:16.0.0-beta01"

A API do serviço de aceleração funciona com o TensorFlow Lite no Google Play Services . Se você ainda não estiver usando o tempo de execução do TensorFlow Lite fornecido por meio do Play Services, será necessário atualizar suas dependências .

Como usar a API de serviço de aceleração

Para usar o Acceleration Service, comece criando a configuração de aceleração que deseja avaliar para seu modelo (por exemplo, GPU com OpenGL). Em seguida, crie uma configuração de validação com seu modelo, alguns dados de amostra e a saída esperada do modelo. Por fim, chame validateConfig() ao passar sua configuração de aceleração e configuração de validação.

imagem

Criar configurações de aceleração

As configurações de aceleração são representações das configurações de hardware que são traduzidas em delegados durante o tempo de execução. O serviço de aceleração usará essas configurações internamente para realizar inferências de teste.

No momento, o serviço de aceleração permite avaliar as configurações de GPU (convertidas em GPU delegate durante o tempo de execução) com GpuAccelerationConfig e inferência de CPU (com CpuAccelerationConfig ). Estamos trabalhando para oferecer suporte a mais delegados para acessar outro hardware no futuro.

Configuração de aceleração de GPU

Crie uma configuração de aceleração de GPU da seguinte forma:

AccelerationConfig accelerationConfig = new GpuAccelerationConfig.Builder()
  .setEnableQuantizedInference(false)
  .build();

Você deve especificar se seu modelo está ou não usando quantização com setEnableQuantizedInference() .

Configuração de aceleração da CPU

Crie a aceleração da CPU da seguinte forma:

AccelerationConfig accelerationConfig = new CpuAccelerationConfig.Builder()
  .setNumThreads(2)
  .build();

Use o método setNumThreads() para definir o número de encadeamentos que deseja usar para avaliar a inferência da CPU.

Criar configurações de validação

As configurações de validação permitem que você defina como deseja que o Acceleration Service avalie as inferências. Você os usará para passar:

  • amostras de entrada,
  • saídas esperadas,
  • lógica de validação de precisão.

Certifique-se de fornecer amostras de entrada para as quais você espera um bom desempenho de seu modelo (também conhecidas como amostras “douradas”).

Crie um ValidationConfig com CustomValidationConfig.Builder da seguinte forma:

ValidationConfig validationConfig = new CustomValidationConfig.Builder()
   .setBatchSize(5)
   .setGoldenInputs(inputs)
   .setGoldenOutputs(outputBuffer)
   .setAccuracyValidator(new MyCustomAccuracyValidator())
   .build();

Especifique o número de amostras de ouro com setBatchSize() . Passe as entradas de suas amostras de ouro usando setGoldenInputs() . Forneça a saída esperada para a entrada passada com setGoldenOutputs() .

Você pode definir um tempo máximo de inferência com setInferenceTimeoutMillis() (5000 ms por padrão). Se a inferência demorar mais do que o tempo definido, a configuração será rejeitada.

Opcionalmente, você também pode criar um AccuracyValidator personalizado da seguinte forma:

class MyCustomAccuracyValidator implements AccuracyValidator {
   boolean validate(
      BenchmarkResult benchmarkResult,
      ByteBuffer[] goldenOutput) {
        for (int i = 0; i < benchmarkResult.actualOutput().size(); i++) {
            if (!goldenOutputs[i]
               .equals(benchmarkResult.actualOutput().get(i).getValue())) {
               return false;
            }
         }
         return true;

   }
}

Certifique-se de definir uma lógica de validação que funcione para o seu caso de uso.

Observe que, se os dados de validação já estiverem incorporados em seu modelo, você poderá usar EmbeddedValidationConfig .

Gerar saídas de validação

As saídas de ouro são opcionais e, desde que você forneça entradas de ouro, o Serviço de Aceleração pode gerar internamente as saídas de ouro. Você também pode definir a configuração de aceleração usada para gerar essas saídas douradas chamando setGoldenConfig() :

ValidationConfig validationConfig = new CustomValidationConfig.Builder()
   .setBatchSize(5)
   .setGoldenInputs(inputs)
   .setGoldenConfig(customCpuAccelerationConfig)
   [...]
   .build();

Validar configuração de aceleração

Depois de criar uma configuração de aceleração e uma configuração de validação, você pode avaliá-los para o seu modelo.

Verifique se o tempo de execução do TensorFlow Lite com Play Services foi inicializado corretamente e se o delegado da GPU está disponível para o dispositivo executando:

TfLiteGpu.isGpuDelegateAvailable(context)
   .onSuccessTask(gpuAvailable -> TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(gpuAvailable)
        .build()
      )
   );

Crie uma instância do AccelerationService chamando AccelerationService.create() .

Em seguida, você pode validar sua configuração de aceleração para seu modelo chamando validateConfig() :

InterpreterApi interpreter;
InterpreterOptions interpreterOptions = InterpreterApi.Options();
AccelerationService.create(context)
   .validateConfig(model, accelerationConfig, validationConfig)
   .addOnSuccessListener(validatedConfig -> {
      if (validatedConfig.isValid() && validatedConfig.benchmarkResult().hasPassedAccuracyTest()) {
         interpreterOptions.setAccelerationConfig(validatedConfig);
         interpreter = InterpreterApi.create(model, interpreterOptions);
});

Você também pode validar várias configurações chamando validateConfigs() e passando um objeto Iterable<AccelerationConfig> como um parâmetro.

validateConfig() retornará um Task< ValidatedAccelerationConfigResult > da API de tarefas do Google Play Services que permite tarefas assíncronas.
Para obter o resultado da chamada de validação, adicione um callback addOnSuccessListener() .

Use a configuração validada em seu interpretador

Depois de verificar se o ValidatedAccelerationConfigResult retornado no retorno de chamada é válido, você pode definir a configuração validada como uma configuração de aceleração para seu interpretador chamando interpreterOptions.setAccelerationConfig() .

Cache de configuração

É improvável que a configuração de aceleração ideal para o seu modelo mude no dispositivo. Portanto, depois de receber uma configuração de aceleração satisfatória, você deve armazená-la no dispositivo e permitir que seu aplicativo a recupere e use-a para criar suas InterpreterOptions durante as sessões seguintes, em vez de executar outra validação. Os métodos serialize() e deserialize() em ValidatedAccelerationConfigResult facilitam o processo de armazenamento e recuperação.

Aplicação de amostra

Para revisar uma integração in-situ do Acceleration Service, dê uma olhada no aplicativo de amostra .

Limitações

O Serviço de Aceleração tem as seguintes limitações atuais:

  • Apenas configurações de aceleração de CPU e GPU são suportadas no momento,
  • Ele oferece suporte apenas ao TensorFlow Lite nos serviços do Google Play e você não pode usá-lo se estiver usando a versão integrada do TensorFlow Lite,
  • Ele não oferece suporte à biblioteca de tarefas do TensorFlow Lite, pois não é possível inicializar BaseOptions diretamente com o objeto ValidatedAccelerationConfigResult .
  • O Acceleration Service SDK oferece suporte apenas para API de nível 22 e superior.

Ressalvas

Revise as seguintes advertências com atenção, especialmente se estiver planejando usar este SDK em produção:

  • Antes de sair do Beta e liberar a versão estável para a API do Acceleration Service, publicaremos um novo SDK que pode ter algumas diferenças em relação ao Beta atual. Para continuar usando o Acceleration Service, você precisará migrar para este novo SDK e enviar uma atualização para seu aplicativo em tempo hábil. Não fazer isso pode causar quebras, pois o Beta SDK pode não ser mais compatível com os serviços do Google Play após algum tempo.

  • Não há garantia de que um recurso específico da API do Serviço de Aceleração ou da API como um todo se tornará disponível para todos. Ele pode permanecer em Beta indefinidamente, ser desativado ou combinado com outros recursos em pacotes projetados para públicos específicos de desenvolvedores. Alguns recursos com a API do Serviço de Aceleração ou toda a própria API podem eventualmente se tornar disponíveis ao público em geral, mas não há um cronograma fixo para isso.

Termos e privacidade

Termos de serviço

O uso das APIs do Serviço de Aceleração está sujeito aos Termos de Serviço das APIs do Google .
Além disso, as APIs do Serviço de Aceleração estão atualmente em versão beta e, como tal, ao usá-las, você reconhece os possíveis problemas descritos na seção Advertências acima e reconhece que o Serviço de Aceleração pode nem sempre funcionar conforme especificado.

Privacidade

Quando você usa as APIs do serviço de aceleração, o processamento dos dados de entrada (por exemplo, imagens, vídeo, texto) ocorre totalmente no dispositivo, e o serviço de aceleração não envia esses dados para os servidores do Google . Como resultado, você pode usar nossas APIs para processar dados de entrada que não devem sair do dispositivo.
As APIs do serviço de aceleração podem entrar em contato com os servidores do Google de tempos em tempos para receber coisas como correções de bugs, modelos atualizados e informações de compatibilidade do acelerador de hardware. As APIs do Acceleration Service também enviam métricas sobre o desempenho e a utilização das APIs em seu aplicativo para o Google. O Google usa esses dados de métricas para medir o desempenho, depurar, manter e melhorar as APIs e detectar uso indevido ou abuso, conforme descrito em nossa Política de Privacidade .
Você é responsável por informar os usuários de seu aplicativo sobre o processamento dos dados de métricas do Serviço de Aceleração pelo Google, conforme exigido pela lei aplicável.
Os dados que coletamos incluem o seguinte:

  • Informações do dispositivo (como fabricante, modelo, versão e compilação do sistema operacional) e aceleradores de hardware ML disponíveis (GPU e DSP). Usado para diagnóstico e análise de uso.
  • Informações do aplicativo (nome do pacote / ID do pacote, versão do aplicativo). Usado para diagnóstico e análise de uso.
  • Configuração da API (como formato e resolução da imagem). Usado para diagnóstico e análise de uso.
  • Tipo de evento (como inicializar, baixar modelo, atualizar, executar, detecção). Usado para diagnóstico e análise de uso.
  • Códigos de erro. Usado para diagnósticos.
  • Métricas de desempenho. Usado para diagnósticos.
  • Identificadores por instalação que não identificam exclusivamente um usuário ou dispositivo físico. Usado para operação de configuração remota e análise de uso.
  • Endereços IP do remetente da solicitação de rede. Usado para diagnósticos de configuração remota. Os endereços IP coletados são retidos temporariamente.

Suporte e comentários

Você pode fornecer feedback e obter suporte por meio do rastreador de problemas do TensorFlow. Relate problemas e solicitações de suporte usando o modelo de problema do TensorFlow Lite nos serviços do Google Play.