Comment nous avons développé les modèles d'apprentissage profond (LLM) de nouvelle génération de DeepL avec FP8 pour entraîner et effectuer l'inférence

Dans cet article
- Quelle est la différence entre les formats BF16 et FP8 ?
- Entraîner les modèles d'apprentissage automatique à grande échelle (LLM) de DeepL
- Application du format FP8 pour entraîner en précision mixte
- FP8 et BF16 pour les performances d'entraînement
- FP8 et BF16 pour la qualité de l'entraînement LLM
- Qualité de l'entraînement en aval FP8 par rapport à BF16
- De l'entraînement FP8 à l'inférence
- Les avantages du FP8 pour l'inférence
- À propos des auteurs
Lorsque DeepL a déployé notre NVIDIA DGX SuperPOD actuel équipé de 544 GPU NVIDIA H100 Tensor Core, nous avons non seulement bénéficié d'une augmentation considérable de la puissance de calcul, mais également d'une amélioration significative de l'efficacité énergétique. Le H100 introduit également la prise en charge native des types de données à virgule flottante 8 bits (FP8), grâce à une nouvelle génération de cœurs Tensor, qui permettent au GPU d'effectuer des multiplications matricielles et d'autres opérations tensorielles avec une précision FP8. En calculant les multiplications matricielles en FP8, nous pouvons augmenter le débit lorsqu'il s'agit d'entraîner et de déployer nos grands modèles linguistiques (LLM), car la plupart des calculs impliqués dans les LLM modernes prennent la forme de multiplications matricielles.
Le passage d'une précision de calcul de 16 bits à 8 bits a eu un impact significatif sur le développement des modèles linguistiques de nouvelle génération de DeepL. Cela nous permet de développer des modèles linguistiques beaucoup plus vastes, avec un nombre de paramètres nettement supérieur, qui améliorent significativement la qualité selon les experts linguistiques, tout en respectant la même fenêtre de latence pour l'inférence de production. Cela signifie que les traductions surpassent nos modèles précédents de 1,4 fois pour les langues européennes et de 1,7 fois pour les combinaisons de langues plus complexes telles que l'anglais et le japonais, tout en fournissant des résultats efficaces aussi rapidement. Cela signifie également que nos modèles peuvent traiter un plus grand nombre de demandes sur un plus grand nombre de fonctionnalités et de fonctions, sans compromettre l'expérience utilisateur.
En d'autres termes, entraîner et l'inférence FP8 ont joué un rôle central dans la mise à l'échelle de l'IA linguistique de DeepL.
Dans cet article, nous souhaitons décrire le parcours que nous avons suivi afin d'appliquer FP8 à l'entraînement et à l'inférence, partager certains des outils et techniques qui ont contribué à cette réussite, et vous donner une idée des résultats que nous générons en termes de performances d'entraînement et d'inférence tout au long de ce processus.
Quelle est la différence entre les formats BF16 et FP8 ?
La différence entre BFloat16 (BF16) et FP8 peut être expliquée de manière simple : ce dernier utilise deux fois moins de bits pour exprimer les valeurs. En effet, BF16 utilise les 16 positions disponibles dans deux octets de 8 bits chacun. FP8 n'utilise qu'un seul octet.
Le nombre de bits disponibles détermine la précision avec laquelle vous pouvez déployer les éléments mantisse et exposant des nombres à virgule flottante en notation scientifique. BF16 comporte 1 bit de signe, 8 bits pour l'exposant et 7 bits pour la mantisse. FP8 dispose de moitié moins de bits, avec 1 bit de signe et 7 bits répartis entre l'exposant et la mantisse. Pour cette raison, sa portée est plus limitée et sa précision inférieure à celle du BF16. Il peut représenter une plage plus étroite et un nombre plus restreint de valeurs au sein de cette plage.
À titre d'exemple, supposons que nous souhaitions représenter l'âge de la Terre en milliards d'années (environ 4,543). En BF16, nous pouvons représenter cela précisément comme 0100000010010001.
Que diriez-vous de représenter ce nombre en FP8 ? Il existe en réalité deux formats FP8 parmi lesquels choisir : E4M3 et E5M2. Les lettres et les chiffres indiqués ici représentent la manière dont les bits sont répartis entre l'exposant (E) et la mantisse (M). Plus vous consacrez de bits à l'exposant, plus la plage de nombres que vous pouvez décrire est large, et plus vous consacrez de bits à la mantisse, plus vous pouvez décrire de nombres dans cette plage.
Quel que soit le format FP8 que vous choisissez, il n'est pas réellement possible de représenter précisément 4,543. Si vous optez pour E4M3, qui offre une précision relativement supérieure, vous obtiendrez le résultat le plus proche (4,5). Dans E5M2, le résultat le plus proche que vous pouvez obtenir est 5.
En contrepartie de ce manque de plage et de précision, le format FP8 permet des calculs plus rapides et nécessite beaucoup moins de mémoire que le format BF16. Cela est extrêmement précieux pour l'inférence et, avec la bonne approche, cela peut également s'avérer extrêmement précieux pour accélérer le fait d'entraîner. La question est de savoir quel niveau de précision et quelle ampleur l'entraînement LLM nécessite réellement. Avez-vous besoin de représenter l'âge de la Terre avec précision ? Ou est-ce que se rapprocher à 43 millions d'années près est suffisant ? Si vous vous intéressez à l'univers dans son ensemble, ce deuxième niveau de précision devrait vous convenir. L'erreur d'arrondi ne représente finalement qu'environ 0,3 % de l'âge de l'univers.
Le parcours de DeepL démontre que FP8 est en mesure de fournir les éléments nécessaires à une formation LLM de haute qualité, ce qui a ouvert de nouvelles perspectives quant aux tâches pour lesquelles nous entraînons nos modèles et à la manière dont nous les déployons dans la pratique.
Entraîner les modèles d'apprentissage automatique à grande échelle (LLM) de DeepL
Le parcours que nous entreprenons avec l'entraînement et l'inférence FP8 commence par l'entraînement de nos LLM. Après l'entraînement, nous affinons nos modèles sur certaines tâches, distillons les grands modèles en modèles plus petits, effectuons un apprentissage par renforcement et déployons un ensemble de stratégies de parallélisation afin de pouvoir exploiter le nombre considérable de GPU dont nous disposons.
Application du format FP8 pour entraîner en précision mixte
Nous avons migré notre code d'entraînement existant de BF16 vers FP8 en utilisant NVIDIA Transformer Engine : une bibliothèque d'entraînement fournie par NVIDIA qui accélère les modèles de transformateurs et prend en charge FP8. Transformer Engine fournit des composants essentiels qui facilitent l'entraînement à précision mixte, en gérant de manière transparente la conversion entre les formats FP8 et BF16 et en traitant les facteurs d'échelle.
Nous utilisons la configuration par défaut du moteur Transformer, telle que recommandée par NVIDIA, en utilisant E4M3 dans le passage direct pour entraîner, puis E5M2 dans le passage inverse. Cela signifie concrètement que nous utilisons le format avec une précision plus élevée pour prédire la distribution de probabilité du prochain token, puis le format avec une précision plus faible, mais une plage plus élevée, pour calculer les gradients nécessaires à la mise à jour du modèle, lorsque la précision est moins importante. Nous utilisons chacun des deux formats pour la tâche à laquelle il est le mieux adapté.
Dans le tableau ci-dessous, nous avons représenté tous les nombres pouvant être exprimés au format E4M3. Comme vous pouvez le constater, ces chiffres sont concentrés autour de zéro, avec une valeur maximale inférieure à 500. En réalité, le nombre de valeurs représentables pour les formats FP8 peut être imprimé dans un tableau très court. Le secret pour que ce format fonctionne pour entraîner, c'est de bien connaître la répartition de ces valeurs et de travailler en tenant compte de celle-ci.
Cela implique de stocker des facteurs d'échelle supplémentaires parallèlement aux tenseurs de poids FP8 afin de pallier la plage limitée et d'éviter les dépassements et les sous-dépassements. Lorsque vous effectuez des calculs avec vos tenseurs de faible précision, il est également nécessaire de tenir compte des facteurs d'échelle. Par exemple, lorsque vous multipliez deux tenseurs, vous utilisez la formule suivante : (A_fp8 * A_scale) x (B_fp8 * B_scale), où A_fp8 et B_fp8 sont des tenseurs 8 bits et les échelles sont des scalaires 32 bits. Il existe une prise en charge matérielle spécifique pour ces opérations.

