Avançado

Quantization I: int8, int4, o básico

Quantization desce o Qwen3.8-27B a partir de 54 GB; artefatos de texto quase-4-bit fixados vão de 15,7 a 17,9 GB, com Q4_K_M em 17,1 GB, enquanto formatos de bits menores trocam mais qualidade por alcance.

Atualizada em

01 · Conceito

Conceito

Você quer rodar o Qwen3.8-27B, e o primeiro número que o recebe é 54 GB — a pegada de pesos em bf16 que a matemática de orçamento do curso estabelece (lições 7.2 e 9.3). Nenhuma GPU de consumo comporta isso, e mesmo uma placa de data center de 80 GB entrega a maior parte de si antes de alocar um único token de cache. Quantization é a resposta padrão: guardar cada parâmetro em menos bits mais um pouco de metadado de escala, e aceitar algum erro de aproximação em troca.

A escada fica mais fácil de ver em bytes por parâmetro. bf16 gasta dois bytes em cada um dos cerca de 27 bilhões de parâmetros do modelo — o ponto de partida de 54 GB. Int8 gasta um byte: metade disso, cerca de 27 GB. Int4 gasta meio byte: metade de novo, um piso de 13,5 GB. Na revisão comunitária fixada, arquivos GGUF próximos de 4 bits do modelo de texto vão de 15,7 a 17,9 GB (14,6–16,7 GiB), e o Q4_K_M tem 17,1 GB (15,93 GiB), porque metadados de grupo e tensores selecionados em precisão maior viajam junto. Essa taxa real costuma ser descrita como bits por peso, ou bpw, mas um bpw exato exige o denominador exato de tensores do artefato; a contagem comercial de 27B é arredondada e inclui a torre de visão separada. Uma GPU de consumo de 24 GB é, portanto, um cenário de deploy do curso para esses pesos de texto mais cache e folga de runtime, não um mínimo afirmado pelo model card. A lição 7.12 detalha esse cenário.

O que os degraus de fato fazem é mapear valores reais num codebook discreto. Na quantization uniforme simétrica, um valor real xx vira um código inteiro qq por meio de uma escala ss:

q=clip(round(x/s),qmin,qmax),x^=sq.q=\operatorname{clip}\left(\operatorname{round}(x/s),q_{min},q_{max}\right), \qquad \hat{x}=s q.

Variantes afins acrescentam um zero point para que a faixa representada não precise se distribuir simetricamente em torno de zero. O arredondamento mapeia muitos reais próximos para um mesmo código; o clipping mapeia extremos para a fronteira; a diferença entre xx e x^\hat{x} é o erro de quantization.

Dizer apenas int8 ou int4 é uma frase incompleta. Pergunte o que está quantizado — pesos, ativações ou o KV cache; em que granularidade — tensor inteiro, canal de saída, grupo ou token; se a representação é simétrica; e em que dtype os produtos são acumulados. Um formato de peso de 4 bits rotineiramente multiplica por ativações de 16 bits e acumula em precisão mais alta.

A granularidade é o trade central. Uma escala por tensor é quase gratuita em metadado, mas precisa abranger a maior magnitude do tensor, então um único peso outlier torna o passo mais grosseiro para todos os valores comuns. Escalas por canal se adaptam a linhas ou colunas; a quantization por grupos fatia uma dimensão em blocos de, digamos, 32–128 valores, cada um com sua própria escala — melhor ajuste local, mais metadado, kernels mais complexos. Pesos e ativações também se comportam de modo diferente: pesos são fixos e podem ser calibrados offline, enquanto ativações dependem do prompt e podem carregar outliers violentos por canal. A contribuição do SmoothQuant foi um reescalonamento matematicamente equivalente que desloca a dificuldade de quantization das ativações para os pesos, facilitando esquemas conjuntos de pesos e ativações.

Por que isso ajuda a velocidade e não só o espaço em disco? Lembre da lição 7.3: decode é memory-bound, movendo aproximadamente todo o conjunto de pesos por token gerado. Quantization apenas de pesos corta precisamente esses bytes. Aqui está o equívoco clássico: um runtime carrega um arquivo de 4 bits e então expande cada tensor para ponto flutuante em memória antes de calcular. O download foi pequeno; memória residente e largura de banda seguem inalteradas; tokens por segundo não se movem. A correção são kernels empacotados nativos que dequantizam tile a tile dentro da multiplicação, de modo que a forma compacta é o que de fato atravessa o barramento de memória. Sempre verifique qual caminho seu runtime tomou medindo a memória residente após o carregamento, e não lendo o nome do arquivo.

