Simple Science

La science de pointe expliquée simplement

# Informatique# Apprentissage automatique# Calcul et langage

Améliorer l'efficacité de l'entraînement de BERT

Apprends des méthodes pour améliorer la vitesse et l'efficacité de l'entraînement de BERT en utilisant des GPU.

― 6 min lire


Entraînement de BERTEntraînement de BERTaccéléréde BERT sur plusieurs GPU.Méthodes pour accélérer l'entraînement
Table des matières

Former entraîner des modèles de langage comme BERT avec de grandes quantités de données, c'est pas simple. Il est important d'accélérer cet entraînement pour tirer parti des ordinateurs puissants avec plusieurs GPU. Cet article examine comment on peut améliorer l'entraînement de BERT en le rendant plus efficace et plus rapide.

Le Défi de l'Entraînement à Grande Échelle

Quand on entraîne avec plein de GPU, il faut que tout fonctionne bien ensemble. Ça comprend la façon dont les données sont réparties entre les GPU, comment les GPU communiquent entre eux et comment on met à jour le modèle pendant l'entraînement. Chaque GPU bosse sur sa propre copie du modèle BERT. Ils doivent tous partager rapidement les mises à jour des paramètres du modèle pour que tout soit synchronisé.

Un gros défi avec les modèles de langage, c'est que les données viennent souvent en longueurs différentes. Par exemple, certaines phrases sont courtes, tandis que d'autres sont très longues. Si tous les GPU reçoivent la même quantité de données sans tenir compte de cette différence, certains GPU finiront leurs calculs beaucoup plus vite que d'autres. Ce déséquilibre ralentit l'ensemble du processus d'entraînement.

Équilibrage de Charge dans l'Entraînement

Pour battre ce problème, il faut équilibrer la charge sur chaque GPU. Si chaque GPU doit traiter une quantité similaire de données, ils finiront tous leurs tâches à peu près en même temps. Comme ça, ils peuvent partager les résultats plus efficacement. Une manière d'équilibrer la charge, c'est de trier les phrases par longueur avant de les assigner à chaque GPU.

La méthode simple de trier toutes les données puis de les distribuer peut prendre beaucoup de temps et d'efforts, car ça nécessite que tous les GPU communiquent entre eux. Au lieu de ça, on peut trier les données localement dans chaque GPU. En regroupant les phrases selon leurs longueurs, on peut créer des batches plus équilibrés sans demander trop de communication.

Améliorer la Communication Entre les GPU

Quand les GPU bossent ensemble, ils doivent échanger des infos. Cet échange peut être un goulot d'étranglement, surtout si la communication se superpose au calcul. Quand un GPU est occupé à traiter des données, il est moins capable d'envoyer et de recevoir des mises à jour des autres. Si on peut mieux superposer ces tâches, on peut augmenter la vitesse globale du processus d'entraînement.

On peut réaliser ça en découpant les mises à jour en morceaux plus petits, qu'on appelle des "buckets". Chaque GPU peut traiter un bucket pendant qu'un autre bucket est envoyé aux autres GPU. En organisant ce processus correctement, on peut gagner du temps et garder les GPU efficaces.

Utiliser des Optimisateurs Efficaces

Le choix de l'optimiseur impacte aussi la vitesse d'entraînement. Un optimiseur est un algorithme qui ajuste les poids du modèle basé sur la perte qu'il encaisse pendant l'entraînement. Pour BERT, on peut utiliser l'optimiseur ADAM, qui a montré qu'il fonctionne bien avec de gros batches de données. Ça aide à accélérer l'entraînement, surtout quand on utilise une taille de batch plus grande que d'habitude.

En réglant soigneusement les paramètres de l'optimiseur, on peut encore améliorer l'efficacité de l'entraînement. Ça implique d'expérimenter avec différents hyperparamètres pour trouver les meilleurs réglages pour l'entraînement à grande échelle.

Notre Approche pour Entraîner BERT

Dans notre travail, on propose deux idées principales pour améliorer l'entraînement de BERT :

  1. Tri Local pour Équilibrage de Charge : En triant les données selon les longueurs des phrases dans chaque GPU, on peut créer des batches plus équilibrés. Cette méthode réduit le besoin de communication entre les GPU tout en s'assurant que chacun a une juste part de travail.

  2. Clipping de Gradient par Bucket : Au lieu d'attendre que tous les calculs soient finis avant d'envoyer les mises à jour, on clippe les gradients dans des buckets plus petits. Ça nous permet de mieux gérer les grosses mises à jour et d'améliorer la superposition entre le calcul et la communication.

Résultats de Nos Méthodes

