Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tensorflow
GitHub Repository: tensorflow/docs-l10n
Path: blob/master/site/pt-br/lite/performance/measurement.md
25118 views

Medição de desempenho

Ferramentas de benchmarking

No momento, as ferramentas de benchmarking do TensorFlow Lite medem e calculam estatísticas para as seguintes métricas de desempenho importantes:

  • Tempo de inicialização

  • Tempo de inferência do estado de warmup

  • Tempo de inferência do estado estacionário

  • Uso da memória durante o tempo de inicialização

  • Uso geral da memória

As ferramentas de benchmarking estão disponíveis como aplicativos de benchmarking para Android e iOS e como binários de linha de comando nativos, e todas elas compartilham a mesma lógica de medição de desempenho principal. Observe que as opções e os formatos de saída disponíveis são um pouco diferentes devido às diferenças no ambiente de runtime.

Aplicativo de benchmarking do Android

Há duas opções para usar a ferramenta de benchmarking com o Android. Uma é um binário de benchmarking nativo e a outra é um aplicativo de benchmarking do Android, um medidor melhor do desempenho do modelo no aplicativo. De qualquer forma, os números da ferramenta de benchmarking ainda diferem um pouco de quando a inferência é executada com o modelo no próprio aplicativo.

Esse aplicativo de benchmarking do Android não tem interface do usuário. Instale e execute usando o comando adb e recupere os resultados usando o comando adb logcat.

Baixe ou compile o aplicativo

Baixe os aplicativos de benchmarking do Android pré-criados e noturnos usando os links abaixo:

Para os aplicativos de benchmarking do Android compatíveis com ops do TF pelo delegado Flex, use os links abaixo:

Você também pode compilar o aplicativo do código-fonte seguindo estas instruções.

Observação: é necessário compilar o aplicativo do código-fonte se você quiser executar o APK de benchmarking do Android na CPU x86 ou no delegado Hexagon ou se o modelo tiver determinados operadores do TF ou operadores personalizados.

Prepare o benchmarking

Antes de executar o aplicativo de benchmarking, instale o aplicativo e envie o arquivo do modelo ao dispositivo da seguinte maneira:

adb install -r -d -g android_aarch64_benchmark_model.apk adb push your_model.tflite /data/local/tmp

Execute o benchmarking

adb shell am start -S \ -n org.tensorflow.lite.benchmark/.BenchmarkModelActivity \ --es args '"--graph=/data/local/tmp/your_model.tflite \ --num_threads=4"'

graph é um parâmetro obrigatório.

  • graph: string
    O caminho para o arquivo do modelo do TFLite.

Você pode especificar mais parâmetros opcionais para executar o benchmarking.

  • num_threads: int (default=1)
    O número de threads que devem ser usados ao executar o interpretador do TFLite.

  • use_gpu: bool (default=false)
    Use o delegado de GPU.

  • use_nnapi: bool (default=false)
    Use o delegado NNAPI.

  • use_xnnpack: bool (default=false)
    Use o delegado XNNPACK.

  • use_hexagon: bool (default=false)
    Use o delegado Hexagon.

Dependendo do dispositivo usado, algumas dessas opções podem não estar disponíveis ou não fazer nenhum efeito. Consulte mais parâmetros desempenho de que você pode executar com o aplicativo de benchmarking.

Veja os resultados usando o comando logcat:

adb logcat | grep "Inference timings"

Os resultados de benchmarking são relatados assim:

... tflite : Inference timings in us: Init: 5685, First inference: 18535, Warmup (avg): 14462.3, Inference (avg): 14575.2

Biblioteca de benchmarking nativa

A ferramenta de benchmarking também é fornecida como um benchmark_model de binário nativo. Você pode executar essa ferramenta a partir de uma linha de comando de shell em Linux, Mac, dispositivos embarcados e dispositivos Android.

Baixe ou compile o binário

Baixe os binários de linha de comando nativos pré-criados e noturnos usando os links abaixo:

Para os binários pré-criados e noturnos que são compatíveis com ops do TF pelo delegado Flex, use os links abaixo:

