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 eles sejam executados dentro dessas restrições. Além disso, algumas otimizações permitem o uso de hardware especializado para inferência acelerada.

O LiteRT e o kit de ferramentas de otimização de modelos do TensorFlow oferecem ferramentas para minimizar a complexidade da otimização de inferências.

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

Por que os modelos precisam ser otimizados

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

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:

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

A quantização pode reduzir o tamanho de um modelo em todos esses casos, possivelmente à custa de alguma acurácia. A poda e o clustering podem reduzir o tamanho de um modelo para download, tornando-o mais fácil de compactar.

Redução de 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 menor latência. A latência também pode afetar o consumo de energia.

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

Compatibilidade do acelerador

Alguns aceleradores de hardware, como a Edge TPU, podem executar inferências muito rapidamente com modelos otimizados corretamente.

Em geral, 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.

Contrapartidas

As otimizações podem resultar em mudanças na acurácia 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. Em geral, os modelos otimizados para tamanho ou latência perdem um pouco de acurácia. Dependendo do seu aplicativo, isso pode ou não afetar a experiência dos usuários. Em casos raros, alguns modelos podem ganhar precisão como resultado do processo de otimização.

Tipos de otimização

No momento, o LiteRT oferece suporte à otimização por quantização, poda e clustering.

Essas ferramentas fazem parte do TensorFlow Model Optimization Toolkit (link em inglês), que oferece recursos para técnicas de otimização de modelos compatíveis com o TensorFlow Lite.

Quantização

A quantização 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 tamanho de modelo menor e uma computação mais rápida.

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

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

A árvore de decisão a seguir ajuda você a selecionar os esquemas de quantização que talvez queira usar no modelo, com base apenas no tamanho e na acurácia esperados.

quantization-decision-tree

Confira abaixo os resultados de latência e precisão 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 melhoram:

Modelo Acurácia de primeiro nível (original) Acurácia de primeiro nível (quantizada pós-treinamento) Acurácia de primeiro nível (treinamento com Quantization Aware) Latência (original) (ms) Latência (quantização pós-treinamento) (ms) Latência (treinamento com Quantization 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 modelos de CNN selecionados

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

A quantização com ativações int16 é um esquema de quantização de números inteiros com ativações em int16 e pesos em int8. Esse modo pode melhorar a acurácia do modelo quantizado em comparação com o esquema de quantização de números inteiros completo com ativações e pesos em int8, mantendo um tamanho de modelo semelhante. É recomendada quando as ativações são sensíveis à quantização.

OBSERVAÇÃO:no momento, 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. No momento, é possível acessar todas as vantagens desse modo usando hardware especializado ou software personalizado.

Confira abaixo os resultados de acurácia de alguns modelos que se beneficiam desse modo.

Modelo Tipo de métrica de acurácia Acurácia (ativações float32) Precisão (ativações int8) Precisão (ativações int16)
Wav2letterWER6,7%7,7% 7,2%
DeepSpeech 0.5.1 (sem enrolamento)CER6,13%43,67% 6,52%
YoloV3mAP(IOU=0.5)0,5770,563 0,574
MobileNetV1Acurácia de primeiro nível0,70620,694 0,6936
MobileNetV2Acurácia de primeiro nível0,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 poda funciona removendo parâmetros de um modelo que têm apenas um impacto pequeno nas previsões. Os modelos reduzidos têm o mesmo tamanho no disco e a mesma latência de tempo de execução, mas podem ser compactados com mais eficiência. Isso torna a poda uma técnica útil para reduzir o tamanho do download do modelo.

No futuro, o LiteRT vai reduzir a latência dos modelos reduzidos.

Clustering

O clustering agrupa os pesos de cada camada em um modelo em um número predefinido de clusters e compartilha os valores centroides dos pesos pertencentes a cada cluster individual. Isso reduz o número de valores de peso únicos em um modelo, diminuindo a complexidade dele.

Como resultado, os modelos clusterizados podem ser compactados com mais eficiência, oferecendo benefícios de implantação semelhantes à poda.

Fluxo de trabalho de desenvolvimento

Para começar, verifique se os modelos em modelos hospedados podem funcionar 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 casos em que as metas de acurácia 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. Confira outras técnicas de otimização no Kit de ferramentas de otimização de modelos do TensorFlow.

Se quiser reduzir ainda mais o tamanho do modelo, tente a poda e/ou o clustering antes de quantizar os modelos.