INT4 / INT3 / INT2 — Quantification Extrême#
TL;DR — La quantification sub-4-bit est la frontière ultime de la compression des LLMs. INT4 est le sweet spot quasi-lossless avec les méthodes modernes (GPTQ, AWQ, GGUF Q4_K_M). INT3 reste acceptable pour les grands modèles (≥ 30B) mais dégrade notablement les petits. INT2 est le régime extrême qui exige des méthodes avancées (vector quantization, codebooks appris) comme AQLM ou QuIP#. Comprendre la courbe de dégradation perplexity-vs-bits est le facteur de décision.
Le spectre de la quantification extrême#
| Bits | Niveaux | Régime |
|---|---|---|
| 16 bit | 65 536 | FP16/BF16 — Référence |
| 8 bit | 256 | INT8/FP8 — Quasi-lossless ✅ |
| 4 bit | 16 | INT4 — Sweet spot, quasi-lossless ✅ |
| 3 bit | 8 | INT3 — Acceptable pour grands modèles ⚠️ |
| 2 bit | 4 | INT2 — Extrême, méthodes avancées requises |
| 1.58 bit | 3 | Ternary {-1,0,+1} — BitNet b1.58 |
| 1 bit | 2 | Binary {-1,+1} — BitNet, recherche |
↓ Plus on descend en bits, plus le « gap » se creuse entre les méthodes naïves et les méthodes avancées.
Le défi de la quantification sub-4-bit#
Niveau néophyte#
Imaginez que vous devez peindre un portrait avec de moins en moins de couleurs. Avec 256 nuances (INT8), le portrait est fidèle. Avec 16 nuances (INT4), c'est encore bon — les ombres et les couleurs principales sont là. Avec 4 nuances (INT2), ça devient un collage : les détails disparaissent, le visage est à peine reconnaissable.
Pour les LLMs, c'est pareil. En dessous de 4 bits, la « palette » est si limitée que chaque niveau doit être placé stratégiquement, pas uniformément. C'est là que les méthodes avancées (vector quantization, codebooks appris, incoherence processing) entrent en jeu.
Pourquoi INT4 est le sweet spot#
Le mur du sub-4-bit#
En dessous de 4 bits, trois problèmes majeurs apparaissent :
Dégradation de la perplexité vs bits#
La courbe fondamentale#
| Bits | FP16 | INT4 | INT3 | INT2 |
|---|---|---|---|---|
| GPTQ | 5.47 | 5.55 | 6.45 | 11.36 ❌ |
| AWQ | 5.47 | 5.60 | 6.50 | 8.48 ⚠️ |
| QuIP# | 5.47 | 5.53 | 6.01 | 7.27 ✅ |
| AQLM | 5.47 | — | — | 7.50 ✅ |
Lecture : FP16 → INT4 : dégradation MINIME (+0.1 PPL) · INT4 → INT3 : MODÉRÉE (+0.5-1.0 PPL) · INT3 → INT2 : MASSIVE selon méthode (GPTQ: +3 PPL, AWQ: +1.5 PPL, QuIP#/AQLM: +0.5 PPL)
Tableau détaillé par méthode et modèle#
Llama-2-7B (WikiText2 PPL)#
| Méthode | FP16 | INT4 | INT3 | INT2 |
|---|---|---|---|---|
| GPTQ | 5.47 | 5.55 | 6.45 | 11.36 ❌ |
| AWQ | 5.47 | 5.60 | 6.50 | 8.48 ⚠️ |
| HQQ | 5.47 | 5.64 | 6.77 | — |
| OmniQuant | 5.47 | 5.59 | 6.23 | — |
| QuIP# | 5.47 | 5.53 | 6.01 | 7.27 ✅ |
| AQLM | 5.47 | — | — | 7.50 ✅ |
Llama-2-70B (WikiText2 PPL)#
| Méthode | FP16 | INT4 | INT3 | INT2 |
|---|---|---|---|---|
| GPTQ | 3.32 | 3.37 | 3.75 | 5.15 ⚠️ |
| AWQ | 3.32 | 3.38 | 3.82 | 4.80 ⚠️ |
| QuIP# | 3.32 | 3.35 | 3.58 | 4.20 ✅ |
| AQLM | 3.32 | — | — | 4.50 ✅ |
Observation clé : les grands modèles (≥ 30B) sont beaucoup plus robustes à la quantification extrême. Un INT2 sur un 70B peut être meilleur qu'un INT4 sur un 7B. C'est le principe de overquantization : mieux vaut un grand modèle ultra-quantifié qu'un petit modèle en haute précision.
INT4 — Le sweet spot en détail#
Méthodes recommandées#
| Méthode | PPL (7B) | Temps | Usage optimal |
|---|---|---|---|
| GPTQ | 5.55 | ~5 min | Serving (vLLM) |
| AWQ | 5.60 | ~10 min | Edge, accuracy |
| GGUF Q4_K_M | 5.59 | ~5 min | CPU/llama.cpp |
| HQQ | 5.64 | <1 min | No-calib, rapide |
| ExLlamaV2 | 5.55 | ~10 min | GPU single-user |
Pourquoi INT4 fonctionne si bien#
INT3 — La zone limite#
Quand INT3 est acceptable#
Méthodes INT3 viables#
| Méthode | PPL 7B | PPL 70B | Calibration requise | Notes |
|---|---|---|---|---|
| GPTQ W3 | 6.45 | 3.75 | ✅ | Dégradation notable sur 7B |
| AWQ W3 | 6.50 | 3.82 | ✅ | Similaire à GPTQ |
| OmniQuant W3A16 | 6.23 | — | ✅ | Meilleur que GPTQ/AWQ |
| HQQ W3 | 6.77 | — | ❌ | Pas de calibration, mais moins précis |
| GGUF Q3_K_M | ~6.6 | ~3.9 | ❌ | Pour llama.cpp / CPU |
| QuIP# W3 | 6.01 | 3.58 | ✅ | SOTA en INT3 |
INT2 — Le régime extrême#
Pourquoi la quantification scalaire échoue en INT2#
Les méthodes qui réussissent en INT2#
Seules les méthodes de vector quantization et d'incoherence processing fonctionnent en INT2 :
| # | Méthode | Technique | PPL (Llama-7B) | arXiv |
|---|---|---|---|---|
| 1 | QuIP# | Incoherence Processing · RHT · Vector codebook | 7.27 (SOTA) | 2402.04396 |
| 2 | AQLM | Multi-codebook additive quantization | 7.50 | 2401.06118 |
| 3 | GPTQ + VQ | GPTQ avec codebook non-uniforme | ~9-10 | — |
| 4 | GGUF Q2_K | Quantification par bloc avec scales | ~8-9 | — |
QuIP# — le SOTA en INT2#
U = H × W (H = matrice de Hadamard aléatoire)
→ « mélange » les poids → décorrélation"] RHT --> U["**U** : poids incohérents (décorrélation)"] U --> VQ["**Vector Quantization** avec codebook Lloyd
Quantification par blocs de 8 poids"] VQ --> Q["**Q** : indices de codebook (~2 bits/poids)"] Q -.->|"À l'inférence"| INF["Q → codebook lookup → U → H⁻¹ × U → W_approx"]
La RHT « étale » l'information uniformément, donc chaque poids contient un peu de TOUTE la matrice → la quantification est beaucoup plus robuste.
Diagramme de décision : quel format choisir ?#
Comparaison des méthodes par régime#
| Méthode | INT4 | INT3 | INT2 | Calibration | Temps quantif. | Support |
|---|---|---|---|---|---|---|
| GPTQ | ✅✅ | ⚠️ | ❌ | ✅ | ~5 min | Excellent |
| AWQ | ✅✅ | ⚠️ | ⚠️ | ✅ | ~10 min | Excellent |
| HQQ | ✅ | ⚠️ | — | ❌ | <1 min | Bon |
| OmniQuant | ✅ | ✅ | — | ✅ | ~30 min | Partiel |
| GGUF (Q4_K_M) | ✅✅ | ✅ | ⚠️ | ❌ | ~5 min | Excellent |
| QuIP# | ✅ | ✅ | ✅✅ SOTA | ✅ | Long | Partiel |
| AQLM | — | — | ✅✅ | ✅ | Très long | Partiel |
| ExLlamaV2 | ✅✅ | ✅ | — | ❌ | ~10 min | Bon |
Légende : ✅✅ = recommandé, ✅ = bon, ⚠️ = acceptable avec réserves, ❌ = éviter, — = non supporté
Le principe d'overquantization#
State of the art en ultra-low bit (2024-2025)#
Timeline des avancées#
Méthodes à surveiller#
| Méthode | Bits | Innovation | Statut |
|---|---|---|---|
| BitNet b1.58 | 1.58 | Ternary {-1,0,+1}, entraîné from scratch | Publication JMLR 2025 |
| QuIP# | ~2 | Incoherence processing + RHT + codebook | SOTA PTQ 2-bit |
| AQLM | ~2 | Multi-codebook additive VQ | Compétitif 2-bit |
| OmniQuant | 3 | Learnable clipping + smoothing | Amélioration INT3 |
| SqueezeLLM | 3 | Dense-and-sparse (outliers en FP16) | Alternative INT3 |
Quand utiliser vs éviter#
• Modèle trop gros pour la VRAM
• GPU consommateur (RTX 3090/4090)
• Serving avec vLLM / llama.cpp
• Edge computing
→ Perte < 2% d'accuracy, 4× compression"] INT3U["✅ UTILISER INT3 si :
• Modèle ≥ 30B et VRAM très limitée
• Cas d'usage tolérant (chat informel)
• Overquantization favorable
→ Perte 3-8% d'accuracy, 5× compression"] INT2U["✅ UTILISER INT2 si :
• Recherche / expérimentation
• Edge computing extrême
• Modèle ≥ 70B, budget mémoire serré
• Acceptation d'hallucinations accrues
→ Perte 10-30% d'accuracy, 8× compression"] AVOID["❌ ÉVITER INT3/INT2 si :
• Tâches de précision critique (médical, juridique)
• Modèle < 7B (trop peu de redondance)
• Code generation (très sensible)
• Math reasoning (chaînes fragiles)
• Production sans évaluation approfondie"]
Exemple pratique#
INT4 avec GPTQ (le standard)#
# Installation
pip install auto-gptq optimum
# Quantification INT4
python -m auto_gptq.examples.quantize \
--model-path meta-llama/Llama-2-7b-hf \
--bits 4 \
--group-size 128 \
--calibration-dataset c4 \
--num-samples 128 \
--output-dir ./llama-7b-gptq-4bit
# Servir avec vLLM (GPTQ + Marlin automatique)
python -m vllm.entrypoints.openai.api_server \
--model ./llama-7b-gptq-4bit \
--quantization gptq
INT3 avec GGUF (llama.cpp)#
# Conversion + quantification Q3_K_M
./quantize \
./models/llama-7b-fp16.gguf \
./models/llama-7b-Q3_K_M.gguf \
Q3_K_M
# Résultat :
# - Taille : 13.5 GB → 3.3 GB
# - PPL WikiText2 : ~6.6
# - Inférence CPU/GPU avec llama.cpp
./main -m ./models/llama-7b-Q3_K_M.gguf -p "Bonjour"
INT2 avec QuIP#
# Installation
pip install quip-sharp
# Quantification 2-bit avec incoherence processing
python -m quipsharp.quantize \
--model-path meta-llama/Llama-2-7b-hf \
--codebook E8P12 \
--bits 2 \
--hadamard-transform \
--output-dir ./llama-7b-quip-2bit
# Résultat attendu :
# - Taille : 13.5 GB → ~2.2 GB
# - PPL WikiText2 : ~7.27 (SOTA 2-bit)
# - Temps : plusieurs heures
INT2 avec AQLM#
# Installation
pip install auto-aqlm
# Quantification 2-bit (2 codebooks × 8-bit indices)
python -m auto_aqlm \
--model meta-llama/Llama-2-7b-hf \
--output_dir ./llama-7b-aqlm-2bit \
--num_codebooks 2 \
--in_group_size 8 \
--num_indices 256 \
--calibration_dataset c4 \
--num_calibration_samples 128
# Résultat :
# - Taille : 13.5 GB → ~2.5 GB
# - PPL WikiText2 : ~7.50
# - Temps : 2-6h sur A100
Comparaison rapide des formats GGUF (llama.cpp)#
# Lister les quantifications disponibles
# Format : Q{bits}_{variant}
# Recommandations par objectif :
# Q4_K_M → Sweet spot (4-bit, ~5.59 PPL sur 7B)
# Q3_K_M → Bon compromis mémoire (3-bit, ~6.6 PPL)
# Q3_K_L → Meilleur INT3 (plus de poids en 4-bit)
# Q2_K → Ultra-compact (2-bit, ~8.5 PPL — limite)
# Q2_K_S → Plus petit possible (qualité dégradée)
Références#
- GPTQ — Frantar et al., "GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers", ICLR 2023 — arXiv:2210.17323
- AWQ — Lin et al., "AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration", MLSys 2024 — arXiv:2306.00978
- QuIP# — Tseng et al., "QuIP#: Even Better LLM Quantization with Hadamard Incoherence and Lattice Codebooks", 2024 — arXiv:2402.04396
- AQLM — Egiazarian et al., "Extreme Compression of Large Language Models via Additive Quantization", ICML 2024 — arXiv:2401.06118
- OmniQuant — Shao et al., "OmniQuant: Omnidirectionally Calibrated Quantization for Large Language Models", ICLR 2024 — arXiv:2308.13137
- HQQ — Mobius Labs, "Half-Quadratic Quantization (HQQ)", 2023 — github.com/mobiusml/hqq
- BitNet b1.58 — Wang et al., "The Era of 1-bit LLMs", 2024 — arXiv:2402.17764
- llama.cpp — github.com/ggerganov/llama.cpp — Quantifications GGUF Q2_K à Q8_0
- Voir aussi : GPTQ · AWQ · QuIP · AQLM · HQQ · GGUF · Index quantification