Parallélisme de données (DP) : chaque GPU a une copie complète du modèle, traite un mini-lot différent, et les gradients sont moyennés entre les GPU. Simple et efficace pour les modèles qui tiennent sur un GPU. Parallélisme de tenseurs (TP) : les couches individuelles sont divisées entre les GPU, chaque GPU calculant une partie de chaque multiplication matricielle. Nécessaire quand les poids d'une seule couche ne tiennent pas sur un GPU. Parallélisme de pipeline (PP) : différentes couches tournent sur différents GPU, avec des micro-lots circulant dans le pipeline.
Fully Sharded Data Parallel (FSDP, de PyTorch) et DeepSpeed ZeRO (de Microsoft) fragmentent les paramètres du modèle, les gradients et les états de l'optimiseur entre les GPU. Chaque GPU ne stocke qu'une fraction du modèle, et les paramètres sont rassemblés à la demande pour le calcul, puis libérés. Ça permet d'entraîner des modèles bien plus gros que la mémoire d'un seul GPU. DeepSpeed ZeRO a trois étapes : l'étape 1 fragmente les états de l'optimiseur, l'étape 2 ajoute les gradients, l'étape 3 ajoute les paramètres.
Le défi fondamental de l'entraînement distribué est la communication : les GPU doivent synchroniser les gradients (en parallélisme de données) ou échanger les activations (en parallélisme de modèle/pipeline). Cette communication passe par NVLink (au sein d'un nœud, 900 Go/s) ou InfiniBand (entre nœuds, 400 Gb/s). L'efficacité d'entraînement chute quand les GPU passent plus de temps à attendre la communication qu'à calculer. Les configurations optimales minimisent la communication inter-nœuds en gardant les opérations fortement couplées (comme le parallélisme de tenseurs) au sein d'un nœud et les opérations faiblement couplées (comme le parallélisme de données) entre les nœuds.