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#

block-beta columns 1 t["POURQUOI INT4 EST LE « SWEET SPOT » DE LA QUANTIFICATION LLM"] p1["1. COMPRESSION SUFFISANTE : 16 GB (FP16) → 4 GB (INT4) = 4× de réduction\nUn modèle 70B tient sur une RTX 4090 (24 GB)"] p2["2. PERTE DE QUALITÉ MINIMALE : PPL WikiText2 Llama-7B\nFP16 : 5.47 · INT4 : 5.55-5.60 (+0.08-0.13 seulement !)"] p3["3. 16 NIVEAUX = ASSEZ POUR LA DISTRIBUTION DES POIDS\nDistribution gaussienne → 16 niveaux bien placés suffisent"] p4["4. SUPPORT LARGE : llama.cpp, vLLM, ExLlama, Hugging Face\nDéquant à la volée via kernels optimisés"]

Le mur du sub-4-bit#

En dessous de 4 bits, trois problèmes majeurs apparaissent :

block-beta columns 1 t1["PROBLÈME 1 : TROP PEU DE NIVEAUX"] d1["INT4 : 16 niveaux ← suffisant pour une gaussienne\nINT3 : 8 niveaux ← limite, grande erreur de quantif.\nINT2 : 4 niveaux ← insuffisant en quantification scalaire\n\nLa quantification scalaire (1 poids = 1 index) échoue en INT2\n→ nécessite de la VECTOR quantization (plusieurs poids = 1 index dans un codebook)"]
block-beta columns 1 t2["PROBLÈME 2 : SENSIBILITÉ AUX OUTLIERS"] d2["Avec 4 niveaux (INT2), un seul outlier peut décaler\ntoute la plage de quantification → erreur massive\nsur tous les autres poids du groupe\n\nSolutions : mixed-precision (LLM.int8), clipping optimisé (AWQ),\nincoherence processing (QuIP#)"]
block-beta columns 1 t3["PROBLÈME 3 : PAS DE SUPPORT HARDWARE NATIF"] d3["Aucun GPU/CPU ne supporte le calcul direct en INT3 ou INT2\n→ déquantification obligatoire à la volée\n→ le speedup computationnel vient uniquement de la réduction\nde BANDE PASSANTE MÉMOIRE\n→ efficace uniquement pour les modèles memory-bound\n(generation, single-user, edge)"]

Dégradation de la perplexité vs bits#

La courbe fondamentale#

xychart-beta title "Perplexité WikiText2 — Llama-2-7B (plus bas = mieux)" x-axis "Bits/poids" [16, 8, 4, 3, 2] y-axis "Perplexité" 5 --> 12 line [5.47, 5.49, 5.57, 6.45, 11.36]
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#

block-beta columns 1 t["Distribution des poids d'un LLM (gaussienne, heavy-tailed)"] d["Densité concentrée entre -0.4 et +0.4\n16 niveaux INT4 bien placés couvrent DENSEMENT\nla zone centrale où 99% des poids se trouvent\n→ Erreur de quantification < 3% en moyenne"]

INT3 — La zone limite#

Quand INT3 est acceptable#

block-beta columns 1 t["RÈGLE EMPIRIQUE : INT3 est acceptable si taille_modèle ≥ 30B paramètres"] d["Pourquoi ? Les grands modèles ont une REDONDANCE massive dans leurs poids.\nLa quantification agit comme une régularisation — la perte d'information\nest compensée par le grand nombre de paramètres.\n\nLlama-2-70B INT3 (PPL 3.75) > Llama-2-7B FP16 (PPL 5.47)\n→ un 70B en INT3 est MEILLEUR qu'un 7B en pleine précision"]

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#

block-beta columns 1 t["QUANTIFICATION SCALAIRE INT2 — POURQUOI ÇA ÉCHOUE"] d1["4 niveaux seulement : {-1.5, -0.5, +0.5, +1.5}"] d2["Poids originaux : [0.037, 0.142, 0.091, 0.218, 0.055, 0.103, 0.176, 0.082]"] d3["Quantifiés INT2 (scalaire) : [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n↑ Tous arrondis au même niveau !"] d4["Erreur : énorme. Toute la structure fine est perdue.\nRésultat : modèle génère du bruit incohérent."]

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#

