Mémoire et stockage pour l'IA : Guide complet HBM, VRAM, NVMe en 2026

tl;dr: Hiérarchie mémoire IA : VRAM (HBM3 9.6 TB/s, essentielle pour GPU, calcul : params × bytes × overhead), RAM système (DDR5 512GB+ pour offloading, 5× moins chère que VRAM), NVMe (Gen5 14 GB/s pour datasets, 50× moins cher que RAM). Optimisations : quantization INT8 ÷ VRAM par 2, gradient checkpointing -60% VRAM, offload CPU économise 50%+ VRAM.

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 :

  1. VRAM (GPU memory) - HBM, GDDR, calculs de besoins
  2. RAM système - DDR, capacité, bande passante
  3. Stockage - NVMe, SSD, datasets volumineux
  4. Hiérarchie mémoire - Cache, optimisations
  5. Techniques d’optimisation - Offloading, quantization, caching

Illustration du matériel et infrastructure pour l’IA : la mémoire et le stockage pour l’entraînement IA

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

TypeLatenceCas d’usage IA
L1 Cache0.5 nsRegistres GPU
L2 Cache5-10 nsDonnées immédiates GPU
HBM3 (VRAM)100-200 nsPoids modèle, activations
GDDR6 (VRAM)200-300 nsGaming GPUs
DDR5 (RAM)60-80 nsOffload optimizer states
NVMe Gen510-20 µsDatasets, checkpoints
SATA SSD50-100 µsDatasets froids
HDD5-10 msArchives

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)
💡 HBM3 : Mémoire GPU ultra-rapide : Architecture 3D stacking avec 8 stacks donnant 9.6 TB/s de bande passante (vs 500-1000 GB/s pour GDDR6). HBM3e (2024) atteint 1150 GB/s/stack sur H200 141GB. Avantage : 10× plus rapide, 2× plus efficace énergétiquement. Coût : 150-200€/GB vs 30-75€/GB pour GDDR6. Réservé aux GPUs datacenter (A100, H100, MI300X).

Évolution HBM :

GénérationAnnéeBande passante/stackCapacité/stackUtilisé par
HBM12015128 GB/s4 GBAMD Fury X
HBM22018307 GB/s8 GBTesla V100
HBM2e2020410 GB/s16 GBA100 80GB
HBM32023819 GB/s24 GBH100 80GB
HBM3e20241 150 GB/s36 GBH200 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éristiqueGDDR6GDDR6X
Fréquence14-16 Gbps19-21 Gbps
SignalingNRZ (2 niveaux)PAM4 (4 niveaux)
Bande passante500-700 GB/s800-1000 GB/s
ConsommationRéférence+15%
CoûtRé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 ✅
🔎 Tip
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èleParamètresFP16 InférenceINT8 InférenceINT4 InférenceLoRA Fine-tuningFull Fine-tuning
GPT-21.5B3.6 GB1.8 GB0.9 GB6 GB24 GB
LLaMA 7B7B17 GB8.5 GB4.2 GB25 GB112 GB
LLaMA 13B13B31 GB15.5 GB7.8 GB40 GB208 GB
LLaMA 34B34B82 GB41 GB20 GB95 GB544 GB
LLaMA 70B70B168 GB84 GB42 GB190 GB1120 GB
Mixtral 8×7B47B113 GB56 GB28 GB130 GB752 GB
GPT-3 175B175B420 GB210 GB105 GB480 GB2800 GB

GPU recommandés par modèle :

ModèleInférence FP16Inférence INT4LoRA FTFull FT
7BRTX 4090 24GBRTX 4070 Ti 12GBRTX 40902× A100 40GB
13BA100 40GBRTX 4090A100 40GB4× A100 40GB
34B2× RTX 6000 48GBA100 40GB2× A100 40GB8× A100 40GB
70B3× A100 80GBA100 80GB3× A100 80GB16× 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 :

  1. Offloading : Déplacer optimizer states de VRAM vers RAM (DeepSpeed ZeRO-Offload)
  2. Preprocessing : Charger et transformer datasets avant GPU
  3. Multi-processing : DataLoaders, augmentation parallèle
  4. Inférence avec offload : Modèles > VRAM en utilisant RAM

