Polydesk-logotype
Polydesk.ai — Header

DeepSpeed

DeepSpeed est une bibliothèque open-source développée par Microsoft Research qui optimise l’entraînement et l’inférence de modèles de deep learning à grande échelle, principalement grâce à ZeRO (Zero Redundancy Optimizer) et à ses techniques d’offloading CPU/NVMe.

Si vous entraînez ou fine-tunez un modèle de plus d’un milliard de paramètres, vous avez probablement déjà croisé DeepSpeed. La bibliothèque a été utilisée pour entraîner BLOOM (176B paramètres), Megatron-Turing NLG (530B), et des dizaines d’autres modèles de grande taille. Son innovation principale, ZeRO, élimine la redondance mémoire dans le data parallelism distribué, permettant d’entraîner des modèles jusqu’à 10x plus grands sur le même matériel.

La version courante est la 0.18.7, publiée en mars 2026, compatible avec PyTorch 2.x et les GPU NVIDIA Pascal à Blackwell, ainsi que les accélérateurs AMD et Intel.

DeepSpeed en bref
Développeur
Microsoft Research
Type
Bibliothèque d’entraînement distribué (Python/C++/CUDA)
Licence
MIT (open-source)
Version
0.18.7 (mars 2026)
Technologie clé
ZeRO (Zero Redundancy Optimizer)
Installation
pip install deepspeed
Compatible avec
PyTorch, Hugging Face, Lightning, Megatron-LM
GitHub
github.com/deepspeedai/DeepSpeed
URL
deepspeed.ai

ZeRO : le coeur de DeepSpeed

ZeRO (Zero Redundancy Optimizer) est l’innovation fondatrice de DeepSpeed, publiée en 2019 par Samyam Rajbhandari et al. Le constat de départ est simple : dans le data parallelism classique (DDP), chaque GPU stocke une copie complète du modèle, de ses gradients et des états de l’optimiseur. Pour N GPU, cela signifie N copies identiques de tout. C’est un gaspillage massif de mémoire.

ZeRO élimine cette redondance en fragmentant (sharding) les données du modèle entre les GPU au lieu de les répliquer. Il se décline en trois stages progressifs, chacun fragmentant un type de donnée supplémentaire.

ZeRO Stage 1 : fragmentation des états optimiseur

Les états de l’optimiseur (pour Adam : la moyenne mobile des gradients et la moyenne mobile des gradients au carré, soit 2 tenseurs en FP32 par paramètre) sont fragmentés entre les GPU. Chaque GPU ne stocke et ne met à jour que 1/N des états optimiseur.

L’économie est substantielle. Pour un modèle de 7B paramètres, les états Adam occupent environ 56 Go (7B × 4 octets × 2 états). Avec 8 GPU, chacun ne stocke que 7 Go d’états optimiseur au lieu de 56 Go. La communication reste identique au DDP classique (all-reduce des gradients), ce qui rend ZeRO-1 quasi-gratuit en termes de performance.

C’est le choix par défaut pour de nombreux systèmes d’entraînement. DeepSeek V3 utilise ZeRO-1 pour la composante data-parallèle de son entraînement.

ZeRO Stage 2 : + fragmentation des gradients

En plus des états optimiseur, les gradients sont fragmentés. Au lieu d’un all-reduce (qui somme puis redistribue), ZeRO-2 utilise un reduce-scatter : chaque GPU reçoit uniquement la portion de gradient dont il est responsable pour la mise à jour des poids.

L’économie mémoire est doublée par rapport à ZeRO-1 pour les gradients. Le volume total de communication est similaire au DDP classique, mais le pattern est différent (reduce-scatter + all-gather au lieu d’all-reduce).

ZeRO Stage 3 : + fragmentation des paramètres

Le stage le plus agressif : même les poids du modèle sont fragmentés. Aucun GPU ne détient la copie complète du modèle. Avant chaque forward ou backward par couche, un all-gather reconstitue temporairement les poids complets, puis ils sont libérés immédiatement après usage.