flowchart TD W["**W** : poids originaux (corrélés)"] W --> RHT["**Randomized Hadamard Transform**
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 ?#

flowchart TD Q1["Quelle est votre contrainte principale ?"] Q1 --> ACC["Accuracy maximale"] Q1 --> EQ["Bon équilibre accuracy/mémoire"] Q1 --> MP["Mémoire minimale, modèle petit < 13B"] Q1 --> MG["Mémoire minimale, modèle grand ≥ 30B"] Q1 --> CU["Compression ultime (edge extrême, recherche)"] Q1 --> RES["Recherche / 1-Bit"] ACC --> R1["**INT8 / FP8** (quasi-lossless, +0.02 PPL)"] EQ --> R2["**INT4** (sweet spot, +0.1 PPL, 4× compression)"] R2 --> R2a["Serving cloud ? → GPTQ + Marlin (vLLM)"] R2 --> R2b["Edge / CPU ? → GGUF Q4_K_M (llama.cpp)"] R2 --> R2c["No calibration ? → HQQ"] MP --> R3["**INT3** → QuIP# ou OmniQuant W3"] MG --> R4["**INT3** → GPTQ W3 ou GGUF Q3_K_M"] CU --> R5["**INT2** (~2 bits/poids)"] R5 --> R5a["Meilleure qualité ? → QuIP# ou AQLM"] R5 --> R5b["CPU ? → GGUF Q2_K (llama.cpp)"] RES --> R6["**BitNet b1.58** (ternary, entraînement from scratch)"]

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#

block-beta columns 1 t["OVERQUANTIZATION : PLUS GRAND + PLUS QUANTIFIÉ = MIEUX QUE PETIT + PRÉCIS"] budget["Scénario : budget mémoire ~5 GB"] oA["Option A : Llama-7B en FP16 (13.5 GB) → NE TIENT PAS"] oB["Option B : Llama-7B en INT4 (3.5 GB) → PPL 5.55"] oC["Option C : Llama-13B en INT3 (4.9 GB) → PPL 4.85 ✅ GAGNANT"] oD["Option D : Llama-70B en INT2 (17.5 GB) → NE TIENT PAS"] rule["Règle : pour un budget mémoire fixe, choisir le plus grand modèle possible\net le quantifier au niveau nécessaire pour rentrer dans le budget."]

State of the art en ultra-low bit (2024-2025)#

Timeline des avancées#

timeline title Timeline — Quantification sub-4-bit 2022 Q4 : LLM.int8() (Dettmers) — INT8 mixed-precision, gestion des outliers 2023 Q1 : GPTQ (Frantar et al.) — INT4 quasi-lossless, standard de facto 2023 Q2 : AWQ (Lin et al.) — INT4 sans calibration complexe, activation-aware 2023 Q4 : HQQ (Mobius Labs) — INT4/INT3 sans calibration, ultra-rapide : BitNet b1.58 (Microsoft) — ternary LLMs 2024 Q1 : AQLM (Egiazarian et al.) — 2-bit Pareto-optimal via additive VQ : QuIP# (Tseng et al.) — 2-bit SOTA via incoherence processing + RHT 2024 Q2 : OmniQuant (Shao et al.) — INT3 meilleur que GPTQ/AWQ via learnable clipping 2024 Q3 : GGUF Q2_K_S / Q3_K_L optimisés — quantification par blocs pour llama.cpp 2025 : BitNet b1.58 publié dans JMLR — entraînement from scratch en ternary Futur : FP4 natif (Blackwell B200) — potentiellement meilleur que INT4 scalaire

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#

flowchart TD INT4U["✅ UTILISER INT4 si :
• 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.cppgithub.com/ggerganov/llama.cpp — Quantifications GGUF Q2_K à Q8_0
  • Voir aussi : GPTQ · AWQ · QuIP · AQLM · HQQ · GGUF · Index quantification
ia llm quantification int4 int3 int2 sub-4-bit gptq awq quip aqlm hqq vector-quantization perplexity extreme-compression