FP8 et BF16 pour les performances d'entraînement
Lorsque nous évoquons les performances d'entraînement, nous faisons référence à la rapidité avec laquelle un modèle peut être entraîné compte tenu de la puissance de calcul dont il dispose. Afin de comparer les performances d'entraînement entre FP8 et BF16, nous examinons l'utilisation des FLOPS du modèle (MFU), qui correspond au nombre d'opérations en virgule flottante par seconde (FLOPS) effectuées par le modèle, exprimé en pourcentage des FLOPS techniquement possibles avec le matériel dont vous disposez.
Pour notre comparaison, nous avons utilisé le nombre de FLOPS possible avec le format BF16 comme dénominateur commun, bien que, techniquement parlant, il soit possible d'obtenir davantage de FLOPS en passant au format FP8. Cela nous a permis d'évaluer le gain supplémentaire en termes d'utilisation de la puissance de traitement disponible qui devient possible lorsque l'on passe de BF16 à FP8.
Comme le montre le graphique ci-dessous, l'efficacité avec laquelle notre modèle d'entraînement utilise la puissance de calcul disponible est passée de 44,6 % MFU à 67 % MFU avec FP8, ce qui a permis d'accélérer l'entraînement de notre modèle de 50 %.

Il s'agit d'un gain de performance remarquable en soi. Pour y parvenir, nous avons collaboré avec NVIDIA afin d'optimiser notre utilisation des fonctionnalités de Transformer Engine. Grâce à une autre configuration d'entraînement, nous avons réussi à augmenter progressivement les performances d'entraînement de 25 % en 15 mois, ce qui nous a permis d'atteindre 80 % de MFU.

