Hardware optimal pour fine-tuning de LLM : guide pratique
Le fine-tuning (affinage) consiste à adapter un modèle pré-entraîné à une tâche ou un domaine spécifique. Contrairement à l’entraînement from scratch, le fine-tuning :
- Nécessite moins de données (100-10 000 exemples vs millions)
- Est plus rapide (heures/jours vs semaines/mois)
- Requiert moins de compute (mais reste exigeant)
Cependant, le fine-tuning nécessite de charger le modèle complet en mémoire ainsi que les gradients, optimizers et activations, ce qui peut rapidement saturer la VRAM disponible.
Objectif de cet article : Vous aider à choisir le hardware optimal selon la taille du modèle que vous souhaitez fine-tuner, et découvrir les techniques pour réduire drastiquement les besoins mémoire.

Besoins mémoire pour le fine-tuning
Calcul théorique
Pour le fine-tuning complet (full fine-tuning), il faut stocker :
- Poids du modèle :
P × Bbytes - Gradients :
P × Bbytes (même taille que les poids) - Optimizer states (Adam) :
P × 8bytes (momentum + variance) - Activations : Dépend de la longueur de séquence et du batch size
Formule simplifiée :
Mémoire (GB) ≈ P × (B + B + 8) + Activations
≈ P × (2B + 8)
Avec :
- P = nombre de paramètres (en milliards)
- B = bytes par paramètre (2 pour FP16, 4 pour FP32)
Pour comprendre l’impact de la précision sur la mémoire et les performances, consultez notre guide dédié.
Exemples FP16 :
LLaMA 7B : 7 × (2 + 2 + 8) = 84 GB
LLaMA 13B : 13 × 12 = 156 GB
LLaMA 70B : 70 × 12 = 840 GB
GPT-3 175B : 175 × 12 = 2 100 GB (2,1 TB !)
Activations : Dépendent de la séquence et du batch size
Activations (GB) ≈ (L × H × N × S × B) / 10⁹
Avec :
- L = nombre de layers (32 pour LLaMA 7B)
- H = hidden size (4096 pour LLaMA 7B)
- N = attention heads (32)
- S = sequence length (2048 typique)
- B = batch size
Pour LLaMA 7B, séquence 2048, batch 4 : ~12 GB d’activations.
Total réaliste LLaMA 7B full fine-tuning : 84 + 12 = ~96 GB VRAM
Impossible sur consumer hardware ! Un RTX 4090 avec 24GB de VRAM est largement insuffisant pour le fine-tuning complet de LLaMA 7B.
Besoins par taille de modèle (full fine-tuning)
| Modèle | Paramètres | FP16 Inference | Full Fine-Tuning | Hardware Minimum |
|---|---|---|---|---|
| Mistral 7B | 7,2B | 14 GB | ~90 GB | 2x A100 40GB |
| LLaMA 3 8B | 8B | 16 GB | ~96 GB | 2x A100 40GB |
| LLaMA 3 13B | 13B | 26 GB | ~156 GB | 2x A100 80GB ou 4x A100 40GB |
| Mixtral 8x7B | 47B | 94 GB | ~564 GB | 8x A100 80GB |
| LLaMA 3 70B | 70B | 140 GB | ~840 GB | 12x A100 80GB |
Conclusion : Le full fine-tuning de modèles > 7B est hors de portée du hardware consumer et coûte extrêmement cher en cloud.
Pour un comparatif complet des GPU adaptés au fine-tuning, consultez notre guide.
Heureusement, des techniques permettent de réduire drastiquement ces besoins !
Techniques d’optimisation mémoire
LoRA (Low-Rank Adaptation)
Principe : Au lieu de modifier tous les poids du modèle, LoRA n’entraîne que de petites matrices additionnelles (adapters) de rang faible.
Fonctionnement :
Matrice originale W (d × d)
→ Gelée (frozen), non modifiée
Ajout de deux petites matrices :
- A (d × r)
- B (r × d)
Avec r << d (r = 8, 16, 32 typiquement)
Update : W' = W + BA
Avantages :
- Mémoire réduite : ~10% de la mémoire du full fine-tuning
- Entraînement rapide : moins de paramètres à updater
- Modularité : plusieurs LoRA adapters pour un même modèle de base
- Qualité : performances très proches du full fine-tuning
Besoins mémoire (LoRA) :
Mémoire ≈ Poids du modèle (FP16) + Adapters + Activations
≈ P × 2 + 0,1 GB + Activations
LLaMA 7B : 14 GB (modèle) + 12 GB (activations) ≈ 26 GB
→ Faisable sur 1x RTX 4090 (24GB) avec optimisations
Implémentation :
# Avec PEFT (Hugging Face)
from peft import LoraConfig, get_peft_model
lora_config = LoraConfig(
r=16, # Rang
lora_alpha=32, # Scaling factor
target_modules=["q_proj", "v_proj"], # Quelles couches
lora_dropout=0.1,
bias="none",
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# trainable params: 4.2M || all params: 6.7B || trainable%: 0.06%
QLoRA (Quantized LoRA)
Principe : Combine LoRA avec quantization 4-bit du modèle de base.
Fonctionnement :
- Modèle de base chargé en INT4 (4 bits par paramètre)
- LoRA adapters entraînés en FP16 ou BF16
- Forward pass : dequantize on-the-fly
Avantages :
- Mémoire divisée par ~4 vs LoRA standard
- Qualité préservée : performances similaires au LoRA FP16
- Accessible hardware consumer : fine-tuning 7B sur 1x RTX 3090
Pour plus de détails sur la quantization et ses techniques, consultez notre article complet.
Besoins mémoire (QLoRA) :
Mémoire ≈ P × 0,5 + Adapters + Activations
LLaMA 7B : 3,5 GB (modèle 4-bit) + 12 GB (activations) ≈ 16 GB
→ Faisable sur 1x RTX 4070 Ti Super (16GB)
QLoRA : Fine-tuning accessible : Quantization 4-bit du modèle + LoRA adapters. LLaMA 7B : 16 GB VRAM seulement (vs 96 GB full fine-tuning, vs 26 GB LoRA FP16). Permet fine-tuning 7B sur RTX 4070 Ti 16GB, 13B sur RTX 4090 24GB, 70B sur 2× A100 80GB. Qualité préservée : performances similaires au LoRA FP16. Bibliothèque : bitsandbytes + PEFT (Hugging Face).
| Modèle | QLoRA (4-bit) | LoRA (FP16) | Full Fine-Tuning |
|---|---|---|---|
| LLaMA 7B | ~16 GB | ~26 GB | ~96 GB |
| LLaMA 13B | ~24 GB | ~42 GB | ~156 GB |
| LLaMA 70B | ~80 GB | ~230 GB | ~840 GB |
Implémentation :
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model
# Quantization config
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4", # NormalFloat4
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True, # Double quantization
)
# Load model in 4-bit
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3-8b",
quantization_config=bnb_config,
device_map="auto",
)
# LoRA config
lora_config = LoraConfig(r=16, lora_alpha=32, target_modules=["q_proj", "v_proj"])
model = get_peft_model(model, lora_config)
Gradient checkpointing
Principe : Trade compute for memory.
Au lieu de stocker toutes les activations pour le backward pass, on ne garde que certains points de contrôle (checkpoints) et on recalcule les activations intermédiaires à la volée.
Impact :
- Mémoire activations : Divisée par ~√N (N = nombre de layers)
- Temps d’entraînement : +20-30% (recalculs)
Utilisation :
# PyTorch
model.gradient_checkpointing_enable()
# Transformers
from transformers import TrainingArguments
training_args = TrainingArguments(
gradient_checkpointing=True,
...
)
Gain mémoire : 30-50% selon l’architecture.
Mixed precision training
Principe : Entraîner en FP16 ou BF16 au lieu de FP32.
Avantages :
- Mémoire divisée par 2
- Vitesse 2-3x sur GPU avec Tensor Cores
- Qualité préservée avec loss scaling (FP16)
FP16 vs BF16 :
| Format | Exponent | Mantissa | Range | Précision |
|---|---|---|---|---|
| FP32 | 8 bits | 23 bits | ±3.4e38 | Haute |
| FP16 | 5 bits | 10 bits | ±6.5e4 | Moyenne |
| BF16 | 8 bits | 7 bits | ±3.4e38 | Moyenne-basse |
Recommandation : BF16 pour entraînement (meilleur range), disponible sur Ampere/Ada/Hopper.
Utilisation :
from transformers import TrainingArguments
training_args = TrainingArguments(
bf16=True, # BF16 si GPU Ampere+
# fp16=True, # Sinon FP16
...
)
DeepSpeed ZeRO
DeepSpeed est une bibliothèque d’optimisation pour l’entraînement distribué, développée par Microsoft.
ZeRO (Zero Redundancy Optimizer) : Élimine les redondances mémoire en distribuant optimizer states, gradients et paramètres.
Stages :
| Stage | Distribue | Mémoire / GPU | Communication |
|---|---|---|---|
| ZeRO-1 | Optimizer states | /N | Faible |
| ZeRO-2 | + Gradients | /N² | Moyenne |
| ZeRO-3 | + Paramètres | /N³ | Élevée |
| ZeRO-Offload | CPU offloading | Encore moins | Très élevée |
N = nombre de GPUs
Exemple : LLaMA 7B full fine-tuning (96GB nécessaire)
- Sans ZeRO : 1x A100 80GB → impossible
- ZeRO-2, 2 GPUs : 96 / 4 = 24GB par GPU → OK sur 2x RTX 4090
- ZeRO-3, 4 GPUs : 96 / 64 = 1,5GB par GPU → OK sur 4x RTX 4070 Ti
Configuration :
// deepspeed_config.json
{
"zero_optimization": {
"stage": 2,
"offload_optimizer": {
"device": "cpu" // Offload optimizer to CPU RAM
},
"overlap_comm": true,
"contiguous_gradients": true,
"reduce_bucket_size": 5e8
},
"bf16": {
"enabled": true
},
"gradient_accumulation_steps": 4
}
Utilisation :
deepspeed --num_gpus=2 train.py --deepspeed deepspeed_config.json
FSDP (Fully Sharded Data Parallel)
FSDP (PyTorch natif) : Alternative à DeepSpeed ZeRO-3.
Principe : Sharding complet des paramètres, gradients et optimizer states.
Avantages :
- Intégré nativement dans PyTorch 2.0+
- Simple à utiliser avec Hugging Face Transformers
- Performances comparables à ZeRO-3
Configuration :
from transformers import TrainingArguments
training_args = TrainingArguments(
fsdp="full_shard auto_wrap", # Equivalent ZeRO-3
fsdp_config={
"fsdp_offload_params": True, # CPU offloading
"fsdp_transformer_layer_cls_to_wrap": "LlamaDecoderLayer",
},
...
)
Comparatif des techniques
| Technique | Réduction Mémoire | Vitesse | Qualité | Complexité |
|---|---|---|---|---|
| Full fine-tuning | - | Baseline | 100% | Simple |
| LoRA | ~75% | +30% faster | 95-98% | Simple |
| QLoRA | ~85% | +20% faster | 95-98% | Simple |
| Gradient checkpointing | 30-50% | -20% slower | 100% | Simple |
| Mixed precision | 50% | +100% faster | 99-100% | Simple |
| ZeRO-2 | 50-75% | -10% slower | 100% | Moyenne |
| ZeRO-3 | 80-90% | -20% slower | 100% | Moyenne |
| FSDP | 80-90% | -15% slower | 100% | Moyenne |
Combinaisons recommandées :
- Solo GPU : QLoRA + gradient checkpointing + BF16
- 2-4 GPUs : LoRA + ZeRO-2 + BF16
- 8+ GPUs : Full fine-tuning + ZeRO-3 ou FSDP + BF16
Configurations recommandées
Budget < 2 000€ : 1x RTX 4070 Ti Super
Specs :
- VRAM : 16 GB GDDR6X
- TDP : 285W
- Prix : ~900€
Capacités :
- QLoRA :
- LLaMA 7B ✅ (seq 512-1024)
- Mistral 7B ✅
- LLaMA 13B ⚠️ (seq courtes, batch 1)
- Inférence :
- LLaMA 7B, Mistral 7B (FP16)
- LLaMA 13B (8-bit)
- LLaMA 70B (4-bit, lent)
Configuration système :
GPU : RTX 4070 Ti Super (16GB)
CPU : AMD Ryzen 7 7700X
RAM : 32 GB DDR5-6000
SSD : 1 TB NVMe Gen4
PSU : 850W 80+ Gold
Total : ~1 800€
Budget 2 000-5 000€ : 1x RTX 4090
Specs :
- VRAM : 24 GB GDDR6X
- TDP : 450W
- Prix : ~1 800€
Capacités :
- QLoRA :
- LLaMA 7B, 13B ✅ (confortable)
- Mixtral 8x7B ⚠️ (possible avec optimisations)
- LLaMA 70B ❌
- LoRA :
- LLaMA 7B ✅
- LLaMA 13B ⚠️ (gradient checkpointing requis)
Configuration système :
GPU : RTX 4090 (24GB)
CPU : AMD Ryzen 9 7950X
RAM : 64 GB DDR5-6000
SSD : 2 TB NVMe Gen4
PSU : 1200W 80+ Platinum
Total : ~4 500€
ROI :
- vs Cloud (1x A100 @ 2€/h) : Break-even en ~2 300 heures (~3 mois usage intensif)
Budget 5 000-15 000€ : 1-2x RTX 6000 Ada
Specs (RTX 6000 Ada) :
- VRAM : 48 GB GDDR6
- TDP : 300W
- ECC memory (fiabilité)
- Prix : ~7 000€
Capacités (1x RTX 6000) :
- QLoRA :
- Tous modèles ≤ 70B ✅
- LoRA :
- LLaMA 7B, 13B ✅
- Mixtral 8x7B ✅
- LLaMA 70B ⚠️ (possible)
Capacités (2x RTX 6000, 96GB total) :
- Full fine-tuning :
- LLaMA 7B ✅ (avec ZeRO-2)
- LLaMA 13B ⚠️ (limite)
- LoRA :
- LLaMA 70B ✅ (confortable)
- Mixtral 8x22B ✅
Configuration 2x RTX 6000 :
GPU : 2x RTX 6000 Ada (96GB total)
CPU : AMD Threadripper PRO 7975WX (32 cores)
RAM : 256 GB DDR5 ECC
SSD : 4 TB NVMe Gen5 (RAID 0)
Carte mère : Threadripper PRO (7x PCIe 5.0 x16)
PSU : 2x 1600W 80+ Platinum (redondant)
Boîtier rack : 4U
Total : ~25 000€
Budget 15 000-50 000€ : 2-4x A100 40GB
Specs (A100 PCIe 40GB) :
- VRAM : 40 GB HBM2e
- TDP : 300W
- Tensor Cores Gen3
- Prix : ~12 000€ (occasion : ~8 000€)
Capacités (2x A100 40GB) :
- Full fine-tuning :
- LLaMA 7B ✅ (ZeRO-2)
- LLaMA 13B ✅ (ZeRO-2)
- LLaMA 70B ❌
- LoRA :
- LLaMA 70B ✅
Capacités (4x A100 40GB) :
- Full fine-tuning :
- LLaMA 13B ✅ (confortable)
- LLaMA 70B ⚠️ (ZeRO-3, serré)
- LoRA :
- LLaMA 70B ✅ (très confortable)
- Mixtral 8x22B ✅
Configuration 4x A100 40GB :
GPU : 4x A100 PCIe 40GB
CPU : 2x AMD EPYC 7543 (32 cores chacun)
RAM : 512 GB DDR4 ECC
SSD : 8 TB NVMe (RAID 10)
Serveur : Supermicro 4U
Networking : 100 Gbps
Total : ~70 000€ (neuf), ~50 000€ (occasion)
Budget > 100 000€ : 8x H100 80GB
Specs (H100 SXM5 80GB) :
- VRAM : 80 GB HBM3
- TDP : 700W
- Tensor Cores Gen4 (FP8 support)
- Interconnect : NVLink 900 GB/s
- Prix : ~35 000€ / GPU
Capacités (8x H100 80GB) :
- Full fine-tuning :
- Tous modèles jusqu’à 70B ✅ (confortable)
- Mixtral 8x22B ✅
- Falcon 180B ⚠️ (possible ZeRO-3)
- Entraînement from scratch :
- Modèles jusqu’à 13B ⚠️
Configuration cluster DGX-style :
GPU : 8x H100 SXM5 80GB (NVLink)
CPU : 2x Intel Xeon Platinum 8480+ (56 cores)
RAM : 2 TB DDR5 ECC
SSD : 30 TB NVMe (RAID)
Networking : 8x 200 Gbps InfiniBand
Cooling : Liquid cooling direct-to-chip
Total : ~350 000€
Benchmarks réels
Fine-Tuning LLaMA 7B
Dataset : 10 000 exemples instruction-following, seq length 512
| Config | Technique | VRAM utilisée | Temps/epoch | Hardware |
|---|---|---|---|---|
| A | Full FT + FP32 | 180 GB | 8h | 3x A100 80GB |
| B | Full FT + BF16 | 90 GB | 4h | 2x A100 80GB |
| C | Full FT + BF16 + ZeRO-2 | 45 GB/GPU | 5h | 2x A100 80GB |
| D | LoRA + BF16 | 22 GB | 2,5h | 1x RTX 4090 |
| E | QLoRA 4-bit | 14 GB | 3,5h | 1x RTX 4070 Ti |
Qualité (eval perplexity) :
- A, B, C : 2,85 (identique)
- D (LoRA) : 2,92 (+2,5%)
- E (QLoRA) : 2,95 (+3,5%)
Conclusion : QLoRA offre un excellent compromis coût/qualité.
Fine-Tuning LLaMA 70B
Dataset : Même, seq length 512
| Config | Technique | VRAM | Temps/epoch | Hardware | Coût approx |
|---|---|---|---|---|---|
| A | Full FT + ZeRO-3 | 70 GB/GPU | 30h | 16x A100 80GB | ~15k€ HW ou 1k€ cloud |
| B | LoRA + ZeRO-2 | 38 GB/GPU | 12h | 4x A100 80GB | ~50k€ HW ou 300€ cloud |
| C | QLoRA 4-bit | 72 GB | 18h | 2x A100 80GB | ~25k€ HW ou 150€ cloud |
Coûts cloud (AWS p4d.24xlarge : 8x A100, 32,77$/h) :
- Config A : 30h × 32,77$ × 2 nodes = 1 966$
- Config B : 12h × 16,38$ (4 GPU) = 196$
- Config C : 18h × 8,19$ (2 GPU) = 147$
Cloud vs On-Premise
Quand utiliser le cloud
Avantages :
- Pas d’investissement initial (CapEx → OpEx)
- Flexibilité : scale up/down selon besoins
- Accès hardware récent (H100 disponibles)
- Expérimentation : tester avant d’acheter
Idéal pour :
- Projets ponctuels
- Expérimentation et recherche
- Startups en phase early-stage
- Pics de charge imprévisibles
Providers :
- AWS (p4d, p5), GCP (a2), Azure (ND-series)
- Lambda Labs : 1,29$/h pour A100 (vs 3$/h AWS)
- RunPod, Vast.ai : encore moins cher (spot instances)
Quand acheter du hardware
Avantages :
- Coûts long terme : break-even souvent < 1 an
- Disponibilité garantie : pas de queue ou spot interruptions
- Privacy : données ne quittent pas vos locaux
- Performance : pas de overhead réseau
Idéal pour :
- Usage intensif continu (> 4h/jour)
- Données sensibles (santé, finance)
- Production (serving)
- Équipes de recherche
Break-even analysis :
| Hardware | Prix achat | Équivalent cloud | $/mois | Break-even |
|---|---|---|---|---|
| 1x RTX 4090 | 1 800€ | 1x A100 (4h/jour) | 250€ | 7 mois |
| 4x A100 40GB | 50 000€ | 4x A100 (24/7) | 8 000€ | 6 mois |
| 8x H100 | 300 000€ | 8x H100 (24/7) | 35 000€ | 9 mois |
Note : Ces calculs supposent un usage continu. Si usage intermittent (< 2h/jour), cloud souvent plus rentable.
Approche hybride
Stratégie recommandée :
- Développement : Hardware local (RTX 4090, A6000)
- Expérimentation : Cloud spot instances (pas cher)
- Fine-tuning production : Hardware dédié si volume suffisant
- Inférence : Local ou cloud optimisé (L4, Inferentia)
Exemple : Startup LLM
- Dev : 2x RTX 4090 locales (~4k€)
- Fine-tuning gros modèles : Lambda Labs à la demande
- Serving : RunPod serverless (pay-per-inference)
- Total : ~5k€ CapEx + 500€/mois OpEx
Outils et frameworks
Hugging Face Ecosystem
Transformers : Bibliothèque de référence
pip install transformers accelerate
PEFT : Parameter-Efficient Fine-Tuning (LoRA, etc.)
pip install peft
TRL : Transformer Reinforcement Learning (RLHF)
pip install trl
Accelerate : Abstraction pour distribution
accelerate config # Configuration interactive
accelerate launch train.py
Frameworks spécialisés
Axolotl : Configuration simplifiée fine-tuning
# config.yaml
base_model: meta-llama/Llama-3-8b
dataset: alpaca
adapter: qlora
sequence_len: 2048
micro_batch_size: 2
gradient_accumulation_steps: 4
LLaMA Factory : GUI pour fine-tuning
- Interface web intuitive
- Support LoRA, QLoRA, full fine-tuning
- Datasets pré-configurés
DeepSpeed : Optimisation Microsoft
pip install deepspeed
deepspeed --num_gpus=4 train.py --deepspeed ds_config.json
Unsloth : Fine-tuning ultra-rapide
- 2x plus rapide que Hugging Face standard
- Support QLoRA optimisé
- Compatible Llama, Mistral, Phi
from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained(
"unsloth/llama-3-8b-bnb-4bit",
max_seq_length=2048,
load_in_4bit=True,
)
Conclusion
Le fine-tuning de LLM est désormais accessible à tous les budgets grâce aux techniques d’optimisation :
Recommandations par budget :
- < 1 000€ : Cloud spot instances (expérimentation)
- 1 000-2 000€ : 1x RTX 4070 Ti + QLoRA (modèles 7B)
- 2 000-5 000€ : 1x RTX 4090 + QLoRA/LoRA (modèles 7-13B)
- 5 000-20 000€ : 1-2x RTX 6000 Ada (modèles jusqu’à 70B)
- 20 000-100 000€ : 2-8x A100 (full fine-tuning modèles 70B+)
- > 100 000€ : 8+ H100 (entraînement from scratch)
Pour calculer le ROI de votre investissement hardware, consultez notre guide complet.
Techniques à retenir :
- QLoRA : Meilleur rapport qualité/coût, divise besoins mémoire par 4
- LoRA : Si VRAM suffisante, plus rapide que QLoRA
- Gradient checkpointing : Toujours activer (gain 30-50%)
- BF16 : Sur GPU Ampere+ (Tensor Cores optimisés)
- ZeRO/FSDP : Multi-GPU, scaling efficace
Pour aller plus loin :
- Découvrez notre guide complet du fine-tuning avec exemples pratiques
- Comparez les différents GPU pour le fine-tuning
- Calculez votre budget et ROI
- Explorez les techniques de quantization
- Optimisez la précision de vos calculs
- Préparez-vous pour l’inférence en production