Après avoir mis en œuvre ces méthodes, on a pu entraîner BERT sur 1 024 GPU NVIDIA A100 en un temps record. Cette performance est nettement plus rapide que les tentatives précédentes avec des configurations similaires. Les améliorations dans l'équilibrage de charge et la communication ont aidé à minimiser le temps perdu pendant l'entraînement.

L'Impact de la Longueur des Séquences sur l'Entraînement

La nature des données linguistiques présente un autre défi. Les phrases varient beaucoup en longueur, ce qui peut mener à des inefficacités. Pour l'entraînement de BERT, on fixe souvent une longueur de séquence maximum, et les phrases plus courtes sont complétées avec du padding pour correspondre à cette longueur. Du coup, une grande partie des calculs est perdue à traiter ces tokens de padding au lieu de données significatives.

Pour contrer ça, nos méthodes de tri local nous permettent de regrouper les phrases par longueur, ce qui minimise l'utilisation du padding. Comme ça, on peut concentrer les ressources computationnelles sur les données réelles qu'on veut traiter.

Entraînement avec de Gros Batches

Utiliser de gros batches peut mener à une meilleure utilisation des GPU, mais ça peut aussi causer des problèmes avec la convergence pendant l'entraînement. Quand on utilise des batches plus grands, le taux d'apprentissage doit être ajusté correctement pour maintenir la qualité de l'entraînement. On a adopté des techniques qui aident à garder les taux d'apprentissage proportionnels aux tailles de batch, ce qui nous permet de tirer efficacement parti des avantages d'entraînement avec de gros batches.

Amélioration Continue des Techniques d'Entraînement

L'optimisation est un processus continu. Avec chaque nouvelle technique qu'on met en place, on collecte des données sur son efficacité. On évalue en continu nos méthodes pour s'assurer qu'on maintient les temps d'entraînement les plus rapides tout en atteignant une haute précision dans les résultats.

En conclusion, l'entraînement de BERT peut être grandement amélioré grâce à des méthodes comme le tri local pour l'équilibrage de charge et le clipping de gradient par bucket pour une communication efficace. Ces stratégies aident à réduire le temps perdu pendant les sessions d'entraînement, nous permettant d'utiliser plus efficacement les ressources puissantes des GPU.

Alors qu'on continue à affiner notre approche et à récolter plus de données venant de diverses sessions d'entraînement, on espère repousser encore plus les limites de ce qui est possible dans l'entraînement des modèles de langage.

Source originale

Titre: Breaking MLPerf Training: A Case Study on Optimizing BERT

Résumé: Speeding up the large-scale distributed training is challenging in that it requires improving various components of training including load balancing, communication, optimizers, etc. We present novel approaches for fast large-scale training of BERT model which individually ameliorates each component thereby leading to a new level of BERT training performance. Load balancing is imperative in distributed BERT training since its training datasets are characterized by samples with various lengths. Communication cost, which is proportional to the scale of distributed training, needs to be hidden by useful computation. In addition, the optimizers, e.g., ADAM, LAMB, etc., need to be carefully re-evaluated in the context of large-scale distributed training. We propose two new ideas, (1) local presorting based on dataset stratification for load balancing and (2) bucket-wise gradient clipping before allreduce which allows us to benefit from the overlap of gradient computation and synchronization as well as the fast training of gradient clipping before allreduce. We also re-evaluate existing optimizers via hyperparameter optimization and utilize ADAM, which also contributes to fast training via larger batches than existing methods. Our proposed methods, all combined, give the fastest MLPerf BERT training of 25.1 (22.3) seconds on 1,024 NVIDIA A100 GPUs, which is 1.33x (1.13x) and 1.57x faster than the other top two (one) submissions to MLPerf v1.1 (v2.0). Our implementation and evaluation results are available at MLPerf v1.1~v2.1.

Auteurs: Yongdeok Kim, Jaehyung Ahn, Myeongwoo Kim, Changin Choi, Heejae Kim, Narankhuu Tuvshinjargal, Seungwon Lee, Yanzi Zhang, Yuan Pei, Xiongzhan Linghu, Jingkun Ma, Lin Chen, Yuehua Dai, Sungjoo Yoo

Dernière mise à jour: 2024-02-04 00:00:00

Langue: English

Source URL: https://arxiv.org/abs/2402.02447

Source PDF: https://arxiv.org/pdf/2402.02447

Licence: https://creativecommons.org/licenses/by-nc-sa/4.0/

Changements: Ce résumé a été créé avec l'aide de l'IA et peut contenir des inexactitudes. Pour obtenir des informations précises, veuillez vous référer aux documents sources originaux dont les liens figurent ici.

Merci à arxiv pour l'utilisation de son interopérabilité en libre accès.

Articles similaires