DDR5 vs DDR4

CaractéristiqueDDR4-3200DDR5-5600DDR5-6400
Fréquence3200 MT/s5600 MT/s6400 MT/s
Bande passante/channel25.6 GB/s44.8 GB/s51.2 GB/s
Bande passante dual-channel51.2 GB/s89.6 GB/s102.4 GB/s
Latence CAS16-18 ns18-20 ns20-22 ns
Voltage1.2V1.1V1.1V
Prix (128GB)350€500€600€

Recommandation : DDR5-5600 (meilleur rapport performance/prix pour IA).

Capacité RAM recommandée

Configuration GPURAM minimumRAM recommandéeUse Case
1× RTX 4070 Ti32 GB64 GBDev, Fine-tuning 7B
1× RTX 409064 GB128 GBFine-tuning 13B
2× RTX 4090128 GB256 GBFine-tuning 34B
4× A100 40GB256 GB512 GBTraining 70B avec offload
8× A100 80GB512 GB1024 GBTraining 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 :

ConfigVRAM utiliséeRAM utiliséeTemps/epochPerte perf
Sans offload100%10%1.0h0%
Offload optimizer60%40%1.15h+15%
Offload params40%60%1.35h+35%
Offload tout20%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érationInterfaceBande passanteLatencePrix/GB
SATA IIISATA 6 Gbps550 MB/s50-100 µs0.08€
NVMe Gen3PCIe 3.0 ×43 500 MB/s10-20 µs0.10€
NVMe Gen4PCIe 4.0 ×47 000 MB/s8-15 µs0.12€
NVMe Gen5PCIe 5.0 ×414 000 MB/s5-10 µs0.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 :

StockageTemps lectureTemps computeTemps totalGPU util
HDD (150 MB/s)17 min10 min27 min37%
SATA SSD4.5 min10 min14.5 min69%
NVMe Gen421 sec10 min10.4 min96%

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 :

ConfigLectureÉcritureCapacitéCoût
1× NVMe Gen47 GB/s6 GB/s2 TB180€
2× RAID 014 GB/s12 GB/s4 TB360€
4× RAID 028 GB/s24 GB/s8 TB720€

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 :

ConfigLectureÉcritureCapacité utileCoût
2× RAID 17 GB/s6 GB/s2 TB (50%)360€
4× RAID 1014 GB/s12 GB/s4 TB (50%)720€

Use case : Données précieuses (checkpoints, résultats expérimentaux).

Stockage réseau (NAS)

Pour partager datasets entre plusieurs machines :

SolutionProtocoleBande passanteLatencePrix
NFSEthernet 1 Gbps125 MB/s1-5 msGratuit (software)
NFS sur 10 GbEEthernet 10 Gbps1 250 MB/s0.5-2 ms500€ (switch)
iSCSIEthernet 10 Gbps1 250 MB/s0.3-1 ms500€
NVMe-oFRDMA 100 Gbps12 500 MB/s0.05-0.2 ms5 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 :

CacheTailleLatenceBande passanteUtilisation
Register file256 KB1 cycleN/AVariables thread
L1 Cache256 KB/SM~30 cycles~14 TB/sDonnées locales
L2 Cache60 MB~200 cycles3.35 TB/sDonnées partagées
HBM380 GB~300 cycles3.35 TB/sModè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écisionBytesPlagePerte qualitéUse case
FP324±3.4e380% (référence)Training haute précision
FP162±65 504< 0.5%Training standard
BF162±3.4e38< 0.5%Training (préféré à FP16)
INT81-128 à 1271-2%Inférence
INT40.5-8 à 73-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

Ressources externes