Para fazer o benchmarking com o delegado Hexagon do TensorFlow Lite, também pré-criamos os arquivos libhexagon_interface.so necessários (veja aqui mais detalhes sobre esse arquivo). Depois de baixar o arquivo da plataforma correspondente pelos links abaixo, renomeie-o como libhexagon_interface.so.

Você também pode compilar o binário de benchmarking nativo a partir do código-fonte no seu computador.

bazel build -c opt //tensorflow/lite/tools/benchmark:benchmark_model

Para compilar com a toolchain do Android NDK, você precisa configurar o ambiente de build primeiro ao seguir este guia ou usar a imagem docker conforme descrito neste guia.

bazel build -c opt --config=android_arm64 \ //tensorflow/lite/tools/benchmark:benchmark_model

Observação: é uma abordagem válida enviar e executar binários diretamente em um dispositivo Android para benchmarking, mas pode resultar em diferenças sutis (mas observáveis) no desempenho relativo à execução dentro de um aplicativo Android real. Em especial, o agendador do Android ajusta o comportamento com base nas prioridades de thread e processo, que diferem de uma atividade/aplicativo em primeiro plano e um binário em segundo plano regular executado pelo adb shell .... Esse comportamento ajustado é mais evidente ao permitir a execução de CPU de vários threads com o TensorFlow Lite. Por isso, o aplicativo de benchmarking do Android é recomendado para a medição de desempenho.

Execute o benchmarking

Para executar o benchmarking no seu computador, execute o binário no shell.

path/to/downloaded_or_built/benchmark_model \ --graph=your_model.tflite \ --num_threads=4

Você pode usar o mesmo conjunto de parâmetros conforme mencionado acima com o binário de linha de comando nativo.

Análise de perfil das ops do modelo

O binário do modelo de benchmarking também permite que você analise as ops do modelo e obtenha os tempos de execução de cada operador. Para fazer isso, passe a flag --enable_op_profiling=true a benchmark_model durante a invocação. Os detalhes são explicados aqui.

Binário de benchmarking nativo para várias opções de desempenho em uma única execução

Um binário C++ conveniente e simples também é fornecido para o benchmarking de várias opções de desempenho em uma única execução. Esse binário é criado com base na ferramenta de benchmarking mencionada acima que só pode fazer o benchmarking de uma única opção de desempenho por vez. Eles compartilham o mesmo processo de build/instalação/execução, mas o nome de destino do BUILD desse binário é benchmark_model_performance_options e exige alguns parâmetros adicionais. Um parâmetro importante para esse binário é:

perf_options_list: string (default='all')
Uma lista separada por vírgulas das opções de desempenho do TFLite para o benchmarking.

Você pode obter binários pré-criados noturnos para essa ferramenta conforme listado abaixo:

Aplicativo de benchmarking do iOS

Para realizar o benchmarking em um dispositivo iOS, você precisa compilar o aplicativo do código-fonte. Coloque o arquivo do modelo do TensorFlow Lite no diretório benchmark_data da árvore de código-fonte e modifique o arquivo benchmark_params.json. Esses arquivos são empacotados no aplicativo e o aplicativo lê os dados do diretório. Acesse o aplicativo de benchmarking do iOS para instruções detalhadas.

Benchmarks de desempenho para modelos conhecidos

Esta seção lista benchmarks de desempenho do TensorFlow ao executar modelos conhecidos em alguns dispositivos Android e iOS.

Benchmarks de desempenho do Android

Esses números de benchmarking de desempenho foram gerados com o binário de benchmarking nativo.

Para benchmarks do Android, a afinidade de CPU é definida para usar big cores no dispositivo para reduzir a variância (veja mais detalhes).

Ela supõe que os modelos foram baixados e descompactados no diretório /data/local/tmp/tflite_models. O binário de benchmark é criado usando estas instruções e se supõe que esteja no diretório /data/local/tmp.

Para realizar o benchmark:

adb shell /data/local/tmp/benchmark_model \ --num_threads=4 \ --graph=/data/local/tmp/tflite_models/${GRAPH} \ --warmup_runs=1 \ --num_runs=50

