TL;DR -- Pour ceux d'entre vous qui n'ont pas le temps de lire 5 000 mots sur la plomberie asynchrone RL (nous comprenons, vous avez des modèles à former) :Cliquez pour agrandir la table des matières
- Le problème : dans la formation synchrone RL (apprentissage par renforcement), la génération de données (inférence de modèle pour créer des échantillons de données) domine le temps d'horloge : un seul lot de déploiements de 32 000 jetons sur un modèle 32 B (32 milliards de paramètres) peut prendre des heures, tandis que les GPU utilisés pour la formation restent inactifs.
- La solution sur laquelle tout le monde a convergé : désagréger (séparer) l'inférence et la formation sur différents pools de GPU, les connecter avec un tampon de déploiement (stockage temporaire pour les sorties du modèle) et transférer les poids de manière asynchrone (sans attendre), afin qu'aucune des parties n'attende l'autre.
- Nous avons étudié 16 bibliothèques open source qui implémentent ce modèle et les avons comparées sur 7 axes : primitives d'orchestration, conception de tampon, protocoles de synchronisation de poids, gestion de l'obsolescence, gestion du déploiement partiel, prise en charge de LoRA et backends de formation distribués.
- Principales conclusions : Ray domine l'orchestration (8 bibliothèques informatiques distribuées interrogées sur 16). La diffusion NCCL (NVIDIA Collective Communications Library) est la méthode par défaut pour transférer les poids des modèles. La gestion de l'obsolescence fait référence à la façon dont les échantillons de données obsolètes sont traités, allant de la simple suppression des anciens échantillons à l'utilisation d'une correction avancée de l'échantillonnage par importance. La formation LoRA (Low-Rank Adaptation) est peu prise en charge. Le support distribué du MoE (Mixture of Experts) est le différenciateur émergent.
Si vous préférez passer directement à la bonne partie, voici le tableau comparatif complet (aucune lecture requise, nous ne jugerons pas).
Mais sérieusement, si vous restez dans les parages, vous apprendrez peut-être une chose ou deux sur les raisons pour lesquelles vos GPU sont inactifs 60 % du temps.
modèle_version(Pas de double tampon)La formation Async RL est devenue le paradigme dominant pour la post-formation à grande échelle. Plusieurs tendances de la post-formation moderne ont rendu les boucles de formation synchrones presque impossibles à mettre à l'échelle :
L'écosystème open source a convergé vers une réponse architecturale commune : désagréger l'inférence de la formation sur des pools GPU distincts, les connecter avec un tampon de déploiement et laisser les deux côtés s'exécuter simultanément.
Nous développons un nouvel entraîneur asynchrone pour TRL, l'une des bibliothèques les plus utilisées pour la post-formation de modèles. Pour guider notre conception, nous avons étudié seize bibliothèques open source construites à partir de zéro autour de la formation asynchrone et les avons comparées sur sept axes : primitives d'orchestration, conception de tampon, protocoles de synchronisation de poids, gestion de l'obsolescence, gestion du déploiement partiel, prise en charge de LoRA et backends de formation distribués. Cet article distille les principes de conception que nous avons extraits de cette enquête.
Au-delà de RL, le besoin d’une infrastructure asynchrone est de plus en plus évident. Par exemple, la distillation sur politique, où un élève génère des séquences et un enseignant les note, reflète le GRPO mais échange la fonction de récompense contre une passe avant de l'enseignant. Compte tenu de cette similitude structurelle, tout dans cette étude s'applique également à la distillation asynchrone. Nous reviendrons sur ce point plus large dans la section 5.
TRL actuelFormateur GRPOimplémente la boucle GRPO complète (échantillonnage rapide, génération, notation des récompenses, calcul des avantages, mise à jour du gradient et synchronisation des poids) en un seul processus synchrone.étape_entraînement()appel. Cette conception est simple et correcte, mais elle ne peut pas chevaucher la génération et la formation, ce qui laisse de côté une utilisation importante du GPU.
En regardant leFormateur GRPO, nous avons les phases suivantes séquentiellement au sein de chaque étape de formation :
modèle.generate()(ou transmettre les requêtes à un serveur vLLM) pour produire des complétions G par invite. Ceci est autorégressif et domine le temps de l’horloge murale.Chaque phase se bloque jusqu'à la fin avant que la suivante ne commence. La chronologie ressemble à ceci :
TRL propose leétapes_par_générationoption de configuration pour réutiliser un seul ensemble de déploiements sur plusieurs étapes de dégradé (réutilisation temporelle), amortissant ainsi le coût de génération. Mais l’appel de génération lui-même reste totalement synchrone et bloquant ; le formateur ne peut pas commencer le calcul du gradient tant que chaque achèvement du lot n'est pas terminé.
La bibliothèque prend également en charge l'exécution de vLLM dansserveurmode en tant que processus distinct. Cela libère le GPU d'entraînement pendant la génération, mais deux barrières de synchronisation strictes subsistent : les appels HTTP jusqu'au retour de toutes les achèvements, et la synchronisation du poids bloque à la fois l'entraîneur et le vLLM pendant le transfert.
Avant d'aborder la formation asynchrone, il est essentiel de comprendre les deux topologies de déploiement pour la formation RL avec un moteur d'inférence distinct :
colocaliser_mode:Le plus grand avantage du mode désagrégé est que l’inférence et la formation peuvent s’exécuter simultanément. Pendant que le formateur calcule les gradients sur le lot N, le pool d'inférence génère déjà des déploiements pour le lot N+K, permettant un entraînement asynchrone. Cependant, cet avantage a un coût : des GPU supplémentaires sont nécessaires.
La concurrence, l'asynchronicité et le parallélisme sont des concepts distincts qui sont souvent confondus. Dans cet article, lorsque nous parlons de « formation asynchrone », nous entendons quelque chose de spécifique : la génération et la formation s'exécutant en parallèle, avec un chevauchement effectif ; le pool d'inférence produit le prochain lot de déploiements tandis que le pool de formation calcule les gradients sur le lot actuel. Il s’agit fondamentalement d’une capacité en mode désagrégé. Le mode colocalisé peut bénéficier d'optimisations telles que la gestion de la mémoire veille/réveil ou un repartitionnement rapide sur place pour accélérer l'inférence, mais il ne peut pas obtenir un véritable chevauchement simultané ; l'inférence et la formation se relaient toujours sur les mêmes GPU. Chaque bibliothèque de cette enquête qui implémente un chevauchement asynchrone significatif utilise le mode désagrégé comme base.
Dans la formation RL pour les modèles de raisonnement, la génération autorégressive domine le temps de l'horloge murale. Un seul déploiement pour une tâche mathématique ou de codage peut produire 8 000 à 64 000 jetons de raisonnement en chaîne de pensée (voir Longueurs des déploiements QED-Nano).
Pour concrétiser cela, considérez les benchmarks vLLM sur un seul GPU H100 de 80 Go (bf16, pas de quantification, mode de débit hors ligne). Un modèle 7B (DeepSeek-R1-Distill-Qwen-7B) atteint un débit global d'environ 6 300 jetons de sortie/s ; un modèle 32B (DeepSeek-R1-Distill-Qwen-32B) tombe à environ 1 200 jetons de sortie/s. Il s'agit du débit total pour toutes les requêtes simultanées, le nombre que le moteur d'inférence peut transmettre par seconde, quel que soit le nombre de séquences partageant le GPU.
Considérons maintenant une étape de formation GRPO typique : G = 8 achèvements par invite × 64 invites/lot = 512 déploiements. Combien de temps dure la génération ?
| Longueur de sortie par déploiement | Total des jetons de sortie (512 déploiements) | Temps sur 1×H100 (7B @ ~6K tok/s) | Temps sur 1×H100 (32B @ ~1,2K tok/s) |
|---|---|---|---|
| Jetons 2K (CoT court) | ~1 million de jetons | ~3 minutes | ~14 minutes |
| Jetons 8K (CoT moyen) | ~4 millions de jetons | ~11 minutes | ~56 minutes |
| 32 000 jetons (CoT long) | ~16 millions de jetons | ~45 minutes | ~3,7 heures |
Même à court terme (2K tokens générés avec un modèle 7B), la génération à elle seule consomme plusieurs minutes par étape de formation. À long terme, où les modèles de raisonnement frontalier fonctionnent de plus en plus, une seule phase de génération peut prendre des heures sur un GPU. La mise à l'échelle vers 8 GPU d'inférence divise ces temps par environ ...
[Courte citation de 8% de l'article original]