Path: blob/master/site/pt-br/lite/performance/quantization_spec.md
25118 views
Especificação da quantização de 8 bits do TensorFlow Lite
Este documento descreve a especificação para o esquema de quantização de 8 its do TensorFlow Lite. O objetivo dele é ajudar os desenvolvedores de hardware a oferecer suporte para a inferência com modelos do TensorFlow Lite quantizados.
Resumo da especificação
Estamos fornecendo uma especificação e só podemos dar algumas garantias de comportamento se a especificação for seguida. Também entendemos que cada hardware pode ter preferências e restrições que causam leves desvios ao implementar a especificação, resultando em implementações de bits não exatos. Isso pode ser aceitável na maioria dos casos (e oferecemos um pacote de testes que, de acordo com nosso conhecimento, incluem tolerâncias por operação que reunimos de vários modelos), a natureza do aprendizado de máquina (e do aprendizado profundo no caso mais comum) torna impossível dar quaisquer garantias sólidas.
A quantização de 8 bits aproxima os valores de ponto flutuante usando a seguinte fórmula.
Os pesos por eixo (ou seja, por canal nas operações Conv) ou por tensor são representados por dois valores complementares int8
no intervalo [-127, 127]
com um ponto zero igual a 0. As ativações/entradas por tensor são representadas por dois valores complementares int8
no intervalo [-128, 127]
, com um ponto zero no intervalo [-128, 127]
.
Há outras exceções para operações específicas documentadas abaixo.
Observação: no passado, nossas ferramentas de quantização usavam a quantização uint8
assimétrica por tensor. As novas ferramentas, os kernels de referência e os kernels otimizados para a quantização de 8 bits usarão esta especificação.
Números inteiros assinados x não assinados
A quantização do TensorFlow Lite priorizará principalmente as ferramentas e os kernels para a quantização int8
de 8 bits. Isso é para a conveniência de a quantização simétrica ser representada pelo ponto zero igual a 0. Além disso, vários back-end têm otimizações adicionais para a acumulação int8xint8
.
Por eixo x por tensor
A quantização por tensor significa que haverá uma escala e/ou ponto zero para cada tensor. A quantização por eixo significa que haverá uma escala e/ou zero_point
por fatia em quantized_dimension
. A dimensão quantizada especifica a dimensão do formato do tensor a que as escalas e os pontos zeros correspondem. Por exemplo, um tensor t
, de dims=[4, 3, 2, 1]
com os parâmetros de quantização: scale=[1.0, 2.0, 3.0]
, zero_point=[1, 2, 3]
, quantization_dimension=1
será quantizado em toda a segunda dimensão de t
:
Geralmente, a quantized_dimension
é o output_channel
dos pesos das convoluções, mas, em teoria, pode ser que a dimensão corresponda a cada produto escalar na implementação do kernel, permitindo maior granularidade da quantização sem implicações no desempenho. Isso leva a grandes melhorias na exatidão.
O TFLite oferece o suporte por eixo a um número crescente de operações. No momento da publicação deste documento, há suporte para Conv2d e DepthwiseConv2d.
Simétrico x assimétrico
As ativações são assimétricas: elas podem ter o ponto zero em qualquer lugar no intervalo [-128, 127]
do int8
assinado. Várias ativações têm natureza assimétrica e o ponto zero é uma maneira relativamente barata de conseguir mais um bit binário de precisão de forma eficiente. Como as ativações só são multiplicadas por pesos constantes, o valor de ponto zero constante pode ser bastante otimizado.
Os pesos são assimétricos: eles são forçados a ter o ponto zero igual a 0. Os valores dos pesos são multiplicados pelos valores de ativação e entrada dinâmica. Isso significa que há o custo de runtime inevitável de multiplicar o ponto zero do peso com o valor de ativação. Ao impor o ponto zero como 0, podemos evitar esse custo.
A explicação da matemática: isso é semelhante à seção 2.3 em arXiv:1712.05877, exceto que a diferença permitida para os valores escalares são por eixo. Isso é prontamente generalizado da seguinte maneira:
é uma matriz das ativações quantizadas.
é uma matriz dos pesos quantizados.
Considere multiplicar a linha th de , pela coluna th de , , ambos de comprimento . Os valores de números inteiros quantizados e de pontos zeros são , e , , respectivamente.
O termo (\sum_{i=0}^{n} q_{a}^{(i)} q_{b}^{(i)}) é inevitável, já que fornece o valor escalar dos valores da entrada e do peso.
Os termos and são compostos de constantes que permanecem iguais por invocação de inferência e, por isso, podem ser pré-calculadas.
O termo (\sum_{i=0}^{n} q_{a}^{(i)} z_b) precisa ser computado a cada inferência, porque a ativação muda a cada inferência. Ao impor que os pesos sejam simétricos, podemos remover o custo desse termo.
Especificações de operadores quantizados int8
Descrevemos abaixo os requisitos de quantização para nossos kernels tflite int8: