Ferramentas de comparativo de mercado
No momento, as ferramentas de comparativo de mercado do LiteRT medem e calculam estatísticas para as seguintes métricas de desempenho importantes:
- Tempo de inicialização
- Tempo de inferência do estado de aquecimento
- Tempo de inferência do estado constante
- Uso da memória durante a inicialização
- Uso geral da memória
As ferramentas de comparativo de mercado estão disponíveis como apps para Android e iOS e como binários de linha de comando pré-criados. Todas compartilham a mesma lógica principal de medição de performance. As opções disponíveis e os formatos de saída são um pouco diferentes devido às diferenças no ambiente de execução.
Binário de comparativo pré-criado (usando a API CompiledModel)
Há duas opções de usar a ferramenta de comparativo de mercado com o Android. Um é um binário de comparativo de mercado nativo (baseado na API CompiledModel) e outro é um app de comparativo de mercado do Android (baseado na API Interpreter). A ferramenta de comparativo de mercado do LiteRT é fornecida como um binário integrado
benchmark_model. É possível executar essa ferramenta em uma linha de comando do shell no Linux, macOS, Windows, Raspberry Pi, dispositivos incorporados e dispositivos Android com aceleração de GPU ativada.
Baixar ou criar o binário
Faça o download dos binários de linha de comando pré-criados noturnos seguindo os links abaixo:
Também é possível criar o binário de comparativo de mercado da fonte no seu computador.
bazel build -c opt //litert/tools:benchmark_model
Para criar com o conjunto de ferramentas do NDK do Android, primeiro configure o ambiente de build seguindo este guia ou use a imagem do Docker conforme descrito neste guia.
bazel build -c opt --config=android_arm64 \
//litert/tools:benchmark_model
Executar comparativo de mercado
Para executar comparativos de mercado no seu computador, execute o binário no shell.
path/to/downloaded_or_built/benchmark_model \
--graph=your_model.tflite \
--num_threads=4
É possível usar o mesmo conjunto de parâmetros mencionado anteriormente com o binário de linha de comando pré-criado.
Acelerador de GPU
Esses binários pré-criados incluem o novo acelerador de GPU LiteRT. Ele é compatível com OpenCL e WebGPU com suporte de Vulkan (Linux), Metal (MacOS) e Direct3D (Windows).
Para usar o acelerador de GPU, transmita a flag --use_gpu=true.
Criar perfil das operações de modelo
O binário do modelo de comparativo de mercado também permite criar perfis de operações de modelo e receber os tempos de execução de cada operador. Para fazer isso, transmita a flag
--use_profiler=true para benchmark_model durante a invocação.
App de comparativo de mercado do Android (usando a API Interpreter)
Um app de comparativo de mercado do Android baseado na API Interpreter v1 também é fornecido. Essa é uma medida melhor de como o modelo funcionaria em um app Android. Os números da ferramenta de comparativo de mercado ainda vão ser um pouco diferentes de quando a inferência é executada com o modelo no app real.
Este app de comparativo de mercado para Android não tem interface. Instale e execute usando o comando adb
e recupere os resultados usando o comando adb logcat.
Baixar ou criar o app
Faça o download dos apps de comparativo de mercado do Android pré-criados noturnos usando os links a seguir:
Para apps de comparativo de mercado do Android que oferecem suporte a operações do TF via delegado flexível, use os links abaixo:
Você também pode criar o app da fonte seguindo estas instruções.
Preparar comparativo de mercado
Antes de executar o app de comparativo, instale o app e envie o arquivo do modelo para o dispositivo da seguinte maneira:
adb install -r -d -g android_aarch64_benchmark_model.apk
adb push your_model.tflite /data/local/tmp
Executar comparativo de mercado
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 TFLite.
Você pode especificar mais parâmetros opcionais para executar o comparativo.
num_threads:int(padrão=1)
O número de linhas de execução a serem usadas para executar o interpretador do TFLite.use_gpu:bool(padrão=false)
Use o delegado de GPU.use_xnnpack:bool(padrão=false)
Use delegado XNNPACK.
Dependendo do dispositivo que você está usando, algumas dessas opções podem não estar disponíveis ou não ter efeito. Consulte parâmetros para mais parâmetros de performance que podem ser executados com o app de comparativo.
Confira os resultados usando o comando logcat:
adb logcat | grep "Inference timings"
Os resultados da comparação são informados como:
... tflite : Inference timings in us: Init: 5685, First inference: 18535, Warmup (avg): 14462.3, Inference (avg): 14575.2
App de comparativo para iOS
Para executar comparativos de mercado em um dispositivo iOS, é necessário criar o app com base na fonte.
Coloque o arquivo do modelo LiteRT no diretório benchmark_data da árvore de origem e modifique o arquivo benchmark_params.json. Esses
arquivos são empacotados no app, e ele lê os dados do diretório. Acesse
o
app de comparativo de mercado do iOS
para instruções detalhadas.
Comparativos de mercado sobre performance para modelos conhecidos
Esta seção lista comparativos de performance do LiteRT ao executar modelos conhecidos em alguns dispositivos Android e iOS.
Comparativos de mercado de desempenho do Android
Esses números de comparativo de mercado de desempenho foram gerados com o binário de comparativo de mercado nativo.
Para comparativos de Android, a afinidade da CPU é definida para usar núcleos grandes no dispositivo e reduzir a variância (consulte detalhes).
Ele pressupõe que os modelos foram baixados e descompactados no diretório /data/local/tmp/tflite_models. O binário de comparativo de mercado é criado usando
estas instruções
e presumido estar no diretório /data/local/tmp.
Para executar o comparativo de mercado:
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 de GPU, defina --use_gpu=true.
Os valores de desempenho abaixo são medidos no Android 10.
| Nome do modelo | Dispositivo | CPU, 4 linhas de execução | GPU |
|---|---|---|---|
| Mobilenet_1.0_224(float) | Pixel 3 | 23,9 ms | 6,45 ms |
| Pixel 4 | 14,0 ms | 9,0 ms | |
| Mobilenet_1.0_224 (quant) | Pixel 3 | 13,4 ms | --- |
| Pixel 4 | 5,0 ms | --- | |
| NASNet mobile | Pixel 3 | 56 ms | --- |
| Pixel 4 | 34,5 ms | --- | |
| SqueezeNet | Pixel 3 | 35,8 ms | 9,5 ms |
| Pixel 4 | 23,9 ms | 11,1 ms | |
| Inception_ResNet_V2 | Pixel 3 | 422 ms | 99,8 ms |
| Pixel 4 | 272,6 ms | 87,2 ms | |
| Inception_V4 | Pixel 3 | 486 ms | 93 ms |
| Pixel 4 | 324,1 ms | 97,6 ms |
Comparativos de mercado de performance do iOS
Esses números de comparativo de mercado de desempenho foram gerados com o app de comparativo de mercado do iOS.
Para executar comparativos de iOS, o app de comparativo foi modificado para incluir o modelo adequado, e benchmark_params.json foi modificado para definir num_threads como 2. Para usar
o delegado de GPU, as opções "use_gpu" : "1" e "gpu_wait_type" : "aggressive"
também foram adicionadas a benchmark_params.json.
| Nome do modelo | Dispositivo | CPU, 2 linhas de execução | 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 |
Trace LiteRT internals
Rastrear elementos internos do LiteRT no Android
Eventos internos do interpretador LiteRT de um app Android podem ser capturados por ferramentas de rastreamento do Android. São os mesmos eventos da API Trace do Android. Portanto, os eventos capturados do código Java/Kotlin são vistos junto com os eventos internos do LiteRT.
Alguns exemplos de eventos:
- Invocação do operador
- Modificação de gráfico por delegado
- Alocação de tensor
Entre as diferentes opções de captura de rastros, este guia aborda o criador de perfil de CPU do Android Studio e o app Rastreamento do sistema. Consulte a ferramenta de linha de comando Perfetto ou a ferramenta de linha de comando Systrace para outras opções.
Como adicionar eventos de rastreamento no código Java
Este é um snippet de código do app de exemplo
Classificação de imagens. O intérprete do LiteRT é executado na seção
recognizeImage/runInference. Essa etapa é opcional, mas é útil para
ajudar a notar onde a chamada de inferência é feita.
Trace.beginSection("recognizeImage");
...
// Runs the inference call.
Trace.beginSection("runInference");
tflite.run(inputImageBuffer.getBuffer(), outputProbabilityBuffer.getBuffer().rewind());
Trace.endSection();
...
Trace.endSection();
Ativar o rastreamento do LiteRT
Para ativar o rastreamento do LiteRT, defina a propriedade do sistema Android
debug.tflite.trace como 1 antes de iniciar o app Android.
adb shell setprop debug.tflite.trace 1
Se essa propriedade tiver sido definida quando o interpretador LiteRT for inicializado, os eventos principais (por exemplo, invocação de operador) do interpretador serão rastreados.
Depois de capturar todos os rastreamentos, desative-os definindo o valor da propriedade como 0.
adb shell setprop debug.tflite.trace 0
CPU Profiler do Android Studio
Capture rastreamentos com o criador de perfil de CPU do Android Studio seguindo as etapas abaixo:
Selecione Executar > Criar perfil do "app" nos menus da parte de cima.
Clique em qualquer lugar da linha do tempo da CPU quando a janela do Profiler aparecer.
Selecione "Rastrear chamadas do sistema" entre os modos de criação de perfil da CPU.

