Otimização de modelos

Os dispositivos de borda geralmente têm memória ou poder computacional limitados. Várias otimizações podem ser aplicadas aos modelos para que possam ser executados dentro dessas restrições. Além disso, algumas otimizações permitem o uso de hardware especializado para inferência acelerada.

O TensorFlow Lite e o Kit de ferramentas de otimização de modelos do TensorFlow (em inglês) oferecem ferramentas para minimizar a complexidade da otimização da inferência.

Recomendamos que você considere a otimização do modelo durante o processo de desenvolvimento do aplicativo. Neste documento, descrevemos algumas práticas recomendadas para otimizar modelos do TensorFlow para implantação em hardware de borda.

Por que os modelos devem ser otimizados

A otimização de modelos pode ajudar no desenvolvimento de aplicativos de várias maneiras.

Redução de tamanho

Algumas formas de otimização podem ser usadas para reduzir o tamanho de um modelo. Modelos menores têm os seguintes benefícios:

  • Menor tamanho de armazenamento:modelos menores ocupam menos espaço de armazenamento nos dispositivos dos usuários. Por exemplo, um app Android que usa um modelo menor ocupará menos espaço de armazenamento no dispositivo móvel do usuário.
  • Tamanho de download menor:modelos menores exigem menos tempo e largura de banda para fazer o download nos dispositivos dos usuários.
  • Menor uso de memória:modelos menores usam menos RAM quando executados, o que libera memória para outras partes do aplicativo e pode melhorar o desempenho e a estabilidade.

A quantização pode reduzir o tamanho de um modelo em todos esses casos, às custas de alguma acurácia. A poda e o clustering podem reduzir o tamanho de um modelo para download, tornando-o mais facilmente compactável.

Redução da latência

Latência é o tempo necessário para executar uma única inferência com um determinado modelo. Algumas formas de otimização podem reduzir a quantidade de computação necessária para executar a inferência usando um modelo, resultando em uma latência menor. A latência também pode ter um impacto no consumo de energia.

Atualmente, a quantização pode ser usada para reduzir a latência simplificando os cálculos que ocorrem durante a inferência, possivelmente à custa de alguma precisão.

Compatibilidade com acelerador

Alguns aceleradores de hardware, como o Edge TPU, podem executar inferência de maneira extremamente rápida com modelos que foram otimizados corretamente.

Geralmente, esses tipos de dispositivos exigem que os modelos sejam quantizados de uma maneira específica. Consulte a documentação de cada acelerador de hardware para saber mais sobre os requisitos deles.

Contrapartidas

As otimizações podem resultar em mudanças na precisão do modelo, que precisam ser consideradas durante o processo de desenvolvimento do aplicativo.

As mudanças na acurácia dependem do modelo individual que está sendo otimizado e são difíceis de prever com antecedência. Geralmente, modelos otimizados para tamanho ou latência perdem um pouco da acurácia. Dependendo do app, isso pode ou não afetar a experiência dos usuários. Em casos raros, certos modelos podem ter alguma acurácia como resultado do processo de otimização.

Tipos de otimização

No momento, o TensorFlow Lite oferece suporte à otimização por quantização, remoção e clustering.

Eles fazem parte do Kit de ferramentas de otimização de modelos do TensorFlow, que fornece recursos para técnicas de otimização de modelos compatíveis com o TensorFlow Lite.

Quantização.

A quantização (em inglês) reduz a precisão dos números usados para representar os parâmetros de um modelo, que, por padrão, são números de ponto flutuante de 32 bits. Isso resulta em um modelo menor e computação mais rápida.

Os seguintes tipos de quantização estão disponíveis no TensorFlow Lite:

Técnica Requisitos de dados Redução de tamanho Precisão Hardware compatível
Quantização float16 pós-treinamento Sem dados Até 50% Perda insignificante de precisão CPU, GPU
Quantização de intervalo dinâmico pós-treinamento Sem dados Até 75% Menor perda de precisão CPU, GPU (Android)
Quantização de números inteiros pós-treinamento Amostra representativa não identificada Até 75% Perda de precisão pequena CPU, GPU (Android), EdgeTPU
Treinamento com reconhecimento de quantização Dados de treinamento rotulados Até 75% Menor perda de precisão CPU, GPU (Android), EdgeTPU