Para executar com o delegado NNAPI, defina --use_nnapi=true. Para executar com o delegado de GPU, defina --use_gpu=true.

Os valores de desempenho abaixo são medidos no Android 10.

Nome do modelo Dispositivo CPU, 4 threads GPU NNAPI
Mobilenet_1.0_224(float) Pixel 3 23,9 ms 6,45 ms 13,8 ms
Pixel 4 14,0 ms 9,0 ms 14,8 ms
Mobilenet_1.0_224 (quant) Pixel 3 13,4 ms --- 6,0 ms
Pixel 4 5,0 ms --- 3,2 ms
NASNet mobile Pixel 3 56 ms --- 102 ms
Pixel 4 34,5 ms --- 99,0 ms
SqueezeNet Pixel 3 35,8 ms 9,5 ms 18,5 ms
Pixel 4 23,9 ms 11,1 ms 19,0 ms
Inception_ResNet_V2 Pixel 3 422 ms 99,8 ms 201 ms
Pixel 4 272,6 ms 87,2 ms 171,1 ms
Inception_V4 Pixel 3 486 ms 93 ms 292 ms
Pixel 4 324,1 ms 97,6 ms 186,9 ms

Benchmarks de desempenho do iOS

Esses números de benchmarking de desempenho foram gerados com o aplicativo de benchmarking do iOS.

Para realizar os benchmarks do iOS, o aplicativo foi modificado para incluir o modelo apropriado e benchmark_params.json foi modificado para definir o num_threads como 2. Para usar o delegado de GPU, as opções "use_gpu" : "1" e "gpu_wait_type" : "aggressive" foram adicionadas a benchmark_params.json.

Nome do modelo Dispositivo CPU, 2 threads GPU
Mobilenet_1.0_224(float) iPhone XS 14,8 ms 3,4 ms
Mobilenet_1.0_224 (quant) iPhone XS 11 ms ---
NASNet mobile iPhone XS 30,4 ms ---
SqueezeNet iPhone XS 21,1 ms 15,5 ms
Inception_ResNet_V2 iPhone XS 261,1 ms 45,7 ms
Inception_V4 iPhone XS 309 ms 54,4 ms

Rastreie internals do TensorFlow Lite

Rastreie internals do TensorFlow Lite no Android

Observação: esse recurso está disponível a partir do TensorFlow Lite v2.4.

Os eventos internos do interpretador do TensorFlow Lite de um aplicativo Android podem ser capturados por ferramentas de tracing do Android. Eles são os mesmos eventos com a API Trace do Android, então os eventos capturados do código Java/Kotlin são vistos juntos com os eventos internos do TensorFlow Lite.

Alguns exemplos de eventos são:

  • Invocação de operador

  • Modificação de grafo por delegado

  • Alocação de tensor

Entre as diferentes opções de captura de traces, este guia aborda o Android Studio CPU Profiler e o aplicativo System Tracing. Consulte a ferramenta de linha de comando Perfetto ou a ferramenta de linha de comando Systrace para mais opções.

Adicionando eventos de trace em código Java

Este é uma amostra de código do aplicativo de exemplo de Classificação de imagens. O interpretador do TensorFlow Lite é executado na seção recognizeImage/runInference. Essa etapa é opcional, mas é útil para ajudar a perceber onde é realizada a chamada de inferência.

Trace.beginSection("recognizeImage"); ... // Runs the inference call. Trace.beginSection("runInference"); tflite.run(inputImageBuffer.getBuffer(), outputProbabilityBuffer.getBuffer().rewind()); Trace.endSection(); ... Trace.endSection();

Ative o tracing do TensorFlow Lite

Para ativar o tracing do TensorFlow Lite, defina a propriedade debug.tflite.trace do sistema Android como 1
antes de iniciar o aplicativo Android.

adb shell setprop debug.tflite.trace 1

Se essa propriedade for definida com o interpretador do TensorFlow inicializado, serão rastreados os principais eventos (por exemplo, invocação de operador) do interpretador.

Depois de capturar todos os traces, desative o tracing ao definir o valor da propriedade como 0.

adb shell setprop debug.tflite.trace 0

