O Dia da Comunidade de ML é dia 9 de novembro! Junte-nos para atualização de TensorFlow, JAX, e mais Saiba mais

Delegado TensorFlow Lite NNAPI

A Android Neural Networks API (NNAPI) está disponível em todos os dispositivos Android que executam o Android 8.1 (API de nível 27) ou superior. Ele fornece aceleração para modelos TensorFlow Lite em dispositivos Android com aceleradores de hardware compatíveis, incluindo:

  • Unidade de processamento gráfico (GPU)
  • Processador de sinal digital (DSP)
  • Unidade de processamento neural (NPU)

O desempenho irá variar dependendo do hardware específico disponível no dispositivo.

Esta página descreve como usar o delegado NNAPI com o TensorFlow Lite Interpreter em Java e Kotlin. Para APIs Android C, consulte a documentação do Android Native Developer Kit .

Experimentando o delegado NNAPI em seu próprio modelo

Importação do Gradle

O delegado NNAPI faz parte do interpretador TensorFlow Lite Android, versão 1.14.0 ou superior. Você pode importá-lo para o seu projeto adicionando o seguinte ao arquivo do módulo gradle:

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

Inicializando o delegado NNAPI

Adicione o código para inicializar o delegado NNAPI antes de inicializar o interpretador TensorFlow Lite.

import org.tensorflow.lite.Interpreter;
import org.tensorflow.lite.nnapi.NnApiDelegate;

Interpreter.Options options = (new Interpreter.Options());
NnApiDelegate nnApiDelegate = null;
// Initialize interpreter with NNAPI delegate for Android Pie or above
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    nnApiDelegate = new NnApiDelegate();
    options.addDelegate(nnApiDelegate);
}

// Initialize TFLite interpreter
try {
    tfLite = new Interpreter(loadModelFile(assetManager, modelFilename), options);
} catch (Exception e) {
    throw new RuntimeException(e);
}

// Run inference
// ...

// Unload delegate
tfLite.close();
if(null != nnApiDelegate) {
    nnApiDelegate.close();
}

Melhores Práticas

Teste o desempenho antes de implantar

O desempenho do tempo de execução pode variar significativamente devido à arquitetura do modelo, tamanho, operações, disponibilidade de hardware e utilização de hardware de tempo de execução. Por exemplo, se um aplicativo utiliza muito a GPU para renderização, a aceleração NNAPI pode não melhorar o desempenho devido à contenção de recursos. Recomendamos executar um teste de desempenho simples usando o registrador de depuração para medir o tempo de inferência. Execute o teste em vários telefones com chipsets diferentes (fabricante ou modelos do mesmo fabricante) que são representativos de sua base de usuários antes de habilitar o NNAPI na produção.

Para desenvolvedores avançados, o TensorFlow Lite também oferece uma ferramenta de referência de modelo para Android .

Crie uma lista de exclusão de dispositivos

Na produção, pode haver casos em que a NNAPI não funciona conforme o esperado. Recomendamos que os desenvolvedores mantenham uma lista de dispositivos que não devem usar a aceleração NNAPI em combinação com modelos específicos. Você pode criar essa lista com base no valor de "ro.board.platform" , que pode ser recuperada usando o seguinte snippet de código:

String boardPlatform = "";

try {
    Process sysProcess =
        new ProcessBuilder("/system/bin/getprop", "ro.board.platform").
        redirectErrorStream(true).start();

    BufferedReader reader = new BufferedReader
        (new InputStreamReader(sysProcess.getInputStream()));
    String currentLine = null;

    while ((currentLine=reader.readLine()) != null){
        boardPlatform = line;
    }
    sysProcess.destroy();
} catch (IOException e) {}

Log.d("Board Platform", boardPlatform);

Para desenvolvedores avançados, considere manter esta lista por meio de um sistema de configuração remoto. A equipe do TensorFlow está trabalhando ativamente em maneiras de simplificar e automatizar a descoberta e a aplicação da configuração NNAPI ideal.

Quantização

A quantização reduz o tamanho do modelo usando números inteiros de 8 bits ou flutuações de 16 bits em vez de flutuações de 32 bits para computação. Os tamanhos do modelo inteiro de 8 bits são um quarto das versões flutuantes de 32 bits; Os flutuadores de 16 bits têm metade do tamanho. A quantização pode melhorar o desempenho significativamente, embora o processo possa comprometer a precisão do modelo.

Existem vários tipos de técnicas de quantização pós-treinamento disponíveis, mas, para máximo suporte e aceleração no hardware atual, recomendamos a quantização inteira completa . Essa abordagem converte o peso e as operações em inteiros. Este processo de quantização requer um conjunto de dados representativo para funcionar.

Use modelos e operações compatíveis

Se o delegado NNAPI não oferece suporte a algumas das operações ou combinações de parâmetros em um modelo, a estrutura executa apenas as partes com suporte do gráfico no acelerador. O restante é executado na CPU, o que resulta em execução dividida. Devido ao alto custo de sincronização CPU / acelerador, isso pode resultar em desempenho mais lento do que executar toda a rede somente na CPU.

O NNAPI tem melhor desempenho quando os modelos usam apenas operações com suporte . Os seguintes modelos são conhecidos por serem compatíveis com NNAPI:

A aceleração NNAPI também não é suportada quando o modelo contém saídas dimensionadas dinamicamente. Nesse caso, você receberá um aviso como:

ERROR: Attempting to use a delegate that only supports static-sized tensors \
with a graph that has dynamic-sized tensors.

Habilitar implementação de CPU NNAPI

Um gráfico que não pode ser processado completamente por um acelerador pode recorrer à implementação de CPU NNAPI. No entanto, como normalmente tem menos desempenho do que o interpretador TensorFlow, essa opção é desabilitada por padrão no delegado NNAPI para Android 10 (API de nível 29) ou superior. Para substituir esse comportamento, defina setUseNnapiCpu como true no objeto NnApiDelegate.Options .