A árvore de decisão a seguir ajuda você a selecionar os esquemas de quantização que quer usar para seu modelo, simplesmente com base no tamanho e na acurácia esperados do modelo.

quantização-árvore de decisão

Veja abaixo os resultados de latência e acurácia para quantização pós-treinamento e treinamento com reconhecimento de quantização em alguns modelos. Todos os números de latência são medidos em dispositivos Pixel 2 usando uma única CPU de núcleo grande. À medida que o kit de ferramentas melhora, os números aqui também aumentam:

Modelo 1a maior precisão (original) 1o item de precisão (quantizado após o treinamento) Acurácia top-1 (treinamento de quantização Aware) Latência (original) (ms) Latência (quantizada pós-treinamento) (ms) Latência (treinamento de quantização Aware) (ms) Tamanho (original) (MB) Tamanho (otimizado) (MB)
Mobilenet-v1-1-2240,7090,6570,70 1241126416,94.3
Mobilenet-v2-1-2240,7190,6370,709 899854143.6
Inception_v30,780,7720,775 113084554395,723,9
Resnet_v2_1010,7700,768N/A 39732868N/A178,344,9
Tabela 1 Benefícios da quantização de modelos para alguns modelos de CNN

Quantização de números inteiros completo com ativações int16 e pesos int8

A quantização com ativações int16 (link em inglês) é um esquema completo de quantização de números inteiros com ativações em int16 e pesos em int8. Esse modo pode melhorar a precisão do modelo quantizado em comparação com o esquema de quantização de números inteiros completo com ativações e pesos no int8, mantendo um tamanho de modelo semelhante. Ela é recomendada quando as ativações são sensíveis à quantização.

OBSERVAÇÃO:atualmente, apenas implementações de kernel de referência não otimizadas estão disponíveis no TFLite para esse esquema de quantização. Portanto, por padrão, o desempenho será lento em comparação com os kernels int8. Todas as vantagens desse modo podem ser acessadas atualmente por meio de hardware especializado ou software personalizado.

Confira abaixo os resultados de precisão de alguns modelos que se beneficiam desse modo.

Modelo Tipo de métrica de precisão Precisão (ativações de float32) Precisão (ativações int8) Precisão (ativações int16)
Wav2letterWER6,7%7,7% 7,2%
DeepSpeech 0.5.1 (desenrolado)CER6,13%43,67% 6,52%
YoloV3mAP(IOU=0,5)0,5770,563 0,574
MobileNetV1Acurácia: top-10,70620,694 0,6936
MobileNetV2Acurácia: top-10,7180,7126 0,7137
MobileBertF1(correspondência exata)88,81(81,23)2,08(0) 88,73(81,15)
Tabela 2 Benefícios da quantização de modelos com ativações int16

Poda

A remoção funciona removendo parâmetros dentro de um modelo que têm um pequeno impacto nas previsões. Os modelos reduzidos têm o mesmo tamanho em disco e têm a mesma latência de ambiente de execução, mas podem ser compactados com mais eficiência. Isso torna a remoção uma técnica útil para reduzir o tamanho de download do modelo.

No futuro, o TensorFlow Lite vai oferecer redução de latência para modelos reduzidos.

Clustering

O clustering funciona agrupando os pesos de cada camada de um modelo em um número predefinido de clusters e, em seguida, compartilhando os valores de centroide para os pesos pertencentes a cada cluster individual. Isso reduz o número de valores de peso exclusivos em um modelo, o que diminui a complexidade.

Como resultado, os modelos em cluster podem ser compactados com mais eficácia, oferecendo benefícios de implantação semelhantes à remoção.

Fluxo de trabalho de desenvolvimento

Como ponto de partida, verifique se os modelos em modelos hospedados funcionam para seu aplicativo. Caso contrário, recomendamos que os usuários comecem com a ferramenta de quantização pós-treinamento, já que ela é amplamente aplicável e não exige dados de treinamento.

Para os casos em que as metas de precisão e latência não são atendidas ou em que o suporte a aceleradores de hardware é importante, o treinamento com reconhecimento de quantização é a melhor opção. Veja mais técnicas de otimização no Kit de ferramentas de otimização de modelos do TensorFlow.

Se você quiser reduzir ainda mais o tamanho do modelo, tente reduzir e/ou fazer o clustering antes de quantificar os modelos.