Entraînez vos LLM plus vite : Accelerate ND-Parallel et le multi-GPU
L’entraînement de modèles d’intelligence artificielle à grande échelle sur plusieurs GPU présente des défis significatifs, principalement en raison de l’interaction complexe des diverses stratégies de parallélisme. Pour rationaliser ce processus complexe, des plateformes comme Hugging Face Accelerate, en collaboration avec Axolotl, ont intégré des méthodes permettant aux développeurs de combiner différentes techniques de parallélisme de manière transparente au sein de leurs scripts d’entraînement. Cette innovation vise à simplifier la mise à l’échelle des modèles, de la configuration des configurations distribuées de base à l’orchestration d’un parallélisme multidimensionnel sophistiqué sur de vastes clusters de calcul.
Au cœur de l’entraînement multi-GPU se trouvent plusieurs stratégies de parallélisme fondamentales, chacune conçue pour résoudre des goulots d’étranglement spécifiques de la mise à l’échelle.
Le Parallélisme de Données (DP) est l’approche la plus simple, où le modèle entier, ainsi que ses gradients et états d’optimiseur, sont répliqués sur chaque GPU. Les lots de données sont ensuite divisés équitablement entre ces appareils, et les gradients sont synchronisés avant la mise à jour des paramètres du modèle. Bien que cela augmente considérablement le débit par rapport à l’entraînement sur un seul appareil, sa principale limitation est l’exigence que le modèle complet doit tenir dans la mémoire d’un seul GPU.
Lorsque les modèles deviennent trop grands pour un seul appareil, le Parallélisme de Données Entièrement Fragmenté (FSDP) offre une solution. Inspiré par des techniques comme ZeRO-3 de DeepSpeed, FSDP fragmente les poids, les gradients et les états d’optimiseur du modèle sur plusieurs GPU. Chaque appareil reçoit toujours une portion du lot de données. Contrairement au DP, FSDP évite de répliquer le modèle entier ; au lieu de cela, il ne collecte que les poids nécessaires pour une couche spécifique avant son passage avant ou arrière, puis les re-fragmente. Cette méthode échange un surcoût de communication accru contre des économies de mémoire substantielles. Bien que FSDP puisse s’adapter à de nombreux GPU, même sur plusieurs nœuds (machines hébergeant plusieurs GPU), son efficacité peut diminuer avec une communication inter-nœuds plus lente, en particulier lors du fragmentage sur un réseau entier de dispositifs.
Le Parallélisme Tensoriel (TP), une forme de parallélisme de modèle, aborde le défi des couches de modèle individuelles extrêmement grandes. Au lieu de répliquer ou de fragmenter le modèle entier, TP divise les grandes couches linéaires (courantes dans les modèles transformeurs) entre les appareils. Chaque appareil ne calcule qu’une portion de la multiplication matricielle, tout en recevant un lot de données identique. Cela crée des partitions de mémoire statiques, offrant une réduction de mémoire constante proportionnelle à la taille du groupe TP. TP est très efficace pour distribuer le calcul et la mémoire au sein d’un seul nœud, où une communication inter-GPU à large bande passante (par exemple, NVLink) est disponible. Cependant, en raison des exigences fréquentes de synchronisation des activations, TP n’est généralement pas recommandé pour la mise à l’échelle sur plusieurs nœuds ou sur des connexions plus lentes comme PCIe.
Avec l’avènement des grands modèles de langage (LLM) et leur demande de longueurs de séquence de plus en plus longues — atteignant parfois des centaines de milliers, voire des millions de jetons — un nouveau défi de mémoire apparaît. Le mécanisme d’attention, un composant central des transformeurs, évolue quadratiquement avec la longueur de la séquence, entraînant une consommation de mémoire prohibitive pour les activations. Le Parallélisme de Contexte (CP) s’attaque à cela en fragmentant la séquence d’entrée sur les GPU. Chaque appareil ne traite qu’un morceau du contexte complet, calculant une plus petite portion de la matrice d’attention. Pour assurer un calcul d’attention correct, qui nécessite l’accès à la séquence complète, des techniques comme RingAttention sont utilisées, faisant circuler les matrices de clé et de valeur entre les appareils. Cela permet à chaque requête de calculer des scores d’attention par rapport à la séquence entière tout en distribuant la charge de mémoire et de calcul.
Pour les scénarios d’entraînement les plus exigeants, en particulier ceux qui s’étendent sur plusieurs nœuds, les développeurs peuvent composer ces stratégies en “Parallélismes ND”, en tirant parti d’une vue bidimensionnelle des clusters de calcul : communication intra-nœud rapide sur un axe et communication inter-nœud plus lente sur un autre.
Le Parallélisme de Données Fragmenté Hybride (HSDP) combine FSDP et DP. Il applique FSDP au sein de chaque nœud pour utiliser des liaisons intra-nœuds plus rapides pour le fragmentage gourmand en mémoire, tout en répliquant le modèle et en synchronisant les gradients en utilisant DP entre les nœuds. Cela optimise le surcoût de communication pour les grandes configurations multi-nœuds.
La combinaison du Parallélisme de Données Entièrement Fragmenté avec le Parallélisme Tensoriel (FSDP + TP) implique de fragmenter le modèle sur les nœuds en utilisant FSDP et au sein d’un nœud en utilisant TP. Cette combinaison puissante peut réduire la latence de FSDP, distribuer des couches trop grandes pour un seul appareil et potentiellement diminuer la taille du lot global. De même, le Parallélisme de Données Entièrement Fragmenté avec le Parallélisme de Contexte (FSDP + CP) peut être utilisé, bien que moins courant, pour réduire davantage l’utilisation de la mémoire lorsque des longueurs de séquence extrêmement grandes sont combinées avec FSDP.
Pour une flexibilité et une échelle maximales, le Parallélisme de Données Fragmenté Hybride avec Parallélisme Tensoriel (HSDP + TP), souvent appelé parallélisme 3D, crée une structure hiérarchique. Le parallélisme de données réplique le modèle sur des groupes de nœuds, FSDP fragmente le modèle au sein de chaque groupe, et TP divise les couches individuelles au sein de chaque nœud. Cela offre la plus grande adaptabilité pour équilibrer l’utilisation de la mémoire et le débit dans des environnements d’entraînement massifs.
Au-delà de la sélection de la bonne stratégie de parallélisme, plusieurs considérations pratiques sont cruciales pour optimiser l’entraînement distribué. Pour FSDP, l’activation du chargement efficace de la RAM du CPU et du point de contrôle du dictionnaire d’état fragmenté est vitale pour gérer des modèles trop grands pour la mémoire d’un seul appareil. La taille de lot effective, qui impacte significativement la stabilité et le débit de l’entraînement, est déterminée par la taille du micro-lot, les étapes d’accumulation de gradients et la taille du monde du parallélisme de données. À mesure que la taille de lot effective augmente avec le parallélisme, le taux d’apprentissage doit être mis à l’échelle proportionnellement pour maintenir la stabilité. Enfin, le point de contrôle des gradients offre des économies de mémoire supplémentaires en échangeant le calcul contre la mémoire ; il recalcule sélectivement les activations intermédiaires pendant le passage arrière, réduisant la mémoire d’activation de 60 à 80 % au prix d’une augmentation modeste de 20 à 30 % du temps d’entraînement. Cette technique fonctionne de manière transparente avec toutes les stratégies de parallélisme, ce qui en fait un outil précieux lorsque les contraintes de mémoire persistent.
En fin de compte, la configuration optimale implique souvent l’expérimentation, car l’équilibre idéal entre la mémoire, le calcul et le surcoût de communication dépend fortement du modèle spécifique, de l’ensemble de données et de la configuration matérielle. Ces techniques avancées de parallélisme sont des outils indispensables, repoussant les limites de ce qui est possible dans le développement de modèles d’IA à grande échelle.