Android Studio CPU Profiler

Capture traces com o Android Studio CPU Profiler ao seguir as etapas abaixo:

  1. Selecione Run > Profile 'app' (Executar > Fazer o profiling do aplicativo) nos menus superiores.

  2. Clique em qualquer lugar na linha do tempo da CPU quando aparecer a janela do Profiler.

  3. Selecione "Trace System Calls" (Rastrear chamadas do sistema) entre os modos de profiling da CPU.

    Selecione 'Trace System Calls'

  4. Pressione o botão "Record" (Gravar).

  5. Pressione o botão "Stop" (Parar).

  6. Investigue o resultado do tracing.

    Trace do Android Studio

Nesse exemplo, você pode ver a hierarquia dos eventos em um thread e as estatísticas para cada tempo do operador, além de conferir o fluxo dos dados do aplicativo inteiro entre os threads.

Aplicativo System Tracing

Capture traces sem o Android Studio ao seguir as etapas detalhadas no aplicativo System Tracing.

Nesse exemplo, os mesmos eventos do TFLite foram capturados e salvos no formato Perfetto ou Systrace dependendo da versão do dispositivo Android. Os arquivos dos traces capturados podem ser abertos na interface de usuário Perfetto.

Trace Perfetto

Rastreie internals do TensorFlow Lite no iOS

Observação: esse recurso está disponível a partir do TensorFlow Lite v2.5.

Os eventos internos do interpretador do TensorFlow Lite de um aplicativo iOS podem ser capturados pela ferramenta Instruments incluída com Xcode. Eles são os eventos signpost do iOS, então os eventos capturados do código Swift/Objective-C são vistos juntos com os eventos internos do TensorFlow Lite.

Alguns exemplos de eventos são:

  • Invocação de operador

  • Modificação de grafo por delegado

  • Alocação de tensor

Ative o tracing do TensorFlow Lite

Defina a variável de ambiente debug.tflite.trace seguindo as etapas abaixo:

  1. Selecione Product > Scheme > Edit Scheme... (Produto > Esquema > Editar esquema...) nos menus superiores do Xcode.

  2. Clique em "Profile" (Perfil) no painel à esquerda.

  3. Desmarque a caixa de seleção "Use the Run action's arguments and environment variables" (Usar os argumentos e as variáveis de ambiente da ação de execução).

  4. Adicione debug.tflite.trace à seção "Environment Variables" (Variáveis de ambiente).

    Defina a variável de ambiente

Se você quiser excluir os eventos do TensorFlow Lite ao analisar o perfil do aplicativo iOS, desative o tracing ao remover a variável de ambiente.

Instruments do XCode

Capture traces seguindo as etapas abaixo:

  1. Selecione Product > Profile (Produto > Perfil) nos menus superiores do Xcode.

  2. Clique em Logging nos modelos de profiling quando a ferramenta Instruments for inicializada.

  3. Pressione o botão "Start" (Iniciar).

  4. Pressione o botão "Stop" (Parar).

  5. Clique em "os_signpost" para abrir os itens do subsistema de registros do SO.

  6. Clique no subsistema de registros do SO "org.tensorflow.lite".

  7. Investigue o resultado do tracing.

    Trace do Instruments do Xcode

Nesse exemplo, você pode ver a hierarquia de eventos e as estatísticas para cada tempo do operador.

Usando os dados de tracing

Os dados de tracing permitem que você identifique os gargalos de desempenho.

Veja alguns exemplos de insights que você pode obter do profiler e possíveis soluções para melhorar o desempenho:

  • Se o número de núcleos de CPU disponíveis for menor do que o número de threads de inferência, então a sobrecarga do agendamento da CPU pode levar a um desempenho inferior. Você pode reagendar outras tarefas intensivas da CPU no seu aplicativo para evitar a sobreposição com a inferência do seu modelo ou ajustar o número de threads do interpretador.

  • Se os operadores não forem totalmente delegados, algumas partes do grafo do modelo são executas na CPU, em vez do acelerador de hardware esperado. Você pode substituir os operadores incompatíveis por operadores compatíveis semelhantes.