Otimização de modelos

Os dispositivos de borda geralmente têm memória ou capacidade computacional limitados. Diversos podem ser aplicadas a modelos para que possam ser executados dentro desses restrições. Além disso, algumas otimizações permitem o uso de tecnologias hardware adequado para inferência acelerada.

A LiteRT e a otimização de modelos do TensorFlow Toolkit oferecem ferramentas para minimizar a complexidade de otimizar a inferência.

Recomendamos que você considere a otimização do modelo durante a aplicação de desenvolvimento de software. Este documento descreve 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 na aplicação de várias maneiras no desenvolvimento de software.

Redução de tamanho

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

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

A quantização pode reduzir o tamanho de um modelo em todos esses casos, podendo em detrimento da precisão. A remoção e o clustering podem reduzir o tamanho para download, tornando-o mais fácil de compactar.

Redução da latência

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

Atualmente, a quantização pode ser usada para reduzir a latência, simplificando a cálculos que ocorrem durante a inferência, potencialmente às custas de alguns precisão.

Compatibilidade de acelerador

Alguns aceleradores de hardware, como o Edge TPU, pode executar inferência extremamente rápido com que foram otimizados corretamente.

Geralmente, esses tipos de dispositivos exigem que os modelos sejam quantizados de forma específica de um jeito fácil. Consulte a documentação de cada acelerador de hardware para saber mais sobre os e cumprimento de requisitos regulatórios.

Contrapartidas

As otimizações podem resultar em alterações na acurácia do modelo, que precisa ser durante o processo de desenvolvimento do aplicativo.

As mudanças na acurácia dependem do modelo individual que está sendo otimizado difíceis de prever com antecedência. Em geral, os modelos que são otimizados ou latência perdem um pouco de precisão. Dependendo da sua do aplicativo, isso pode ou não afetar as do usuário. Em casos raros, alguns modelos podem ganhar alguma acurácia como resultado do processo de otimização.

Tipos de otimização

Atualmente, o LiteRT oferece suporte à otimização por meio de quantização, remoção e clustering de dados.

Elas fazem parte do projeto de Otimização de modelos Toolkit, que oferece recursos de técnicas de otimização de modelos compatíveis com o TensorFlow Lite.

Quantização.

Quantização funciona reduzindo a precisão dos números usados para representar a que, por padrão, são números de ponto flutuante de 32 bits. Isso resulta em um tamanho de modelo menor e 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 de acurácia insignificante CPU, GPU
Quantização de intervalo dinâmico pós-treinamento Não há dados Até 75% Menor perda de precisão 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 precisão CPU, GPU (Android), EdgeTPU

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

quantização-árvore de decisão

Confira abaixo os resultados de latência e acurácia da quantização pós-treinamento e com base na quantização em alguns modelos. Todos os números de latência são medidos Dispositivos Pixel 2 que usam uma única CPU de núcleo grande. À medida que o kit de ferramentas for aprimorado, os números aqui:

Modelo Melhor precisão (original) Acurácia de primeiro nível (quantizado pós-treinamento) Top-1 Precisão (treinamento com reconhecimento de quantização) Latência (original) (ms) Latência (quantizado pós-treinamento) (ms) Latência (treinamento com reconhecimento de quantização) (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 completos com ativações int16 e pesos int8

Quantização com ativações int16 é um esquema de quantização de número inteiro completo 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úmero inteiro completo com ativações e pesos em int8 e manter um tamanho de modelo semelhante. É recomendado quando as ativações são sensíveis à quantização.

OBSERVAÇÃO: atualmente, apenas as implementações do kernel de referência não otimizadas são disponível no TFLite para esse esquema de quantização. Por padrão, o desempenho é lento em comparação com kernels int8. Todas as vantagens desse modo podem ser acessados por hardware especializado ou software personalizado.

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

Modelo Tipo de métrica de precisão Precisão (ativações float32) Precisão (int8 ativações) Precisão (int16 ativações)
Wav2letterWER6,7%7,7% 7,2%
DeepSpeech 0.5.1 (não implementado)CER6,13%43,67% 6,52%
YoloV3mAP(IOU=0,5)0,5770,563 0,574
MobileNetV1Melhor precisão0,70620,694 0,6936
MobileNetV2Melhor precisão0,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 do modelo com ativações int16

Poda

A remoção funciona removendo parâmetros dentro de um modelo que tenham apenas um pequeno impacto em sua previsões. Modelos reduzidos têm o mesmo tamanho em disco e o mesmo ambiente de execução latência, mas pode ser comprimido com mais eficácia. Isso torna o processo de poda técnica para reduzir o tamanho de download de modelos.

No futuro, a LiteRT oferecerá redução de latência para modelos reduzidos.

Clustering

Clustering agrupa os pesos de cada camada de um modelo em um número predefinido de clusters, depois compartilhando os valores centroides para os pesos que pertencem a cada cluster individual. Isso reduz o número de valores de peso únicos em um modelo, reduzindo assim sua complexidade.

Assim, os modelos em cluster podem ser compactados com mais eficiência, benefícios de implantação semelhantes à remoção.

Fluxo de trabalho de desenvolvimento

Para começar, verifique se os modelos no ambiente de rede podem funcionar para seu aplicativo. Caso contrário, recomendamos que os usuários comecem com a quantização pós-treinamento ferramenta, uma vez que ela é amplamente aplicável e não não precisam de dados de treinamento.

Nos casos em que as metas de precisão e latência não são atingidas ou o suporte a aceleradores é importante, considerando a quantização treinamento é a melhor opção. Consulte técnicas de otimização adicionais na Otimização de modelos do TensorFlow Toolkit.

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