Mémoire et stockage pour l'IA : Guide complet HBM, VRAM, NVMe en 2026
Si les GPU sont le moteur de l’IA, la mémoire est le carburant. Un GPU H100 à 35k€ devient inutile si vous n’avez pas assez de VRAM pour charger votre modèle. La mémoire représente souvent le goulot d’étranglement principal en IA.
Ce guide couvre :
- VRAM (GPU memory) - HBM, GDDR, calculs de besoins
- RAM système - DDR, capacité, bande passante
- Stockage - NVMe, SSD, datasets volumineux
- Hiérarchie mémoire - Cache, optimisations
- Techniques d’optimisation - Offloading, quantization, caching

La hiérarchie mémoire en IA
Vue d’ensemble
Vitesse Capacité Coût/GB
↑ ↓ ↓
┌─────────────────────────────────────────────────────────────┐
│ L1/L2 Cache │ 1-10 TB/s │ 10-100 MB │ N/A │
├─────────────────────────────────────────────────────────────┤
│ VRAM (HBM3) │ 3-10 TB/s │ 24-192 GB │ 150€ │
├─────────────────────────────────────────────────────────────┤
│ VRAM (GDDR6) │ 0.5-1 TB/s │ 12-48 GB │ 75€ │
├─────────────────────────────────────────────────────────────┤
│ RAM (DDR5) │ 50-90 GB/s │ 64-2048 GB │ 15€ │
├─────────────────────────────────────────────────────────────┤
│ NVMe SSD (Gen5) │ 10-14 GB/s │ 1-8 TB │ 0.10€ │
├─────────────────────────────────────────────────────────────┤
│ SATA SSD │ 0.5 GB/s │ 1-8 TB │ 0.08€ │
├─────────────────────────────────────────────────────────────┤
│ HDD │ 0.15 GB/s │ 4-20 TB │ 0.02€ │
└─────────────────────────────────────────────────────────────┘
Latence comparative
| Type | Latence | Cas d’usage IA |
|---|---|---|
| L1 Cache | 0.5 ns | Registres GPU |
| L2 Cache | 5-10 ns | Données immédiates GPU |
| HBM3 (VRAM) | 100-200 ns | Poids modèle, activations |
| GDDR6 (VRAM) | 200-300 ns | Gaming GPUs |
| DDR5 (RAM) | 60-80 ns | Offload optimizer states |
| NVMe Gen5 | 10-20 µs | Datasets, checkpoints |
| SATA SSD | 50-100 µs | Datasets froids |
| HDD | 5-10 ms | Archives |
Règle d’or : Garder les données chaudes (poids, activations) le plus proche du compute (VRAM).
VRAM : Le facteur limitant
Types de VRAM
HBM (High Bandwidth Memory)
Architecture : Puces mémoire empilées verticalement (3D stacking) directement sur le GPU.
Vue latérale HBM3 :
┌─────────────────────┐
│ GPU Die │
├─────────────────────┤
│ Interposer │
├──┬──┬──┬──┬──┬──┬──┤
│H │H │H │H │H │H │H │ ← 8 stacks HBM3
│B │B │B │B │B │B │B │ (chaque stack = 12 GB)
│M │M │M │M │M │M │M │ Total = 96 GB
│3 │3 │3 │3 │3 │3 │3 │
└──┴──┴──┴──┴──┴──┴──┘
Interconnexion : Microbumps (25 µm pitch)
Bande passante : 1.2 TB/s par stack
Total : 9.6 TB/s (8 stacks)
Évolution HBM :
| Génération | Année | Bande passante/stack | Capacité/stack | Utilisé par |
|---|---|---|---|---|
| HBM1 | 2015 | 128 GB/s | 4 GB | AMD Fury X |
| HBM2 | 2018 | 307 GB/s | 8 GB | Tesla V100 |
| HBM2e | 2020 | 410 GB/s | 16 GB | A100 80GB |
| HBM3 | 2023 | 819 GB/s | 24 GB | H100 80GB |
| HBM3e | 2024 | 1 150 GB/s | 36 GB | H200 141GB |
Avantages HBM :
- ✅ Bande passante extrême : 3-10 TB/s (vs 500-1000 GB/s GDDR6)
- ✅ Faible latence : Proximité physique GPU
- ✅ Efficacité énergétique : 2× meilleure que GDDR6
- ❌ Coût élevé : 150-200€/GB vs 30-75€/GB GDDR6
- ❌ Capacité limitée : Max 192 GB (AMD MI300X)
Utilisé par : GPU datacenter (A100, H100, MI300X), consoles (PS5).
GDDR6/GDDR6X
Architecture : Puces mémoire disposées autour du GPU sur le PCB.
Vue du dessus PCB :
┌──────┬──────┬──────┬──────┐
│GDDR6 │GDDR6 │GDDR6 │GDDR6 │
├──────┴──────┴──────┴──────┤
│ │
│ GPU Die │
│ │
├──────┬──────┬──────┬──────┤
│GDDR6 │GDDR6 │GDDR6 │GDDR6 │
└──────┴──────┴──────┴──────┘
Interconnexion : PCB traces (plusieurs cm)
Bande passante : 64 GB/s par puce (×12-16 puces)
Total : 768-1008 GB/s
Comparaison GDDR6 vs GDDR6X :
| Caractéristique | GDDR6 | GDDR6X |
|---|---|---|
| Fréquence | 14-16 Gbps | 19-21 Gbps |
| Signaling | NRZ (2 niveaux) | PAM4 (4 niveaux) |
| Bande passante | 500-700 GB/s | 800-1000 GB/s |
| Consommation | Référence | +15% |
| Coût | Référence | +20% |
Utilisé par : GPU consumer (RTX 40, RX 7900), GPU Pro (RTX 6000 Ada).
Avantages GDDR6 :
- ✅ Coût modéré : 30-75€/GB
- ✅ Capacité élevée : Jusqu’à 48 GB (RTX 6000 Ada)
- ✅ Disponibilité : Mature, production de masse
- ❌ Bande passante limitée : 3-10× moins que HBM3
- ❌ Consommation plus élevée : 2× vs HBM
Calculs de besoins VRAM
Formule générale
VRAM_needed = (
Model_params × Bytes_per_param × Model_multiplier +
Batch_size × Seq_length × Hidden_size × Layers × Activation_multiplier
)
Où :
- Model_params : Nombre de paramètres (7B, 13B, 70B)
- Bytes_per_param : 4 (FP32), 2 (FP16/BF16), 1 (INT8), 0.5 (INT4)
- Model_multiplier : 1.0 (inférence), 1.5 (LoRA), 4.0 (full fine-tuning)
- Activation_multiplier : Dépend de l'architecture (1.0-2.0)
Exemples concrets
Inférence LLaMA 2 7B (FP16)
# Paramètres du modèle
params = 7_000_000_000 # 7B
bytes_per_param = 2 # FP16
overhead = 1.2 # Inférence (activations, KV cache)
# Calcul
model_vram = params × bytes_per_param × overhead
model_vram = 7B × 2 × 1.2 = 16.8 GB
# Activations (batch_size=1, seq_len=2048)
batch_size = 1
seq_length = 2048
hidden_size = 4096
layers = 32
activation_size = batch_size × seq_length × hidden_size × layers × 2 # FP16
activation_gb = activation_size / 1e9 = 0.54 GB
# KV Cache (important pour génération)
kv_cache = batch_size × seq_length × layers × hidden_size × 2 × 2 # K et V
kv_cache_gb = kv_cache / 1e9 = 1.08 GB
# Total
total_vram = 16.8 + 0.54 + 1.08 = 18.42 GB
# GPU nécessaire : RTX 4090 (24 GB) ✅
Fine-tuning LoRA LLaMA 2 13B
# Modèle base
base_vram = 13B × 2 × 1.2 = 31.2 GB
# LoRA adapters (rank=64, alpha=128)
# Seulement ~1% des paramètres entraînés
lora_params = 13B × 0.01 = 130M
lora_vram = 130M × 2 × 4 = 1.04 GB # × 4 pour gradients + optimizer
# Activations avec gradient checkpointing
batch_size = 4
activation_multiplier = 0.4 # Checkpointing réduit de 60%
activation_vram = 4 × 2048 × 4096 × 32 × 2 × 0.4 / 1e9 = 3.4 GB
# Total
total_vram = 31.2 + 1.04 + 3.4 = 35.64 GB
# GPU nécessaire : A100 40GB ✅
# Ou : 2× RTX 4090 (48 GB total) ✅
Fine-tuning full LLaMA 2 70B
# Modèle
model_vram = 70B × 2 = 140 GB
# Gradients (même taille que modèle)
gradient_vram = 140 GB
# Optimizer states (Adam = 2× modèle)
optimizer_vram = 140 GB × 2 = 280 GB
# Activations (batch=8, avec checkpointing)
activation_vram = 8 × 2048 × 8192 × 80 × 2 × 0.4 / 1e9 = 17 GB
# Total
total_vram = 140 + 140 + 280 + 17 = 577 GB
# GPU nécessaire : 8× A100 80GB (640 GB) ✅
# Avec DeepSpeed ZeRO-3 + offloading : 4× A100 80GB ✅
Calculer vos besoins VRAM : Formule = params × bytes × overhead. Inférence LLaMA 7B FP16 : 7B × 2 bytes × 1.2 = 17 GB (RTX 4090 24GB OK). LLaMA 13B : 31 GB (A100 40GB ou 2× RTX 4090). LLaMA 70B : 168 GB (3× A100 80GB minimum). LoRA fine-tuning ajoute ~20% VRAM, full fine-tuning ×4. Quantization INT8 ÷ VRAM par 2, INT4 par 4.
Tableau récapitulatif besoins VRAM
| Modèle | Paramètres | FP16 Inférence | INT8 Inférence | INT4 Inférence | LoRA Fine-tuning | Full Fine-tuning |
|---|---|---|---|---|---|---|
| GPT-2 | 1.5B | 3.6 GB | 1.8 GB | 0.9 GB | 6 GB | 24 GB |
| LLaMA 7B | 7B | 17 GB | 8.5 GB | 4.2 GB | 25 GB | 112 GB |
| LLaMA 13B | 13B | 31 GB | 15.5 GB | 7.8 GB | 40 GB | 208 GB |
| LLaMA 34B | 34B | 82 GB | 41 GB | 20 GB | 95 GB | 544 GB |
| LLaMA 70B | 70B | 168 GB | 84 GB | 42 GB | 190 GB | 1120 GB |
| Mixtral 8×7B | 47B | 113 GB | 56 GB | 28 GB | 130 GB | 752 GB |
| GPT-3 175B | 175B | 420 GB | 210 GB | 105 GB | 480 GB | 2800 GB |
GPU recommandés par modèle :
| Modèle | Inférence FP16 | Inférence INT4 | LoRA FT | Full FT |
|---|---|---|---|---|
| 7B | RTX 4090 24GB | RTX 4070 Ti 12GB | RTX 4090 | 2× A100 40GB |
| 13B | A100 40GB | RTX 4090 | A100 40GB | 4× A100 40GB |
| 34B | 2× RTX 6000 48GB | A100 40GB | 2× A100 40GB | 8× A100 40GB |
| 70B | 3× A100 80GB | A100 80GB | 3× A100 80GB | 16× A100 80GB |
RAM système : Le complément essentiel
Rôle de la RAM en IA
Même avec beaucoup de VRAM, la RAM système reste cruciale :
- Offloading : Déplacer optimizer states de VRAM vers RAM (DeepSpeed ZeRO-Offload)
- Preprocessing : Charger et transformer datasets avant GPU
- Multi-processing : DataLoaders, augmentation parallèle
- Inférence avec offload : Modèles > VRAM en utilisant RAM
DDR5 vs DDR4
| Caractéristique | DDR4-3200 | DDR5-5600 | DDR5-6400 |
|---|---|---|---|
| Fréquence | 3200 MT/s | 5600 MT/s | 6400 MT/s |
| Bande passante/channel | 25.6 GB/s | 44.8 GB/s | 51.2 GB/s |
| Bande passante dual-channel | 51.2 GB/s | 89.6 GB/s | 102.4 GB/s |
| Latence CAS | 16-18 ns | 18-20 ns | 20-22 ns |
| Voltage | 1.2V | 1.1V | 1.1V |
| Prix (128GB) | 350€ | 500€ | 600€ |
Recommandation : DDR5-5600 (meilleur rapport performance/prix pour IA).
Capacité RAM recommandée
| Configuration GPU | RAM minimum | RAM recommandée | Use Case |
|---|---|---|---|
| 1× RTX 4070 Ti | 32 GB | 64 GB | Dev, Fine-tuning 7B |
| 1× RTX 4090 | 64 GB | 128 GB | Fine-tuning 13B |
| 2× RTX 4090 | 128 GB | 256 GB | Fine-tuning 34B |
| 4× A100 40GB | 256 GB | 512 GB | Training 70B avec offload |
| 8× A100 80GB | 512 GB | 1024 GB | Training 175B avec offload |
Règle empirique : RAM = 2× VRAM totale (pour offloading confortable).
Exemple : DeepSpeed ZeRO-Offload
# Configuration DeepSpeed avec offload RAM
ds_config = {
"train_batch_size": 64,
"train_micro_batch_size_per_gpu": 2,
"gradient_accumulation_steps": 8,
"fp16": {"enabled": True},
"zero_optimization": {
"stage": 2,
"offload_optimizer": {
"device": "cpu", # Optimizer states en RAM
"pin_memory": True # Accès plus rapide
}
}
}
# Avant offload : LLaMA 13B
# - VRAM : 31.2 (model) + 31.2 (gradients) + 62.4 (optimizer) = 124.8 GB
# - GPU nécessaire : 4× A100 40GB (160 GB)
# Avec offload optimizer :
# - VRAM : 31.2 (model) + 31.2 (gradients) = 62.4 GB
# - RAM : 62.4 GB (optimizer offloaded)
# - GPU nécessaire : 2× A100 40GB (80 GB) ✅
# - Perte de performance : ~15% (transferts RAM ↔ VRAM)
Impact performance offload :
| Config | VRAM utilisée | RAM utilisée | Temps/epoch | Perte perf |
|---|---|---|---|---|
| Sans offload | 100% | 10% | 1.0h | 0% |
| Offload optimizer | 60% | 40% | 1.15h | +15% |
| Offload params | 40% | 60% | 1.35h | +35% |
| Offload tout | 20% | 80% | 2.0h | +100% |
Trade-off : Offload optimizer = bon compromis (économie 40% VRAM, perte 15% vitesse).
Stockage : NVMe pour datasets
Importance du stockage rapide
Les datasets IA sont volumineux :
- ImageNet (1.4M images) : 150 GB
- Common Crawl : 250 TB
- The Pile (training LLM) : 825 GB
- LAION-5B (images) : 240 TB
Un stockage lent crée un goulot d’étranglement : le GPU attend les données.
Technologies de stockage
NVMe (SSD moderne)
Architecture : SSD connecté via PCIe (vs SATA pour anciens SSD).
| Génération | Interface | Bande passante | Latence | Prix/GB |
|---|---|---|---|---|
| SATA III | SATA 6 Gbps | 550 MB/s | 50-100 µs | 0.08€ |
| NVMe Gen3 | PCIe 3.0 ×4 | 3 500 MB/s | 10-20 µs | 0.10€ |
| NVMe Gen4 | PCIe 4.0 ×4 | 7 000 MB/s | 8-15 µs | 0.12€ |
| NVMe Gen5 | PCIe 5.0 ×4 | 14 000 MB/s | 5-10 µs | 0.20€ |
Recommandation : NVMe Gen4 (meilleur rapport performance/prix).
Comparaison lecture dataset
# Dataset : ImageNet (150 GB, 1.4M images)
# Batch size : 256 images
# Images/epoch : 1 400 000
# Calcul temps de lecture
# SATA SSD (550 MB/s)
read_time_sata = 150 GB / 0.55 GB/s = 273 secondes = 4.5 minutes
# NVMe Gen4 (7 GB/s)
read_time_nvme = 150 GB / 7 GB/s = 21 secondes
# Accélération : 13× plus rapide avec NVMe Gen4
Impact sur training :
| Stockage | Temps lecture | Temps compute | Temps total | GPU util |
|---|---|---|---|---|
| HDD (150 MB/s) | 17 min | 10 min | 27 min | 37% |
| SATA SSD | 4.5 min | 10 min | 14.5 min | 69% |
| NVMe Gen4 | 21 sec | 10 min | 10.4 min | 96% |
Constat : NVMe Gen4 permet utilisation GPU > 95% (vs 37% avec HDD).
Configurations RAID pour IA
RAID 0 (Striping)
Principe : Répartir les données sur plusieurs disques en parallèle.
Fichier A divisé en 4 morceaux :
┌──────┬──────┬──────┬──────┐
│ A1 │ A2 │ A3 │ A4 │
└──┬───┴──┬───┴──┬───┴──┬───┘
│ │ │ │
v v v v
┌──────┬──────┬──────┬──────┐
│NVMe 1│NVMe 2│NVMe 3│NVMe 4│
└──────┴──────┴──────┴──────┘
Lecture parallèle : 4× plus rapide
Performances RAID 0 :
| Config | Lecture | Écriture | Capacité | Coût |
|---|---|---|---|---|
| 1× NVMe Gen4 | 7 GB/s | 6 GB/s | 2 TB | 180€ |
| 2× RAID 0 | 14 GB/s | 12 GB/s | 4 TB | 360€ |
| 4× RAID 0 | 28 GB/s | 24 GB/s | 8 TB | 720€ |
Avantages :
- ✅ Performance maximale (N× disques)
- ✅ Capacité additive
Inconvénients :
- ❌ Pas de redondance (1 disque fail = tout perdu)
- ❌ Pour datasets remplaçables uniquement
Use case : Datasets publics téléchargeables (ImageNet, Common Crawl).
RAID 1/10 (Mirroring)
Principe : Dupliquer données sur plusieurs disques (redondance).
Performances :
| Config | Lecture | Écriture | Capacité utile | Coût |
|---|---|---|---|---|
| 2× RAID 1 | 7 GB/s | 6 GB/s | 2 TB (50%) | 360€ |
| 4× RAID 10 | 14 GB/s | 12 GB/s | 4 TB (50%) | 720€ |
Use case : Données précieuses (checkpoints, résultats expérimentaux).
Stockage réseau (NAS)
Pour partager datasets entre plusieurs machines :
| Solution | Protocole | Bande passante | Latence | Prix |
|---|---|---|---|---|
| NFS | Ethernet 1 Gbps | 125 MB/s | 1-5 ms | Gratuit (software) |
| NFS sur 10 GbE | Ethernet 10 Gbps | 1 250 MB/s | 0.5-2 ms | 500€ (switch) |
| iSCSI | Ethernet 10 Gbps | 1 250 MB/s | 0.3-1 ms | 500€ |
| NVMe-oF | RDMA 100 Gbps | 12 500 MB/s | 0.05-0.2 ms | 5 000€ |
Recommandation :
- Petit lab (< 5 machines) : NFS sur 10 GbE (bon compromis)
- Datacenter : NVMe-oF (performance proche local)
Hiérarchie et optimisations
Cache GPU (L1/L2)
Les GPU modernes ont plusieurs niveaux de cache :
NVIDIA H100 :
| Cache | Taille | Latence | Bande passante | Utilisation |
|---|---|---|---|---|
| Register file | 256 KB | 1 cycle | N/A | Variables thread |
| L1 Cache | 256 KB/SM | ~30 cycles | ~14 TB/s | Données locales |
| L2 Cache | 60 MB | ~200 cycles | 3.35 TB/s | Données partagées |
| HBM3 | 80 GB | ~300 cycles | 3.35 TB/s | Modèle global |
Optimisation : Maximiser réutilisation données en cache (tile matmul, kernel fusion).
Exemple : Tiled Matrix Multiplication
# Multiplication matricielle naïve (cache-unfriendly)
def matmul_naive(A, B):
C = np.zeros((M, N))
for i in range(M):
for j in range(N):
for k in range(K):
C[i,j] += A[i,k] * B[k,j] # Accès mémoire chaotique
return C
# Multiplication tiled (cache-friendly)
def matmul_tiled(A, B, tile_size=64):
C = np.zeros((M, N))
for i in range(0, M, tile_size):
for j in range(0, N, tile_size):
for k in range(0, K, tile_size):
# Charger tuile en L1 cache
tile_A = A[i:i+tile_size, k:k+tile_size]
tile_B = B[k:k+tile_size, j:j+tile_size]
# Calcul réutilise données en cache
C[i:i+tile_size, j:j+tile_size] += tile_A @ tile_B
return C
# Performance sur H100 :
# Naïve : 45 TFLOPS (2% du pic théorique)
# Tiled : 1200 TFLOPS (60% du pic théorique)
# Amélioration : 27× plus rapide
Unified Memory (CUDA)
Principe : Partager espace d’adressage entre CPU (RAM) et GPU (VRAM).
import torch
# Allocation standard (copie explicite)
x_cpu = torch.randn(10000, 10000)
x_gpu = x_cpu.to('cuda') # Copie RAM → VRAM
# Unified Memory (migration automatique)
x_unified = torch.randn(10000, 10000, device='cuda',
memory_format=torch.cuda.memory_format.pinned)
# Avantages :
# - Pas de copie explicite
# - Migration automatique page-by-page
# - Oversubscription : utiliser RAM si VRAM pleine
Exemple : Modèle > VRAM
# LLaMA 70B (168 GB) sur RTX 4090 (24 GB VRAM)
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-70b-hf",
device_map="auto",
offload_folder="offload", # Utilise RAM + NVMe
offload_state_dict=True
)
# Comportement :
# - Couches utilisées → VRAM (24 GB)
# - Couches inactives → RAM (128 GB)
# - Poids très froids → NVMe (500 GB)
# - Migration automatique selon besoin
# Performance :
# - Inférence : 2-5 tokens/sec (vs 95 tok/s full VRAM)
# - Économie : 144 GB VRAM (6× moins de GPUs)
# - Trade-off : 20-50× plus lent
Quantization : Réduire l’empreinte mémoire
La quantization réduit la précision des poids pour économiser VRAM.
Précisions disponibles
| Précision | Bytes | Plage | Perte qualité | Use case |
|---|---|---|---|---|
| FP32 | 4 | ±3.4e38 | 0% (référence) | Training haute précision |
| FP16 | 2 | ±65 504 | < 0.5% | Training standard |
| BF16 | 2 | ±3.4e38 | < 0.5% | Training (préféré à FP16) |
| INT8 | 1 | -128 à 127 | 1-2% | Inférence |
| INT4 | 0.5 | -8 à 7 | 3-5% | Inférence économique |
Impact sur VRAM
# LLaMA 2 70B dans différentes précisions
# FP32 (baseline)
vram_fp32 = 70B × 4 bytes = 280 GB
# FP16 / BF16
vram_fp16 = 70B × 2 bytes = 140 GB (économie 50%)
# INT8
vram_int8 = 70B × 1 byte = 70 GB (économie 75%)
# INT4
vram_int4 = 70B × 0.5 bytes = 35 GB (économie 87.5%)
# GPU nécessaire :
# FP32 : 4× A100 80GB (320 GB)
# FP16 : 2× A100 80GB (160 GB)
# INT8 : 1× A100 80GB ✅
# INT4 : 1× RTX 6000 48GB ✅
Techniques de quantization
Post-Training Quantization (PTQ)
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
# Quantization INT8
quantization_config = BitsAndBytesConfig(
load_in_8bit=True,
llm_int8_threshold=6.0, # Seuil activation
llm_int8_skip_modules=["lm_head"] # Garder certaines couches FP16
)
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-13b-hf",
quantization_config=quantization_config,
device_map="auto"
)
# VRAM : 13B × 1 byte = 13 GB (vs 26 GB FP16)
# Qualité : 98-99% de l'original
# Speed : Légèrement plus lent (déquantization à la volée)
Quantization-Aware Training (QAT)
from torch.quantization import quantize_dynamic, prepare_qat
# Entraîner avec simulation quantization
model_qat = prepare_qat(model, inplace=False)
for epoch in range(num_epochs):
for batch in dataloader:
# Forward en FP32 simulant INT8
outputs = model_qat(batch)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()
# Convertir en INT8 réel après training
model_int8 = quantize_dynamic(model_qat, {nn.Linear}, dtype=torch.qint8)
# Qualité : 99-100% de l'original (meilleur que PTQ)
# Coût : Nécessite re-training
GPTQ (Groupe-wise PTQ)
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
# Configuration GPTQ (INT4)
quantize_config = BaseQuantizeConfig(
bits=4, # 4-bit quantization
group_size=128, # Groupes de 128 poids
desc_act=True # Ordre activation descendant
)
# Quantizer avec calibration dataset
model = AutoGPTQForCausalLM.from_pretrained(
"meta-llama/Llama-2-70b-hf",
quantize_config=quantize_config
)
model.quantize(calibration_dataset)
# VRAM : 70B × 0.5 bytes = 35 GB
# Qualité : 95-97% de l'original (meilleur que naïve INT4)
# Vitesse : 2-3× plus rapide que FP16 (moins de transferts mémoire)
Configurations mémoire recommandées
Par budget
Budget < 2 000€ (développeur)
GPU : 1× RTX 4070 Ti 12GB 900€
RAM : 64 GB DDR5-5600 250€
SSD : 2 TB NVMe Gen4 180€
Total : 1330€
Capacités :
- Inférence LLaMA 13B INT8 ✅
- Fine-tuning LLaMA 7B LoRA ✅
- Datasets < 500 GB ✅
Budget 2-5k€ (chercheur)
GPU : 1× RTX 4090 24GB 1800€
RAM : 128 GB DDR5-5600 500€
SSD : 4 TB NVMe Gen4 RAID 0 360€
Total : 2660€
Capacités :
- Inférence LLaMA 34B INT4 ✅
- Fine-tuning LLaMA 13B LoRA ✅
- Datasets < 2 TB ✅
Budget 5-15k€ (lab)
GPU : 2× RTX 6000 Ada 48GB 14 000€
RAM : 256 GB DDR5-5600 1 200€
SSD : 8 TB NVMe Gen4 RAID 10 1 440€
Total : 16 640€
Capacités :
- Fine-tuning LLaMA 70B INT8 ✅
- Training distribué ✅
- Datasets < 8 TB ✅
Budget > 50k€ (entreprise)
GPU : 8× A100 80GB 144 000€
RAM : 1 TB DDR5-4800 ECC 4 800€
SSD : 32 TB NVMe Gen4 RAID 10 5 760€
NAS : 200 TB NVMe-oF 50 000€
Total : 204 560€
Capacités :
- Training GPT-3 175B ✅
- Datasets < 200 TB ✅
- Multi-utilisateurs ✅
Optimisations avancées
Gradient Checkpointing
Principe : Échanger compute contre mémoire en recalculant activations.
from torch.utils.checkpoint import checkpoint
class TransformerBlock(nn.Module):
def forward(self, x):
# Sans checkpointing : stocke activations (VRAM++)
return self.attention(self.norm1(x)) + self.ffn(self.norm2(x))
def forward_checkpoint(self, x):
# Avec checkpointing : recalcule pendant backward (VRAM--)
return checkpoint(self._forward, x)
# Impact :
# LLaMA 13B sans checkpointing : 45 GB VRAM
# LLaMA 13B avec checkpointing : 18 GB VRAM (-60%)
# Coût : +20% temps training (recalculs)
Flash Attention
Principe : Calcul attention par blocs pour éviter matérialiser matrice d’attention.
# Attention standard
def standard_attention(Q, K, V):
# seq_len = 4096, hidden = 4096
scores = Q @ K.T # (4096, 4096) → 67 MB en FP16
attn = softmax(scores / sqrt(d_k))
return attn @ V
# Flash Attention
from flash_attn import flash_attn_func
def flash_attention(Q, K, V):
# Calcul par blocs (ex: 64×64)
# Ne matérialise jamais la matrice complète
return flash_attn_func(Q, K, V)
# Impact :
# Standard attention (seq=4096) : 67 MB par layer
# Flash attention : 4 MB par layer (-94%)
# Pour 32 layers : économie 2 GB VRAM
# Bonus : 2-4× plus rapide
CPU Offloading dynamique
import torch
from accelerate import cpu_offload
# Modèle trop grand pour VRAM
model = LargeModel() # 50 GB
# Offload automatique
model = cpu_offload(
model,
execution_device="cuda:0",
offload_buffers=True
)
# Comportement :
# - Couche active → VRAM
# - Couche terminée → RAM
# - VRAM utilisée : 5-10 GB (seulement 1-2 couches)
# - Performance : 5-10× plus lent que full VRAM
Prefetching optimisé
from torch.utils.data import DataLoader
# DataLoader standard
loader = DataLoader(
dataset,
batch_size=32,
num_workers=4 # Préparation CPU parallèle
)
# DataLoader avec pinned memory (plus rapide)
loader = DataLoader(
dataset,
batch_size=32,
num_workers=4,
pin_memory=True, # Mémoire non-swappable
prefetch_factor=4 # Prépare 4 batches en avance
)
# Impact :
# Standard : GPU idle 15% du temps (attente données)
# Pinned + prefetch : GPU idle 2% du temps
# Amélioration : +13% throughput
Monitoring mémoire
Outils de monitoring
nvidia-smi pour VRAM
# Monitoring temps réel
nvidia-smi dmon -s mu
# Résultat :
# gpu pwr gtemp mtemp fb sm
# 0 85 65 - 18432 45
# 1 120 72 - 24000 98
# fb : VRAM utilisée (MB)
# sm : GPU utilization (%)
PyTorch memory profiler
import torch
# Réserver VRAM au démarrage (évite fragmentation)
torch.cuda.empty_cache()
# Allocations
model = MyModel().cuda()
print(f"Model: {torch.cuda.memory_allocated() / 1e9:.2f} GB")
optimizer = torch.optim.Adam(model.parameters())
print(f"Optimizer: {torch.cuda.memory_allocated() / 1e9:.2f} GB")
# Training
for batch in dataloader:
outputs = model(batch)
loss = criterion(outputs)
loss.backward()
# Snapshot mémoire
print(f"Peak: {torch.cuda.max_memory_allocated() / 1e9:.2f} GB")
optimizer.step()
optimizer.zero_grad()
# Résumé
print(torch.cuda.memory_summary())
RAM système
# Linux
free -h
# Résultat :
# total used free shared buff/cache
# Mem: 125Gi 42Gi 68Gi 1.2Gi 15Gi
# Swap: 16Gi 0Gi 16Gi
# Monitoring continu
watch -n 1 free -h
Conclusion
Checklist mémoire IA
✅ VRAM (priorité absolue) :
- Calculer besoins : Paramètres × Bytes × Overhead
- HBM > GDDR6 si budget permet
- 24+ GB minimum pour développement
✅ RAM système :
- Minimum 2× VRAM pour offloading
- DDR5-5600 recommandé
- 128-256 GB pour fine-tuning sérieux
✅ Stockage :
- NVMe Gen4 minimum (7 GB/s)
- RAID 0 pour datasets publics
- RAID 10 pour données critiques
- Capacité = 3-5× taille datasets
✅ Optimisations :
- Gradient checkpointing : -60% VRAM
- Flash Attention : -90% VRAM attention
- Quantization INT8 : -50% VRAM
- Offloading : -40% VRAM, +15% temps
Pour aller plus loin
Articles liés
- GPU pour l’IA - Comparatif NVIDIA vs AMD
- Architectures Système - Assemblage optimal
- Hardware pour Fine-Tuning - Configurations spécifiques
- Optimisation Hardware - Maximiser performance
- Budget et ROI - Calculer investissement
Ressources externes
- NVIDIA Memory Management - Guide CUDA
- PyTorch Memory Guide - Optimisations PyTorch
- DeepSpeed ZeRO - Tutoriel offloading
- bitsandbytes - Quantization INT8/INT4