L’économie mémoire est proportionnelle au nombre de GPU : avec N GPU, chaque GPU stocke environ 1/N du modèle total (poids + gradients + états). En théorie, cela permet d’entraîner un modèle de taille quasi-illimitée en ajoutant des GPU. En pratique, l’overhead de communication (all-gather à chaque forward et backward) peut ralentir significativement l’entraînement.

Stage Fragmenté Économie mémoire Overhead comm. Cas d’usage recommandé
ZeRO-1 États optimiseur ~4× sur les états Nul (= DDP) 1B à 10B paramètres
ZeRO-2 + Gradients ~8× sur états + gradients Faible 10B à 30B paramètres
ZeRO-3 + Paramètres Linéaire en N GPU Significatif 30B+ paramètres
Règle pratique pour choisir le stage Commencez par ZeRO-1. Si ça tient en mémoire, restez-y (c’est le plus performant). Si ça ne passe pas, passez à ZeRO-2. ZeRO-3 est le dernier recours quand même ZeRO-2 ne suffit pas. Chaque stage ajoute de l’overhead de communication. N’utilisez jamais un stage plus élevé que nécessaire.

ZeRO-Offload et ZeRO-Infinity

L’une des contributions les plus percutantes de DeepSpeed est l’offloading : la capacité de décharger une partie des données du modèle vers la mémoire CPU ou vers des disques NVMe, libérant la mémoire GPU pour le calcul.

ZeRO-Offload (CPU)

ZeRO-Offload combine ZeRO-2 avec le déchargement des états optimiseur et des gradients vers la CPU. L’optimiseur (Adam) est exécuté directement sur la CPU via DeepSpeedCPUAdam, une implémentation optimisée qui est 5 à 7 fois plus rapide que l’Adam standard de PyTorch sur CPU.

Résultat : un seul GPU V100 (32 Go) peut entraîner un modèle de 13B paramètres, soit 10x plus que ce que PyTorch seul permet. L’overhead est acceptable car les calculs lourds (forward, backward) restent sur GPU, seule la mise à jour des poids migre vers la CPU.

ZeRO-Infinity (NVMe)

ZeRO-Infinity pousse le concept plus loin en offloadant également vers les disques NVMe. Cela permet d’exploiter des téraoctets de stockage SSD pour les états du modèle. Sur un seul noeud DGX avec 8 GPU, ZeRO-Infinity permet théoriquement de fine-tuner des modèles dépassant le trillion de paramètres.

L’offloading NVMe ajoute plus de latence que l’offloading CPU. C’est un outil pour les cas extrêmes où ni la mémoire GPU ni la mémoire CPU ne suffisent.

{
    "zero_optimization": {
        "stage": 3,
        "offload_optimizer": {
            "device": "nvme",
            "nvme_path": "/local_nvme"
        },
        "offload_param": {
            "device": "nvme",
            "nvme_path": "/local_nvme"
        }
    }
}

Les autres piliers de DeepSpeed

DeepSpeed ne se limite pas à ZeRO. La bibliothèque propose un ensemble complet d’optimisations pour l’entraînement et l’inférence.

Pipeline Parallelism

DeepSpeed implémente le pipeline parallelism avec le schedule 1F1B (One-Forward-One-Backward) pour minimiser les bulles. Combiné avec ZeRO, il forme le parallélisme 3D (TP de Megatron-LM × PP de DeepSpeed × DP/ZeRO). C’est cette combinaison qui a été utilisée pour entraîner BLOOM (176B paramètres) sur le cluster Jean Zay du CNRS.

Optimisations de communication

DeepSpeed propose plusieurs optimiseurs de communication compressée pour réduire le volume échangé entre GPU :

1-bit Adam : compresse les gradients en n’envoyant que le signe (1 bit par valeur), réduisant le volume de communication de 26x tout en maintenant une convergence comparable à Adam standard.

ZeRO++ : optimise ZeRO-3 avec des all-gather asynchrones et pipelinés, du quantized communication (communication en INT8 au lieu de FP16/BF16), et un hierarchical partitioning qui réduit le volume de communication inter-noeud.

Mixed Precision

DeepSpeed supporte nativement l’entraînement en FP16, BF16 et FP8. La configuration se fait via le fichier JSON DeepSpeed, avec gestion automatique du loss scaling pour FP16.

Activation Checkpointing

