Data Parallelism
iaDéfinition
Le Data Parallelism (DP) est la technique la plus fondamentale de parallelisme pour l'entrainement des LLMs : plusieurs copies identiques du modele sont maintenues sur differents GPUs, chaque replique traitant un sous-ensemble (mini-batch) different du batch d'entrainement. Les gradients sont synchronises par un all-reduce a la fin de chaque step pour garder les repliques coherentes. PyTorch DDP (DistributedDataParallel) est l'implementation standard : il synchronise les gradients via un all-reduce NCCL (sur GPU NVIDIA) ou GLOO (sur CPU) apres chaque backward pass. DDP est extremement efficace quand le modele tient dans la VRAM d'un seul GPU car la synchronisation se fait uniquement sur les gradients (pas les poids). Le principal avantage du Data Parallelism : throughput lineaire avec le nombre de GPUs. 8 GPUs en DP traitent theoriquement 8x plus de tokens par seconde qu'un seul GPU. En pratique, avec NVLink, l'efficacite est de 90-95%. Sans NVLink (sur Ethernet 100Gb), l'efficacite peut descendre a 70-80% pour les grands modeles a cause de la latence de communication all-reduce. La limite du Data Parallelism standard (DDP) : chaque GPU doit stocker le modele complet + les gradients + l'etat de l'optimiseur. Pour un modele 70B en BF16, cela necessite >400GB par GPU (poids 140GB + gradients 140GB + AdamW momentum/variance 280GB). C'est pourquoi ZeRO (DeepSpeed) et FSDP ont ete developpes pour distribuer cet etat entre les GPUs. En production, le Data Parallelism est combine avec le Tensor et Pipeline Parallelism dans les configurations 3D parallelism : Data Parallelism gere le scaling du throughput (plus de tokens/seconde), Tensor/Pipeline Parallelism gere le scaling de la taille du modele (plus de parametres).
Data Parallelism avec PyTorch DDP
import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDP
def train_ddp(rank, world_size):
dist.init_process_group('nccl', rank=rank, world_size=world_size)
model = MyModel().to(rank)
model = DDP(model, device_ids=[rank])
# Chaque processus lit des batches differents
sampler = DistributedSampler(dataset, num_replicas=world_size, rank=rank)
dataloader = DataLoader(dataset, sampler=sampler, batch_size=4)
for batch in dataloader:
loss = model(batch).loss
loss.backward()
# DDP all-reduce automatique ici (hook)
optimizer.step()
# Lancer sur 4 GPUs
# torchrun --nproc_per_node=4 train.py
Articles liés
Expert en cybersécurité offensive et intelligence artificielle. Pentest, audit et développement IA sur-mesure.
Services
- Audit Infrastructure
- Audit Kubernetes
- Audit Microsoft 365
- Audit Sécurité Réseau
- Analyse de Risques
- Audit Active Directory
- Audit Application Web
- Audit Cloud (AWS/Azure/GCP)
- Audit Messagerie
- Audit API (OWASP Top 10)
- Audit DevSecOps & CI/CD
- Audit Code Source (SAST)
- Audit Postes de Travail
- Audit Sauvegarde & Résilience
- Audit OT/SCADA (IEC 62443)
- Développement IA
- Formations
Ressources
Projets & Outils
© 2026 Ayi NEDJIMI Consultants. Tous droits réservés.
Un projet cybersécurité ?
Expert dispo · Réponse 24h