Práticas recomendadas de performance

Dispositivos móveis e incorporados têm recursos computacionais limitados. Por isso, é importante manter a eficiência de recursos do aplicativo. Compilamos uma lista de práticas recomendadas e estratégias que você pode usar para melhorar a performance do modelo do TensorFlow Lite.

Escolha o melhor modelo para a tarefa

Dependendo da tarefa, é necessário fazer uma troca entre a complexidade e o tamanho do modelo. Se a tarefa exigir alta precisão, talvez seja necessário um modelo grande e complexo. Para tarefas que exigem menos precisão, é melhor usar um modelo menor, porque eles não apenas usam menos espaço em disco e memória, mas também são geralmente mais rápidos e eficientes em termos de energia. Por exemplo, os gráficos abaixo mostram compensações de acurácia e latência para alguns modelos comuns de classificação de imagens.

Gráfico de tamanho do modelo x acurácia

Gráfico de acurácia x latência

Um exemplo de modelos otimizados para dispositivos móveis são as MobileNets, que são otimizadas para aplicativos de visão móvel. O Kaggle Models lista vários outros modelos otimizados especificamente para dispositivos móveis e incorporados.

É possível treinar novamente os modelos listados no seu próprio conjunto de dados usando o aprendizado por transferência.

Criar o perfil do modelo

Depois de selecionar um modelo candidato adequado para sua tarefa, é recomendável criar um perfil e um comparativo de mercado. A ferramenta de comparativo de mercado do LiteRT tem um criador de perfil integrado que mostra estatísticas de criação de perfil por operador. Isso pode ajudar a entender gargalos de desempenho e quais operadores dominam o tempo de computação.

Também é possível usar o rastreamento do LiteRT para criar um perfil do modelo no seu aplicativo Android usando o rastreamento padrão do sistema Android e visualizar as invocações de operador por tempo com ferramentas de criação de perfil baseadas em GUI.

Criar perfil e otimizar operadores no gráfico

Se um operador específico aparecer com frequência no modelo e, com base no criação de perfil, você descobrir que ele consome a maior parte do tempo, poderá otimizar esse operador. Esse cenário é raro, já que o TensorFlow Lite tem versões otimizadas para a maioria dos operadores. No entanto, é possível escrever uma versão mais rápida de uma operação personalizada se você souber as restrições em que o operador é executado. Confira o guia de operadores personalizados.

Otimize o modelo

A otimização de modelos visa criar modelos menores que geralmente são mais rápidos e eficientes em termos de energia, para que possam ser implantados em dispositivos móveis. O LiteRT aceita várias técnicas de otimização, como a quantização.

Confira os documentos de otimização de modelos para mais detalhes.

Ajustar o número de linhas de execução

A LiteRT oferece suporte a kernels multithread para muitos operadores. É possível aumentar o número de linhas de execução e acelerar a execução de operadores. No entanto, aumentar o número de threads faz com que o modelo use mais recursos e energia.

Para alguns aplicativos, a latência pode ser mais importante do que a eficiência energética. Você pode aumentar o número de linhas de execução definindo o número de threads do interpretador. No entanto, a execução multithread tem um custo de maior variabilidade de desempenho, dependendo do que mais é executado simultaneamente. Isso é especialmente válido para apps para dispositivos móveis. Por exemplo, testes isolados podem mostrar uma aceleração de 2x em comparação com uma única linha de execução, mas, se outro app estiver sendo executado ao mesmo tempo, o desempenho pode ser pior do que com uma única linha de execução.

Eliminar cópias redundantes

Se o aplicativo não for projetado com cuidado, poderá haver cópias redundantes ao transmitir a entrada e ler a saída do modelo. Elimine cópias redundantes. Se você estiver usando APIs de nível mais alto, como Java, verifique com atenção a documentação para conhecer as restrições de desempenho. Por exemplo, a API Java é muito mais rápida se ByteBuffers forem usados como entradas.

Criar o perfil do aplicativo com ferramentas específicas da plataforma

Ferramentas específicas da plataforma, como o Android Profiler e o Instruments, fornecem muitas informações de criação de perfil que podem ser usadas para depurar seu app. Às vezes, o bug de desempenho pode não estar no modelo, mas em partes do código do aplicativo que interagem com ele. Familiarize-se com as ferramentas de criação de perfil e as práticas recomendadas específicas da sua plataforma.

Avalie se o modelo se beneficia do uso de aceleradores de hardware disponíveis no dispositivo

O LiteRT adicionou novas maneiras de acelerar modelos com hardware mais rápido, como GPUs, DSPs e aceleradores neurais. Normalmente, esses aceleradores são expostos por submódulos delegate que assumem partes da execução do interpretador. O LiteRT pode usar delegados fazendo o seguinte:

  • O delegado de GPU está disponível no Android e no iOS, usando OpenGL/OpenCL e Metal, respectivamente. Para testar, consulte o delegado de GPU.
  • É possível criar seu próprio delegado se você tiver acesso a hardware não padrão. Consulte Delegados do LiteRT para mais informações.

Alguns aceleradores funcionam melhor para diferentes tipos de modelos. Alguns delegados só são compatíveis com modelos de ponto flutuante ou otimizados de uma maneira específica. É importante comparar cada delegado para saber se ele é uma boa escolha para seu aplicativo. Por exemplo, se você tiver um modelo muito pequeno, talvez não valha a pena delegá-lo à GPU. Por outro lado, os aceleradores são uma ótima opção para modelos grandes com alta intensidade aritmética.