DeepSpeed intègre le checkpointing d’activations, qui libère la mémoire des activations après la passe forward et les recalcule pendant le backward. Cela échange du calcul contre de la mémoire, un compromis essentiel pour les grands modèles. DeepSpeed propose aussi le CMO (Contiguous Memory Optimization) pour réduire la fragmentation mémoire.

DeepSpeed-FastGen (Inférence)

DeepSpeed-FastGen est le moteur d’inférence de DeepSpeed, concurrent de vLLM et TensorRT-LLM. Il utilise la technologie Dynamic SplitFuse pour optimiser le scheduling des requêtes. En janvier 2026, FastGen a ajouté le support des modèles MoE (Mixtral), Phi-2 et Falcon, avec des kernels optimisés pour les GPU NVIDIA.

DeepSpeed-MII (Model Implementations for Inference)

MII rend l’inférence haute performance accessible en quelques lignes de code, avec des implémentations optimisées pour des milliers de modèles Hugging Face. MII promet jusqu’à 5,7x de speedup sur BLOOM 176B par rapport aux implémentations standard.

Configuration pratique de DeepSpeed

DeepSpeed se configure entièrement via un fichier JSON. C’est l’un de ses points forts : pas besoin de modifier le code du modèle pour activer les optimisations.

Configuration ZeRO-2 basique

{
    "train_batch_size": 64,
    "gradient_accumulation_steps": 4,
    "gradient_clipping": 1.0,
    "fp16": {
        "enabled": true,
        "loss_scale": 0,
        "loss_scale_window": 1000
    },
    "zero_optimization": {
        "stage": 2,
        "contiguous_gradients": true,
        "overlap_comm": true,
        "reduce_scatter": true,
        "reduce_bucket_size": 5e8,
        "allgather_bucket_size": 5e8
    }
}

Configuration ZeRO-3 avec Offload CPU

{
    "train_batch_size": 32,
    "gradient_accumulation_steps": 8,
    "bf16": {
        "enabled": true
    },
    "zero_optimization": {
        "stage": 3,
        "offload_optimizer": {
            "device": "cpu",
            "pin_memory": true
        },
        "offload_param": {
            "device": "cpu",
            "pin_memory": true
        },
        "overlap_comm": true,
        "contiguous_gradients": true,
        "sub_group_size": 1e9,
        "reduce_bucket_size": "auto",
        "stage3_prefetch_bucket_size": "auto",
        "stage3_param_persistence_threshold": "auto"
    }
}

Intégration avec PyTorch

L’intégration dans un script PyTorch existant est minimale :

import deepspeed

# Initialisation DeepSpeed (remplace DDP + optimizer)
model, optimizer, _, _ = deepspeed.initialize(
    model=model,
    model_parameters=model.parameters(),
    config="ds_config.json"
)

# Boucle d'entraînement
for batch in dataloader:
    loss = model(batch)
    model.backward(loss)    # Remplace loss.backward()
    model.step()            # Remplace optimizer.step()

Lancement avec le launcher DeepSpeed :

deepspeed --num_gpus=8 train.py --deepspeed_config ds_config.json

Intégration avec Hugging Face

Le Hugging Face Trainer supporte DeepSpeed nativement. Il suffit de passer le fichier de configuration :

from transformers import TrainingArguments

training_args = TrainingArguments(
    output_dir="./output",
    deepspeed="ds_config.json",
    bf16=True,
    per_device_train_batch_size=4,
    gradient_accumulation_steps=4,
)

Hugging Face Accelerate offre une alternative encore plus simple avec la commande accelerate config qui génère la configuration DeepSpeed interactivement.

DeepSpeed ZeRO vs PyTorch FSDP

ZeRO-3 et PyTorch FSDP sont fonctionnellement équivalents : tous deux fragmentent les poids, gradients et états optimiseur entre les GPU. Les différences sont dans l’implémentation et l’écosystème.

