Comment améliorer la vitesse de « l'alchimie » dans PyTorch ?
Récemment, Sebastian Raschka, chercheur bien connu en apprentissage automatique et en IA, nous a montré son astuce. Selon lui, sa méthode a réduit le temps d'optimisation du BERT de 22,63 minutes à 3,15 minutes en modifiant seulement quelques lignes de code sans affecter la précision du modèle, et la vitesse d'entraînement a été multipliée par 7.
L'auteur a même déclaré que si vous disposez de 8 GPU, l'ensemble du processus de formation ne prend que 2 minutes, ce qui permet d'obtenir une accélération des performances 11,5 fois supérieure.
Voyons comment il y est parvenu.
Tout d'abord, l'auteur utilise le modèle DistilBERT pour la recherche, qui est une version simplifiée de BERT. Par rapport à BERT, l'échelle est réduite de 40 %, mais il y en a. presque aucune perte de performances. Le second est l'ensemble de données. L'ensemble de données de formation est l'IMDB Large Movie Review, un grand ensemble de données de critiques de films, qui contient un total de 50 000 critiques de films. L'auteur utilisera la méthode c dans la figure ci-dessous pour prédire le sentiment des critiques de films dans l'ensemble de données.
Une fois les tâches de base expliquées clairement, voici le processus de formation de PyTorch. Afin de permettre à chacun de mieux comprendre cette tâche, l'auteur présente également en détail un exercice d'échauffement, c'est-à-dire comment entraîner le modèle DistilBERT sur l'ensemble de données de critiques de films IMDB. Si vous souhaitez exécuter le code vous-même, vous pouvez configurer un environnement virtuel à l'aide des bibliothèques Python appropriées, comme indiqué ci-dessous :
Les versions du logiciel concerné sont les suivantes :
Maintenant, évitez les plus ennuyeux. Pour une introduction au chargement de données, il vous suffit de savoir que cet article divise l'ensemble de données en 35 000 exemples de formation, 5 000 exemples de validation et 10 000 exemples de test. Le code requis est le suivant :
Capture d'écran de la partie code
Adresse complète du code : /rapide er-pytorch -blog/blob/main/1_pytorch-distilbert.py
Ensuite, exécutez le code sur le GPU A100 et obtenez les résultats suivants :
Capture d'écran de quelques résultats
Comme mentionné ci-dessus Comme le montre le code, le modèle est un peu surajusté du deuxième au troisième tour, et la précision de la vérification passe de 92,89 % à 92,09 %. Après avoir affiné le modèle pendant 22,63 minutes, la précision finale du test était de 91,43 %.
Utilisation de la classe Trainer
La prochaine étape consiste à améliorer le code ci-dessus. La partie amélioration consiste principalement à envelopper le modèle PyTorch dans LightningModule afin que la classe Trainer de Lightning puisse être utilisée. Certaines captures d'écran de code sont les suivantes :
Adresse complète du code : https://github.com/rasbt/faster-pytorch-blog/blob/main/2_pytorch-with-trainer.py
Le code ci-dessus crée un LightningModule, qui définit comment effectuer la formation, la validation et les tests. Par rapport au code donné précédemment, le principal changement se situe dans la partie 5 (c'est-à-dire ### 5 Finetuning), qui consiste à affiner le modèle. Contrairement à avant, la partie de réglage fin enveloppe le modèle PyTorch dans la classe LightningModel et utilise la classe Trainer pour s'adapter au modèle.
Le code précédent montrait que la précision de validation avait chuté du tour 2 au tour 3, mais le code amélioré utilise ModelCheckpoint pour charger le meilleur modèle. Sur la même machine, le modèle a atteint une précision de test de 92 % en 23,09 minutes.
Notez que si vous désactivez les points de contrôle et autorisez PyTorch à s'exécuter en mode non déterministe, cette exécution finira par obtenir la même durée d'exécution que PyTorch standard (durée 22,63 minutes au lieu de 23,09 minutes).
Entraînement automatique de précision mixte
De plus, si le GPU prend en charge l'entraînement de précision mixte, vous pouvez activer le GPU pour améliorer l'efficacité informatique. Les auteurs utilisent un entraînement automatique à précision mixte, basculant entre 32 bits et 16 bits à virgule flottante sans sacrifier la précision.
Dans le cadre de cette optimisation, en utilisant la classe Trainer, un entraînement automatique de précision mixte peut être réalisé avec une seule ligne de code :
Les opérations ci-dessus peuvent réduire le temps d'entraînement de 23,09 minutes à 8,75 minutes, soit presque 3 fois plus rapide. La précision sur l'ensemble de test est de 92,2 %, ce qui est même légèrement amélioré par rapport aux 92,0 % précédents.
Utilisation de Torch.Compile static graph
L'annonce récente de PyTorch 2.0 montre que l'équipe PyTorch a introduit une nouvelle fonction toch.compile. Cette fonction peut accélérer l'exécution du code PyTorch en générant des graphiques statiques optimisés au lieu d'utiliser des graphiques dynamiques pour exécuter le code PyTorch.
Étant donné que PyTorch 2.0 n'est pas encore officiellement publié, vous devez d'abord installer torchtriton et mettre à jour vers la dernière version de PyTorch pour utiliser cette fonctionnalité.一 Modifiez ensuite le code en ajoutant cette ligne :
Ce qui précède présente la formation de précision mixte du code accéléré sur un seul GPU. Ensuite, nous introduisons la stratégie de formation multi-GPU. La figure ci-dessous résume plusieurs techniques de formation multi-GPU différentes.
Si vous souhaitez obtenir un parallélisme de données distribué, vous pouvez y parvenir via DistributedDataParallel. Il vous suffit de modifier une ligne de code pour utiliser Trainer.
Après cette étape d'optimisation, sur 4 GPU A100, ce code a fonctionné pendant 3,52 minutes et a atteint une précision de test de 93,1%.
DeepSpeed
Enfin, l'auteur explore l'utilisation de la bibliothèque d'optimisation du deep learning DeepSpeed dans Trainer et Results of stratégie multi-GPU. Tout d'abord, vous devez installer la bibliothèque DeepSpeed :
Ensuite, il vous suffit de modifier une seule ligne de code pour activer la bibliothèque :
Après cette vague, il a fallu 3,15 minutes pour atteindre 92,6 % de précision du test. Cependant, PyTorch propose également une alternative à DeepSpeed : DataParallel entièrement fragmenté, appelé avec stratégie="fsdp", qui a finalement pris 3,62 minutes.
Ce qui précède est la méthode de l'auteur pour améliorer la vitesse de formation du modèle PyTorch. Les amis intéressés peuvent suivre le blog original et l'essayer, je pense que vous obtiendrez les résultats souhaités.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!