FP8 et BF16 pour la qualité de l'entraînement LLM
Les gains obtenus par le FP8 en termes de performances d'entraînement sont donc particulièrement impressionnants. Cependant, le résultat qui nous importe vraiment chez DeepL est la qualité d'entraînement. Comment cela se compare-t-il à entraîner la qualité avec la précision BF16 ?
Afin de vérifier la qualité offerte par FP8, nous avons testé d'entraîner l'un de nos modèles dans les deux formats. Cela nous a permis de comparer les pertes entraînées et la qualité en aval.
Nous avons entraîné un modèle de 1,5 milliard sur trois mille milliards de jetons, puis comparé la qualité de l'entraînement FP8 à celle de l'entraînement BF16. La mesure clé ici était la perte à entraîner, qui fait référence à la capacité du modèle à prédire le prochain token.
Comme vous pouvez le constater dans le graphique ci-dessous, nous avons pu détecter une légère supériorité de BF16 par rapport à FP8, comme le montre notre ligne FP8 qui se situe juste au-dessus de celle de BF16. Cependant, cette différence est masquée par les fluctuations beaucoup plus importantes de la perte d'entraînement d'une étape à l'autre qui se produisent pour les deux formats, et dans les deux cas, nous constatons que la minimisation de la perte d'entraînement s'améliore au fil du temps.

Qualité de l'entraînement en aval FP8 par rapport à BF16
Nous avons ensuite évalué la qualité obtenue grâce à l'entraînement en FP8 par rapport à celui en BF16 dans une application pratique en aval.
Dans ce cas, nous avons évalué les performances du modèle lors de son utilisation en anglais et en allemand. Nous avons comparé la perplexité de validation, qui quantifie l'incertitude d'un modèle lorsqu'il prédit le prochain token d'une séquence. Une fois encore, on s'attend à ce que la perplexité diminue avec le temps. Dans ce scénario pratique, nous n'avons constaté aucune dégradation de la qualité avec l'entraînement FP8 par rapport à BF16.