Critère DeepSpeed ZeRO PyTorch FSDP
Granularité 3 stages progressifs (1, 2, 3) FULL_SHARD (≈ ZeRO-3) ou SHARD_GRAD_OP (≈ ZeRO-2)
Offloading CPU ✅ Natif (CPU + NVMe) ✅ Basique (CPU uniquement)
Offloading NVMe ✅ ZeRO-Infinity
Communication compressée ✅ 1-bit Adam, ZeRO++
Configuration Fichier JSON externe Code Python (API PyTorch)
Combinaison avec TP Via Megatron-DeepSpeed Via DeviceMesh natif PyTorch
Maintenance Microsoft (communauté active) Meta/PyTorch (intégré au framework)
Facilité de debug Modérée (boîte noire JSON) Bonne (code Python transparent)

Notre verdict : pour le fine-tuning de modèles Hugging Face, DeepSpeed reste très populaire grâce à son intégration mature avec le Trainer. Pour le pré-entraînement à grande échelle avec parallélisme multi-dimensionnel, FSDP combiné avec Megatron-LM (via Megatron-FSDP) gagne du terrain. Si vous avez besoin d’offloading NVMe ou de communication compressée, DeepSpeed n’a pas d’équivalent côté PyTorch natif.

Modèles entraînés avec DeepSpeed

DeepSpeed a un historique impressionnant de modèles de référence :

Modèle Paramètres Composants DeepSpeed utilisés
BLOOM (BigScience) 176B Megatron-DeepSpeed (ZeRO + PP + TP)
Megatron-Turing NLG 530B DeepSpeed 3D parallelism
Codegen (Salesforce) 16B ZeRO Stage 3
ChatGLM (Tsinghua) 130B ZeRO Stage 3 + Pipeline
Phi-2 (Microsoft) 2.7B ZeRO-2 (fine-tuning optimisé)

Roadmap Q1 2026

Le roadmap officiel de DeepSpeed pour Q1 2026, publié sur GitHub, mentionne plusieurs axes de développement :

Support TPU. DeepSpeed travaille à supporter les TPU de Google, ce qui élargirait considérablement son écosystème matériel.

SuperOffloading pour MoE. Une nouvelle technique d’offloading optimisée pour les architectures Mixture of Experts, présentée à ASPLOS 2026 sous le nom de « SuperOffload ». L’objectif est de tirer parti des « superchips » (comme le NVIDIA Grace Hopper) qui combinent CPU et GPU sur le même die avec une bande passante mémoire unifiée.

Architectures émergentes. Adaptation aux nouvelles architectures de modèles qui sortent du paradigme Transformer classique.

Tuning de performance DeepSpeed

Obtenir les meilleures performances avec DeepSpeed demande d’ajuster plusieurs paramètres clés dans la configuration JSON.

Taille des buckets de communication

Les paramètres reduce_bucket_size et allgather_bucket_size contrôlent la granularité des opérations collectives. Des buckets trop petits augmentent la latence (trop d’opérations séparées), des buckets trop grands augmentent la mémoire de pointe. La valeur par défaut (5e8, soit 500M éléments = ~1 Go en FP16) est un bon point de départ. Réduisez si vous manquez de mémoire, augmentez si votre bande passante réseau le permet.

Overlap de communication

Le paramètre overlap_comm: true permet de chevaucher la communication (reduce-scatter/all-gather) avec le calcul du backward. C’est essentiel pour masquer la latence réseau. Activez-le systématiquement sauf si vous observez des instabilités de convergence (rare).

Prefetching ZeRO-3

En ZeRO-3, stage3_prefetch_bucket_size contrôle combien de paramètres sont pré-chargés (all-gather) avant leur utilisation effective. Un prefetch agressif réduit les temps d’attente mais consomme plus de mémoire. La valeur « auto » laisse DeepSpeed optimiser automatiquement ce paramètre en fonction de la mémoire disponible.

Pin memory pour l’offload

Quand vous utilisez l’offloading CPU, activez toujours pin_memory: true. La mémoire « pinned » (page-locked) permet des transferts CPU-GPU plus rapides car elle ne peut pas être swappée par l’OS. Le coût est une réduction de la mémoire CPU disponible pour d’autres tâches, mais le gain de performance est systématiquement positif pour l’entraînement.

Limites et pièges courants

Debugging complexe

