Conceitos Básicos
Quantização: Reduzir a precisão dos pesos (eou ativações) de FP32BF16 para inteiros menores (INT8, INT4, INT3...).
| Precisão |
Bits |
Memória (7B model) |
Uso |
| FP32 |
32 |
~28 GB |
Optimizer states |
| BF16 |
16 |
~14 GB |
Treino padrão |
| FP16 |
16 |
~14 GB |
Treino (com loss scaling) |
| FP8 |
8 |
~7 GB |
H100+; treino/inferência |
| INT8 |
8 |
~7 GB |
Inferência; leve perda |
| INT4 |
4 |
~3.5 GB |
Inferência eficiente |
| INT3 |
3 |
~2.6 GB |
Experimental |
| 1.58-bit |
~1.6 |
~1.4 GB |
BitNet b1.58 |
PTQ (Post-Training Quantization): Quantiza modelo treinado — sem re-treino. QAT (Quantization-Aware Training): Treina simulando quantização — melhor qualidade, maior custo.
Métodos PTQ
GPTQ
- arXiv: 2210.17323 | ICLR 2023
- Autores: Frantar et al. (IST Austria)
- Mecanismo: Otimiza erros de quantização camada por camada usando segunda ordem (Hessian)
- Resultado: INT4 com perda < 1% vs FP16 em perplexidade
- Velocidade: ~0.25 GPU-hora para quantizar Llama 65B
- Implementação:
auto-gptq, optimum
AWQ — Activation-Aware Weight Quantization
- arXiv: 2306.00978 | MLSys 2024
- Autores: Lin et al. (MIT HAN Lab)
- Mecanismo: Identifica canais de peso "salientes" via ativações → escala-os para proteger precisão
- Resultado: Melhor que GPTQ em maioria dos benchmarks; mais rápido de aplicar
- Implementação:
autoawq
- Adoção: Amplamente usada em modelos distribuídos no HuggingFace
GGUF / GGML (llama.cpp)
- Origem: Georgi Gerganov (llama.cpp)
- Formato: Arquivo único com todos os pesos + metadados
- Quantizações: Q2K, Q3KM, Q4KM, Q5KM, Q6K, Q8_0
- Vantagem: CPU-friendly; funciona em M1/M2 Mac, CPU x86, sem GPU
- Uso: Ollama, Jan, LM Studio, GPT4All
BitsAndBytes (bitsandbytes)
- Autores: Tim Dettmers et al.
- arXiv: 2208.07339 (LLM.int8)
- Mecanismo: INT8 com separação de outliers para FP16; suporte a NF4 (double quant)
- Integração: HuggingFace
load_in_8bit, load_in_4bit; QLoRA usa NF4
- Limitação: CUDA-only; performance variável vs GPTQ/AWQ
Quantização Extrema (Sub-4 bits)
BitNet b1.58 (Microsoft)
- arXiv: 2402.17764
- Mecanismo: Todos os pesos em {-1, 0, +1} (1.58 bits); ativações em INT8
- Resultado: Perda nula em modelos ≥3B parâmetros; 71% menos memória que BF16
- Trade-off: Requer treinamento do zero em 1.58b; PTQ não funciona bem
- Implicação: Inferência apenas com operações de soma — sem multiplicações
SpQR — Sparse Quantization Representation
- arXiv: 2306.03078
- Mecanismo: Outliers em FP16; resto em 3-4 bits; esparsidade estruturada
- Resultado: Perda < 1% em INT3; melhor que GPTQ em baixa precisão
QuIP# (Cornell)
- arXiv: 2402.04396
- Mecanismo: Lattice codebooks para quantização de 2 bits; incoherence processing
- Resultado: Melhor qualidade em 2 bits
AQLM — Additive Quantization for Language Models
- arXiv: 2401.06118
- Mecanismo: Quantização aditiva — representa resíduo iterativamente
- Resultado: Estado da arte em 2 bits (abril 2025)
Quantização de KV Cache
TurboQuant (Google)
- arXiv: 2504.19874 | ICLR 2026
- Mecanismo: KV cache em 3.5 bits efetivos; quantização por bloco com calibração por ativações
- Resultado: ~6× menos memória; 8× speedup em H100; zero perda de qualidade
- Distinção: Quantiza cache (ativações em runtime), não pesos
FP8 KV Cache
- Adoção: vLLM, TensorRT-LLM, SGLang — suporte nativo FP8 para KV cache
- Resultado: ~2× redução de memória do cache vs FP16
INT4 KV Cache
- Experimental: Pode causar degradação em contextos longos; pesquisa ativa
NVFP4 (NVIDIA)
- Hardware: Blackwell (B100B200B300)
- Mecanismo: FP4 com scale factors por bloco; tensor cores nativos FP4
- Resultado: 2× throughput vs FP8; 4× vs FP16
- Disponibilidade: TensorRT-LLM com B100+
Quantização de Ativações
SmoothQuant
- arXiv: 2211.10438
- Mecanismo: Move "dificuldade" de quantização de ativações para pesos (migração de escala)
- Resultado: W8A8 (pesos e ativações INT8) com quase zero perda
- Adoção: TensorRT-LLM, vLLM
QuaRot
- arXiv: 2404.00456
- Mecanismo: Rotação de pesos antes da quantização para reduzir outliers
- Resultado: Melhor que SmoothQuant em INT4
Implementações e Ferramentas
| Ferramenta |
Métodos |
Uso |
auto-gptq |
GPTQ |
GPU; produção |
autoawq |
AWQ |
GPU; produção |
bitsandbytes |
INT8, NF4 |
HuggingFace integrado |
llama.cpp |
GGUF (Q2–Q8) |
CPU/GPU local |
optimum (HF) |
GPTQ, BnB, ONNX |
Integração HF |
llmcompressor |
GPTQ, AWQ, AQLM |
vLLM pipeline |
| TensorRT-LLM |
FP8, INT8, INT4, FP4 |
NVIDIA produção |
| OpenVINO |
INT8, INT4 |
Intel; edge |
Trade-offs Práticos
| Cenário |
Recomendação |
| 1 GPU consumer (24 GB) — modelo 70B |
AWQ ou GPTQ INT4 + offload |
| Mac M1M2M3 — CPU |
GGUF Q4KM ou Q5KM |
| Servidor A100 80GB — throughput |
FP8 + FP8 KV cache (vLLM) |
| Edge / mobile |
INT4 com ONNX Runtime |
| Qualidade máxima com quantização |
AWQ INT4 > GPTQ INT4 |
| Pesquisa em bits extremos |
AQLM ou QuIP# (2 bits) |
Impacto no Kode
- Deploy local no laptop do dev: GGUF Q4KM do Qwen2.5-Coder-7B via Ollama
- Servidor s.r1: AWQ INT4 do Qwen2.5-Coder-32B (cabe em 2× RTX 4090)
- Fine-tuning com QLoRA: NF4 (bitsandbytes) + LoRA adapters — treina 32B em 1 GPU
- Produção: FP8 quando H100 estiver disponível; TurboQuant para KV cache