Le passage de BF16 à FP8 nous permet d'entraîner nos modèles plus rapidement, avec une demande en mémoire réduite, tout en obtenant la même qualité d'entraînement, avec une dégradation minimale en termes de perte d'entraînement et une perplexité de validation comparable. Cela signifie concrètement que DeepL est en mesure de créer des modèles plus sophistiqués, capables de traiter des tâches plus complexes, en optimisant l'utilisation de la puissance de traitement. Cela élargit considérablement le champ des possibilités offertes par l'entraînement LLM.
De l'entraînement FP8 à l'inférence
La prochaine étape du processus consiste à préparer les LLM pour l'inférence en production. Ici, le gros du travail de prise en charge est effectué par NVIDIA TensorRT-LLM, la solution NVIDIA pour l'inférence LLM évolutive, qui prend en charge FP8. Il utilise les poids de votre modèle issus de l'entraînement et construit un moteur afin d'optimiser les opérations du modèle pour qu'il soit aussi efficace que possible en termes de calcul, à l'aide de techniques d'optimisation telles que la fusion de noyaux, le code C++/CUDA optimisé, la mise en cache KV et le traitement par lots continu en vol.
Les avantages du FP8 pour l'inférence
L'inférence pour les LLM implique toujours l'interaction entre le débit (le nombre de tokens pouvant être traités dans un laps de temps donné) et la latence. Il va sans dire que pour offrir la meilleure expérience client possible, il est essentiel de contrôler la latence. Cependant, le débit est également très important pour DeepL, car il définit le nombre de requêtes que nous pouvons traiter à un moment donné, et donc la portée de ce que notre modèle peut accomplir dans la pratique.
Il est inévitable que, lorsque le débit augmente, la latence ait tendance à augmenter également. Le regroupement de plusieurs requêtes permet d'augmenter le débit, mais au détriment d'une latence accrue pour chaque requête individuelle. Cela peut avoir un impact sur l'expérience client. Cependant, les performances d'inférence du FP8 par rapport au BF16 changent considérablement cet équilibre en notre faveur.
Comme le montre le graphique ci-dessous, pour la plupart des tailles de lots, le format FP8 peut traiter deux fois plus de données pour le même niveau de latence que le format BF16. Si nous définissons un budget de latence spécifique qui correspond à l'expérience optimale pour nos utilisateurs, nous pouvons le constater dans la pratique. En effet, FP8 a effectivement doublé la capacité effective de nos LLM en termes de débit.

En d'autres termes, le passage de BF16 à FP8 ne nous a pas seulement permis de développer des LLM plus puissants et sophistiqués pour DeepL. Cela nous permet également de garantir que nous sommes en mesure d'appliquer efficacement ces LLM, afin d'offrir une expérience client optimale et d'étendre l'impact de notre IA linguistique dans le monde réel. Nous entraînons plus rapidement des modèles plus volumineux, qui peuvent alors fonctionner avec les mêmes paramètres de latence, tout en traitant deux fois plus de requêtes.
Et ensuite ? Nous avons récemment déployé le nouveau NVIDIA DGX SuperPOD avec les systèmes NVIDIA DGX GB200, qui offre une nouvelle augmentation quasi exponentielle de la puissance de calcul. Ce qui est particulièrement intéressant pour nous, c'est que cette machine introduira une nouvelle génération de Tensor Cores capables de prendre en charge de manière native les opérations tensorielles FP4 telles que les multiplications matricielles. C'est alors que notre voyage recommence. Il est passionnant de constater ce que nous pouvons accomplir avec un seul octet lorsqu'il s'agit d'entraîner et d'inférence. Veuillez consulter cette section pour découvrir les possibilités offertes par un demi-octet.
À propos des auteurs
Markus Schnös, Ingénieur de recherche HPC
Markus Schnös est ingénieur de recherche HPC chez DeepL, où il se concentre sur la mise à l'échelle de l'entraînement et de l'inférence des LLM. Il s'intéresse particulièrement à l'entraînement distribué et au calcul en virgule flottante à faible précision.
www.linkedin.com/in/markus-schnoes-349300185
Monsieur Fabian Joswig, Ingénieur de recherche HPC
Monsieur Fabian Joswig est ingénieur de recherche chez DeepL. Il possède une formation en apprentissage automatique, en calcul haute performance et en physique théorique des particules. Il se concentre sur la mise à l'échelle des modèles d'IA et de l'infrastructure pour le traducteur le plus précis au monde.