DeepSpeed ajoute une couche d’abstraction qui rend le debugging plus difficile. Les erreurs de mémoire, de communication ou de convergence peuvent être obscurcies par la machinerie interne de ZeRO. Le mode JSON « boîte noire » peut être frustrant quand un paramètre mal configuré provoque un comportement inattendu.

Compatibilité matérielle

DeepSpeed est principalement optimisé pour les GPU NVIDIA avec CUDA. Le support AMD (ROCm), Intel XPU et d’autres accélérateurs existe mais reste moins mature. Certains ops JIT-compiled peuvent échouer sur des configurations matérielles non testées.

ZeRO-3 n’est pas gratuit

Le stage 3 ajoute un volume de communication considérable. Sur des petits modèles (< 10B paramètres) avec des interconnexions lentes, ZeRO-3 peut être plus lent que le DDP classique avec un modèle plus petit ou quantizé. Mesurez toujours le throughput réel avant de valider une configuration.

Attention aux checkpoints ZeRO-3 Avec ZeRO-3, les checkpoints sont fragmentés entre les GPU. Si vous changez le nombre de GPU entre la sauvegarde et le chargement, les checkpoints ne sont pas directement compatibles. Utilisez l’option zero3_save_16bit_model: true pour sauvegarder une copie consolidée FP16 du modèle, ou utilisez torch.distributed.checkpoint pour un format portable.

Questions fréquentes sur DeepSpeed

DeepSpeed est-il gratuit ?

Oui. DeepSpeed est open-source sous licence MIT, ce qui permet une utilisation libre en contexte commercial et académique. Il est maintenu par Microsoft Research avec des contributions communautaires actives. L’installation se fait via pip install deepspeed. Les extensions C++/CUDA sont compilées en JIT (Just-In-Time) au premier usage, ce qui peut prendre quelques minutes lors de la première exécution.

Quel stage ZeRO utiliser pour le fine-tuning d’un modèle 7B ?

Avec un seul GPU H100 (80 Go), ZeRO-2 avec offloading CPU suffit pour le fine-tuning d’un modèle 7B en BF16 avec LoRA ou même en full fine-tuning. ZeRO-1 peut suffire si vous utilisez LoRA (qui réduit drastiquement le nombre de paramètres entraînables). ZeRO-3 est rarement nécessaire pour un 7B sauf si votre GPU a peu de mémoire (16-24 Go). Avec 4+ GPU, ZeRO-1 est presque toujours suffisant pour un modèle 7B.

DeepSpeed fonctionne-t-il avec PyTorch Lightning ?

Oui. PyTorch Lightning intègre DeepSpeed comme stratégie native. Vous pouvez activer ZeRO-2 ou ZeRO-3 avec une seule ligne : Trainer(strategy="deepspeed_stage_2"). Lightning gère automatiquement le lancement distribué, le checkpointing et le logging. L’offloading CPU est aussi supporté via strategy="deepspeed_stage_2_offload" ou "deepspeed_stage_3_offload".

DeepSpeed est-il meilleur que Megatron-LM ?

Ce ne sont pas des concurrents directs. Megatron-LM excelle dans le tensor parallelism et le pré-entraînement à très grande échelle, tandis que DeepSpeed excelle dans l’optimisation mémoire (ZeRO) et l’offloading. Les deux sont souvent combinés : « Megatron-DeepSpeed » utilise le tensor parallelism de Megatron-LM avec ZeRO et le pipeline parallelism de DeepSpeed. C’est cette combinaison qui a entraîné BLOOM. Pour le fine-tuning, DeepSpeed seul est généralement suffisant. Pour le pré-entraînement de modèles 100B+, la combinaison Megatron + DeepSpeed est la référence.

DeepSpeed supporte-t-il l’inférence ?

Oui, via DeepSpeed-FastGen et DeepSpeed-MII. FastGen optimise le scheduling des requêtes avec Dynamic SplitFuse, tandis que MII fournit des implémentations optimisées pour des milliers de modèles. Cependant, pour l’inférence de LLM en production, vLLM et TensorRT-LLM sont généralement préférés pour leur écosystème plus large et leur support du paged attention plus mature. DeepSpeed-Inference reste un bon choix pour les modèles non-LLM ou les cas d’usage spécifiques.

Polydesk.ai — Footer