A perda de acurácia é desigual pela rede: algumas camadas e canais são muito mais sensíveis, e esquemas mistos mantêm embeddings, output heads ou tensores frágeis em precisão mais alta. Perplexidade é um sinal, mas validade de saída estruturada, comportamento multilíngue e estabilidade em contexto longo podem revelar falhas que as médias escondem. Conjuntos de calibração também importam — um quantizador ajustado em prompts curtos em inglês pode não preservar o comportamento em código ou em documentos de 100.000 tokens.

O modelo durável é uma aproximação medida. Códigos discretos economizam capacidade e, com os kernels certos, largura de banda; escalas reconstroem magnitudes úteis; o agrupamento se adapta às estatísticas locais; acumuladores preservam faixa. A escada de 54 passando por 27 rumo aos artefatos de texto próximos de 4 bits fixados entre 15,7 e 17,9 GB é o que move o Qwen3.8-27B do data center para a sua mesa — e a lição 7.10 é dona dos tamanhos e fontes exatos.

02 · Analogia

Analogia

Um topógrafo registra altitudes de montanhas. Anotar cada medição ao milímetro é volumoso; registrar cada uma como um entre alguns milhares de degraus relativos a um vale local é compacto. Regiões amplas precisam de degraus grosseiros, enquanto uma escala separada para cada pequeno quadrante do mapa acompanha o relevo de perto. Quantization igualmente mapeia pesos reais em códigos discretos, e o agrupamento escolhe se uma escala precisa cobrir uma cordilheira inteira ou apenas uma vizinhança.

03 · Explique de volta

Explique de volta

Desça o Qwen3.8-27B pela escada de quantization, de bf16 até 4 bits, explique a mecânica de escala e zero point por trás de cada degrau e diga o que a escada não encolhe.

Mínimo: 80 caracteres e 15 palavras. Seu texto fica somente neste navegador.

Aguardando sua explicação.

Comparar com uma resposta-modelo

Em bf16 cada parâmetro custa dois bytes, dando a cifra de 54 GB que a matemática de orçamento do curso estabelece. Int8 guarda um byte por parâmetro, reduzindo os pesos pela metade, a cerca de 27 GB; códigos puros de 4 bits definem um piso de 13,5 GB. Na revisão comunitária fixada, os arquivos do modelo de texto próximos de 4 bits vão de 15,7 a 17,9 GB e o Q4_K_M tem 17,1 GB, porque metadados de grupo e tensores selecionados em precisão maior viajam junto. Cada degrau mapeia valores reais para códigos discretos por meio de uma escala, então arredondamento e clipping introduzem erro, e a granularidade dos grupos decide o quanto as escalas acompanham distribuições locais. A escada encolhe apenas os pesos: o KV cache continua acumulando a 64 KiB por token a menos que o próprio cache seja quantizado, e ganhos de velocidade exigem kernels compatíveis.

04 · Teste seu entendimento

Teste seu entendimento

01O que cria o erro de quantization?
Resposta e explicação

Arredondar valores para níveis discretos e fazer clipping de valores fora da faixa representada — Um codebook finito não consegue representar todo valor real, e sua faixa finita pode fazer clipping dos extremos.

02Usando a lição 7.3, por que quantization apenas de pesos ajuda mais o decode do que o prefill?
Resposta e explicação

Decode é limitado por largura de banda de memória ao ler os pesos a cada token, então encolher os bytes de peso ataca sua restrição dominante — A lição 7.3 mostrou que o decode movimenta aproximadamente todo o conjunto de pesos por token gerado; menos bytes armazenados significa menos bytes movidos exatamente onde a largura de banda é o gargalo.

Conclua o teach-back e acerte o quiz para finalizar a aula.

◎ · Marcador de evidência

Fontes

  1. Guangxuan Xiao et al. (2022). SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models.
  2. Qwen Team (2026). Qwen3.8-27B Model Card.