A Quantização (ou Quantization) é uma das técnicas fundamentais de otimização no campo do Aprendizado de Máquina. Ela permite compactar Grandes Modelos de Linguagem (LLMs), reduzindo drasticamente o consumo de memória (VRAM/RAM) e acelerando o tempo de resposta, com uma perda mínima na capacidade de raciocínio.
Em termos simples, quantizar é reduzir a precisão numérica dos pesos da rede neural.
O que significa Reduzir a Precisão?
Durante o treinamento, as LLMs calculam e armazenam seus bilhões de parâmetros (pesos) usando números de ponto flutuante de alta precisão de 32 bits (FP32) ou 16 bits (FP16 / BF16).
- Ponto Flutuante de 16 bits (
FP16): Guarda números com casas decimais extremamente detalhadas (ex:0.0048293712). Cada peso ocupa 2 bytes de memória. - Inteiro de 4 bits (
INT4): Arredonda e mapeia essa gama contínua de valores decimais para um conjunto discreto e limitado de inteiros (ex: inteiros de -8 a 7). Cada peso passa a ocupar apenas 0,5 byte (4 bits).
A Matemática do Mapeamento
O processo de quantização converte um valor contínuo de ponto flutuante em um valor inteiro discreto q, utilizando dois parâmetros matemáticos: uma Escala (S) e um Ponto Zero (Z).
A fórmula de quantização mais comum (Quantização Uniforme) é:
E para desquantizar o valor durante a execução das operações matemáticas:
- S (Scale): Define o tamanho dos degraus entre os números.
- Z (Zero-Point): Ajusta o deslocamento para que o valor zero real da precisão original corresponda exatamente ao zero discreto do inteiro.
Exemplo de cálculo
Para entender a quantização na prática, vamos acompanhar o passo a passo matemático de como um pequeno grupo de pesos de alta precisão (FP32) é comprimido para um formato de baixa precisão de 4 bits (INT4) e depois reconstruído (FP16 aproximado).
Imagine que extraímos uma pequena fatia de uma matriz de pesos de uma camada de um modelo. O modelo original utiliza FP32 (ponto flutuante de 32 bits, ocupando 4 bytes por número).
Nossos 4 pesos originais (X) são:
Nosso objetivo: Comprimir esses valores para INT4 (inteiro de 4 bits sem sinal), cujos valores possíveis variam apenas no intervalo discreto de 0 a 15 (total de níveis).
Passo 1: Calcular a Escala (S) e o Ponto Zero (Z)
Para mapear o intervalo contínuo dos nossos pesos reais para o intervalo discreto , primeiro identificamos os extremos dos dados originais:
A. Cálculo da Escala (S)
A escala determina a distância representada por cada degrau do inteiro:
B. Cálculo do Ponto Zero (Z)
O ponto zero ajusta a escala para que o valor real correspondente a $0.0$ seja representado perfeitamente por um inteiro:
Passo 2: Quantização ()
Agora aplicamos a fórmula de quantização uniformizada para cada um dos pesos originais:
- Para :
- Para :
- Para :
- Para :
Resultado Comprimido
Em vez de salvar os 4 números flutuantes pesados de 32 bits, o modelo salva apenas a sequência de inteiros de 4 bits:
Além do vetor q, o modelo precisa armazenar os metadados de bloco: S = 0.122 e Z = 7.
Ganho de memória: Cada peso q ocupa agora apenas 4 bits (0,5 byte) em vez de 32 bits (4 bytes). Redução de 8x no tamanho dos pesos.
Passo 3: Desquantização na Inferência ()
Quando a LLM precisa realizar as multiplicações de matrizes durante a geração de um token, ela desquantiza temporariamente esses inteiros de volta para ponto flutuante usando a fórmula inversa:
- (Original: -0.85)
- (Original: 0.12)
- (Original: 0.45)
- (Original: 0.98)
Avaliação do Erro de Quantização
Analisando a diferença entre os pesos originais e os desquantizados:
| Valor Original (X) | Valor Reconstruído (X′) | Erro Absoluto (∣X−X′∣) |
| -0.85 | -0.854 | 0.004 |
| 0.12 | 0.122 | 0.002 |
| 0.45 | 0.488 | 0.038 |
| 0.98 | 0.976 | 0.004 |
A perda de precisão é na casa dos centésimos. Para bilhões de conexões em uma rede neural, esse pequeno desvio numérico é absorvido pela robustez do modelo, enquanto os ganhos em consumo de VRAM e velocidade de execução são significativos.