Path: blob/master/site/pt-br/lite/performance/quantization_debugger.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
Inspeção de erros de quantização com o depurador
Embora a quantização de números inteiros forneça melhorias de tamanho do modelo e latência, o modelo quantizado nem sempre funcionará como esperado. Geralmente, o esperado é que a qualidade do modelo (por exemplo, exatidão, mAP, WER) seja um pouco inferior ao modelo float original. No entanto, há casos em que a qualidade do modelo pode ficar abaixo das suas expectativas ou gerar resultados totalmente errados.
Quando ocorrer esse problema, é complicado e trabalhoso localizar a causa raiz do erro de quantização, mas corrigi-lo é ainda mais difícil. Para ajudar no processo de inspeção do modelo, o depurador de quantização pode ser usado para identificar as camadas problemáticas, e a quantização seletiva pode deixar essas camadas problemáticas em float para que a exatidão do modelo seja recuperada à custa de um benefício reduzido da quantização.
Observação: essa API é experimental, e pode haver mudanças que causem quebras na API no decorrer das melhorias.
Depurador de quantização
O depurador de quantização possibilita a análise de métricas de qualidade da quantização no modelo existente. Ele pode automatizar os processos para a execução do modelo com um dataset de depuração e coletar métricas de qualidade de quantização para cada tensor.
Observação: no momento, o depurador de quantização e a quantização seletiva só funcionam para a quantização de números inteiros com ativações int8.
Pré-requisitos
Se você já tem um pipeline para quantizar um modelo, tem todos os elementos necessários para executar o depurador de quantização!
Modelo que será quantizado
Dataset representativo
Além do modelo e dos dados, você precisará usar um framework de processamento de dados (por exemplo, pandas, Planilhas Google) para analisar os resultados exportados.
Configuração
Esta seção prepara as bibliotecas, o modelo MobileNet v3 e o dataset de teste de 100 imagens.
Podemos ver que o modelo original tem uma exatidão top-5 muito mais alta do que nosso pequeno dataset, enquanto o modelo quantizado tem uma perda significativa na exatidão.
Etapa 1. Prepare o depurador
A maneira mais fácil de usar o depurador de quantização é fornecer o tf.lite.TFLiteConverter
usado para quantizar o modelo.
Etapa 2. Execute o depurador e obtenha os resultados
Ao chamar QuantizationDebugger.run()
, o depurador registrará as diferenças entre os tensores float e quantizados para o mesmo local da op e os processará com as determinadas métricas.
As métricas processadas podem ser acessadas com QuantizationDebugger.layer_statistics
ou despejadas em um arquivo de texto em formato CSV com QuantizationDebugger.layer_statistics_dump()
.
Para cada linha no dump, o nome da op e o índice vêm primeiro, seguidos pelos parâmetros de quantização e métricas de erros (incluindo métricas de erros definidas pelo usuário, se houver alguma). O arquivo CSV resultante pode ser usado para escolher as camadas problemáticas com grandes métricas de erros de quantização.
Com o pandas ou outra biblioteca de processamento de dados, podemos inspecionar as métricas de erros detalhadas por camada.
Etapa 3. Analise os dados
Há várias maneiras de analisar os resultados. Primeiro, vamos adicionar algumas métricas úteis derivadas das saídas do depurador. (scale
significa o fator de escala de quantização para cada tensor.)
Range, ou intervalo, (
256 / scale
)RMSE / scale, ou raiz do erro quadrático médio / escala, (
sqrt(mean_squared_error) / scale
)
O RMSE / scale
é próximo a 1 / sqrt(12)
(cerca de 0,289) quando a distribuição quantizada é semelhante à distribuição float original, indicando um bom modelo quantizado. Quanto maior for o valor, mais provável será que a camada não tenha sido bem quantizada.
Há várias camadas com grandes intervalos, e algumas camadas com valores altos de RMSE/scale
. Vamos obter as camadas com métricas de erros altas.
Com essas camadas, você pode tentar a quantização seletiva para ver se a qualidade do modelo melhora ao deixar de quantizá-las.
Além disso, pular a quantização nas primeiras camadas também ajuda a melhorar a qualidade do modelo quantizado.
Quantização seletiva
A quantização seletiva pula alguns nós, para que o cálculo possa ser feito no domínio de ponto flutuante original. Quando as camadas corretas são puladas, podemos esperar a recuperação de um pouco da qualidade do modelo à custa de maior latência e tamanho do modelo.
No entanto, se você estiver planejando executar modelos quantizados em aceleradores somente números inteiros (por exemplo, DSP Hexagon ou EdgeTPU), a quantização seletiva causaria a fragmentação do modelo e resultaria em uma latência de inferência mais lenta, causada principalmente pelo custo da transferência de dados entre a CPU e esses aceleradores. Para evitar isso, considere realizar o treinamento consciente de quantização para manter todas as camadas em números inteiros, preservando a exatidão do modelo.
O depurador de quantização aceita as opções denylisted_nodes
e denylisted_ops
para pular a quantização em camadas específicas ou todas as instâncias de determinadas ops. Usando as suspected_layers
que preparamos na etapa anterior, podemos utilizar o depurador de quantização para obter um modelo quantizado de forma seletiva.
A exatidão é ainda mais baixa em comparação com o modelo float original, mas o modelo totalmente quantizado tem melhorias notáveis ao pular a quantização para cerca de 10 das 111 camadas.
Você também pode tentar não quantizar todas as operações na mesma classe. Por exemplo, para pular a quantização em todas as operações de média, você pode passar MEAN
a denylisted_ops
.
Com essas técnicas, podemos melhorar a exatidão do modelo MobileNet V3. Em seguida, vamos explorar técnicas avançadas para melhorar ainda mais a exatidão.
Usos avançados
Com os seguintes recursos, você pode personalizar ainda mais seu pipeline de depuração.
Métricas personalizadas
Por padrão, o depurador de quantização emite cinco métricas para cada diferença float-quant: tamanho do tensor, desvio padrão, erro médio, erro absoluto máximo e erro quadrático médio. Você pode adicionar mais métricas personalizadas ao passá-las às opções. Para cada métrica, o resultado deverá ser um único valor float, e a métrica resultante será uma média das métricas de todos os exemplos.
layer_debug_metrics
: calcula uma métrica baseada na diferença de cada saída de operação em relação às saídas de operações float e quantizadas.layer_direct_compare_metrics
: em vez de só obter a diferença, calcula uma métrica baseada nos tensores float e quantizados brutos e seus parâmetros de quantização (escala, ponto zero).model_debug_metrics
: só é usada quandofloat_model_(path|content)
é passado ao depurador. Além das métricas no nível da operação, a saída da camada final é comparada à saída de referência do modelo float original.
O resultado de model_debug_metrics
pode ser visto separadamente de debugger.model_statistics
.
Usando a API mlir_quantize (interna) para acessar recursos detalhados
Observação: alguns recursos na seção a seguir, TFLiteConverter._experimental_calibrate_only
e converter.mlir_quantize
, são APIs internas experimentais e estão sujeitas a mudanças incompatíveis com versões anteriores.
Modo de verificação do modelo inteiro
O comportamento padrão para a geração do modelo de depuração é a verificação por camada. Nesse modo, a entrada para o par de operações float e quantizadas é da mesma fonte (operação quantizada anteriormente). Outro modo é a verificação do modelo inteiro, em que os modelos float e quantizados são separados. Esse modo seria útil para observar como o erro é propagado pelo modelo. Para ativar, defina enable_whole_model_verify=True
para convert.mlir_quantize
ao gerar o modelo de depuração manualmente.
Quantização seletiva de um modelo já calibrado
Você pode chamar convert.mlir_quantize
diretamente para obter o modelo quantizado seletivamente do modelo já calibrado. Isso é especialmente útil quando você quer calibrar o modelo uma vez e experimentar com várias combinações de denylist.