Pressione o botão "Gravar".
Pressione o botão "Parar".
Investigue o resultado do rastreamento.

Neste exemplo, é possível conferir a hierarquia de eventos em uma linha de execução e as estatísticas de cada tempo de operador, além do fluxo de dados de todo o app entre linhas de execução.
App Rastreamento do sistema
Capture rastros sem o Android Studio seguindo as etapas detalhadas no app System Tracing.
Neste exemplo, os mesmos eventos do TFLite foram capturados e salvos no formato do Perfetto ou do Systrace, dependendo da versão do dispositivo Android. Os arquivos de rastreamento capturados podem ser abertos na interface do Perfetto.

Rastrear elementos internos do LiteRT no iOS
Os eventos internos do interpretador LiteRT de um app iOS podem ser capturados pela ferramenta Instruments incluída no Xcode. Eles são os eventos de signpost do iOS, então os eventos capturados do código Swift/Objective-C são vistos junto com os eventos internos do LiteRT.
Alguns exemplos de eventos:
- Invocação do operador
- Modificação de gráfico por delegado
- Alocação de tensor
Ativar o rastreamento do LiteRT
Defina a variável de ambiente debug.tflite.trace seguindo as etapas abaixo:
Selecione Product > Scheme > Edit Scheme… nos menus da parte de cima do Xcode.
Clique em "Perfil" no painel à esquerda.
Desmarque a caixa de seleção "Usar os argumentos e as variáveis de ambiente da ação de execução".
Adicione
debug.tflite.tracena seção "Variáveis de ambiente".
Se você quiser excluir eventos do LiteRT ao criar o perfil do app iOS, desative o rastreamento removendo a variável de ambiente.
Instrumentos do Xcode
Para capturar rastreamentos, siga as etapas abaixo:
Selecione Produto > Perfil nos menus da parte de cima do Xcode.
Clique em Logging entre os modelos de criação de perfil quando a ferramenta Instruments for lançada.
Pressione o botão "Iniciar".
Pressione o botão "Parar".
Clique em "os_signpost" para abrir os itens do subsistema de geração de registros do SO.
Clique no subsistema de geração de registros do SO "org.tensorflow.lite".
Investigue o resultado do rastreamento.

Neste exemplo, você pode ver a hierarquia de eventos e estatísticas para cada período do operador.
Como usar os dados de rastreamento
Com os dados de rastreamento, é possível identificar gargalos de desempenho.
Confira alguns exemplos de insights que você pode receber do criador de perfil e possíveis soluções para melhorar o desempenho:
- Se o número de núcleos de CPU disponíveis for menor que o número de threads de inferência, o overhead de programação da CPU poderá levar a uma performance abaixo do ideal. É possível reagendar outras tarefas com uso intenso da CPU no aplicativo para evitar a sobreposição com a inferência do modelo ou ajustar o número de linhas de execução do intérprete.
- Se os operadores não forem totalmente delegados, algumas partes do gráfico do modelo serão executadas na CPU em vez do acelerador de hardware esperado. Você pode substituir os operadores não compatíveis por outros semelhantes que são aceitos.