Path: blob/master/site/pt-br/lite/performance/model_optimization.md
25118 views
Otimização de modelo
Os dispositivos de borda geralmente têm memória ou poder computacional limitado. Várias otimizações podem ser aplicadas aos modelos para que eles possam ser executados nessas restrições. Além disso, algumas otimizações permitem o uso de hardware especializado para a inferência acelerada.
O TensorFlow Lite e o Kit de ferramentas para otimização de modelo do TensorFlow fornece ferramentas para reduzir a complexidade de otimizar a inferência.
É recomendável considerar a otimização do modelo durante o processo de desenvolvimento do seu aplicativo. Este documento descreve algumas práticas recomendadas para otimizar modelos do TensorFlow para a implantação de hardware de borda.
Por que os modelos devem ser otimizados
A otimização de modelo pode ajudar com o 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 seus usuários. Por exemplo, um aplicativo Android usando um modelo menor ocupará 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 serem baixados nos dispositivos dos usuários.
Menos uso da memória: modelos menores usam menos RAM quando são executados, o que libera a memória para que seja usada por outras partes do seu 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 um pouco de exatidão. O pruning e o clustering podem reduzir o tamanho de um modelo para download ao torná-lo mais facilmente compressível.
Redução de latência
A latência é a quantidade de tempo que leva 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 realizar a inferência usando um modelo, resultando em menor latência. A latência também pode ter um impacto no consumo de energia.
No momento, a quantização pode ser usada para reduzir a latência ao simplificar os cálculos que ocorrem durante a inferência, possivelmente à custa de um pouco de exatidão.
Compatibilidade com os aceleradores
Alguns aceleradores de hardware, como o Edge TPU, podem realizar a inferência de forma extremamente rápida com modelos que foram otimizados de maneira correta.
Geralmente, esses tipos de dispositivos exigem que os modelos sejam quantizados de maneira específica. Veja a documentação de cada acelerador de hardware para saber mais sobre os requisitos deles.
Trade-offs
As otimizações podem resultar possivelmente em mudanças na exatidão do modelo, o que precisa ser considerado durante o processo de desenvolvimento do aplicativo.
As mudanças na exatidão dependem do modelo individual que está sendo otimizado e são difíceis de prever com antecedência. Geralmente, os modelos otimizados para o tamanho ou a latência perdem um pouco da exatidão. Dependendo do seu aplicativo, isso pode afetar ou não a experiência dos seus usuários. Em casos raros, alguns modelos podem ganhar um pouco de exatidão como resultado do processo de otimização.
Tipos de otimização
Atualmente, o TensorFlow Lite aceita a otimização por quantização, pruning e clustering.
Eles fazem parte do Kit de ferramentas para a otimização de modelo do TensorFlow, que fornece recursos para técnicas de otimização de modelo compatíveis com o TensorFlow Lite.
Quantização
A quantização funciona ao reduzir 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 menor tamanho de modelo e uma 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 | Exatidão | Hardware compatível |
---|---|---|---|---|
Quantização float16 pós-treinamento | Nenhum dado | Até 50% | Perda de exatidão insignificante | CPU, GPU |
Quantização de intervalo dinâmico pós-treinamento | Nenhum dado | Até 75% | Perda de exatidão mínima | CPU, GPU (Android) |
Quantização de números inteiros pós-treinamento | Amostra representativa não rotulada | Até 75% | Perda de exatidão pequena | CPU, GPU (Android), EdgeTPU, DSP Hexagon |
Treinamento consciente de quantização | Dados de treinamento rotulados | Até 75% | Perda de exatidão mínima | CPU, GPU (Android), EdgeTPU, DSP Hexagon |
A seguinte árvore de decisão ajuda você a selecionar os esquemas de quantização que talvez queira usar para seu modelo, simplesmente com base no tamanho e na exatidão esperados do modelo.
Confira abaixo os resultados de latência e exatidão para a quantização pós-treinamento e o treinamento consciente de quantização em alguns modelos. Todos os números de latência são medidos em dispositivos Pixel 2 usando uma única CPU big core. Conforme o kit de ferramentas melhorar, os números aqui também vão:
Model | Top-1 Accuracy (Original) | Top-1 Accuracy (Post Training Quantized) | Top-1 Accuracy (Quantization Aware Training) | Latency (Original) (ms) | Latency (Post Training Quantized) (ms) | Latency (Quantization Aware Training) (ms) | Size (Original) (MB) | Size (Optimized) (MB) |
---|---|---|---|---|---|---|---|---|
Mobilenet-v1-1-224 | 0.709 | 0.657 | 0.70 | 124 | 112 | 64 | 16.9 | 4.3 |
Mobilenet-v2-1-224 | 0.719 | 0.637 | 0.709 | 89 | 98 | 54 | 14 | 3.6 |
Inception_v3 | 0.78 | 0.772 | 0.775 | 1130 | 845 | 543 | 95.7 | 23.9 |
Resnet_v2_101 | 0.770 | 0.768 | N/A | 3973 | 2868 | N/A | 178.3 | 44.9 |
Quantização de números inteiros 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 exatidão do modelo quantizado em comparação com o esquema de quantização de números inteiros com as ativações e os pesos em int8, mantendo um tamanho de modelo semelhante. É recomendado quando as ativações são sensíveis à quantização.
OBSERVAÇÃO: no momento, somente implementações de kernels de referência não otimizados estão disponíveis no TFLite para esse esquema de quantização. Então, por padrão, o desempenho será lento em comparação aos kernels int8. Os benefícios completos desse modo podem ser acessados por hardware especializado ou software personalizado.
Confira os resultados de exatidão para alguns modelos que se beneficiam desse modo.
Model | Accuracy metric type | Accuracy (float32 activations) | Accuracy (int8 activations) | Accuracy (int16 activations) |
---|---|---|---|---|
Wav2letter | WER | 6.7% | 7.7% | 7.2% |
DeepSpeech 0.5.1 (unrolled) | CER | 6.13% | 43.67% | 6.52% |
YoloV3 | mAP(IOU=0.5) | 0.577 | 0.563 | 0.574 |
MobileNetV1 | Top-1 Accuracy | 0.7062 | 0.694 | 0.6936 |
MobileNetV2 | Top-1 Accuracy | 0.718 | 0.7126 | 0.7137 |
MobileBert | F1(Exact match) | 88.81(81.23) | 2.08(0) | 88.73(81.15) |
Pruning
O pruning atua removendo os parâmetros de um modelo que só têm um impacto menor nas suas previsões. Os modelos que passaram pelo pruning têm o mesmo tamanho em disco e a mesma latência de runtime, mas podem ser comprimidos com mais eficiência. Isso faz com que o pruning seja uma técnica útil para reduzir o tamanho de download do modelo.
No futuro, o TensorFlow Lite proporcionará a redução da latência para modelos após o pruning.
Clustering
O clustering atua agrupando os pesos de cada camada de um modelo em um número predefinido de clusters e, depois, compartilhando os valores de centroides para os pesos que pertencem a cada cluster individual. Isso reduz o número de valores de pesos únicos em um modelo, diminuindo sua complexidade.
Como resultado, os modelos que passaram pelo clustering podem ser comprimidos com mais eficiência, oferecendo benefícios semelhantes ao pruning para a implantação.
Fluxo de trabalho de desenvolvimento
Como ponto de partida, verifique se os 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 é amplamente aplicável e não exige dados de treinamento.
Para os casos em que os alvos de exatidão e latência não forem atingidos ou o suporte ao acelerador de hardware for importante, o treinamento consciente de quantização{:.external} é a melhor opção. Veja as técnicas de otimização adicionais no Kit de ferramentas para a otimização de modelo do TensorFlow.
Se você quiser reduzir ainda mais o tamanho do modelo, experimente o pruning e/ou clustering antes da quantização.