Maison  >  Article  >  Périphériques technologiques  >  Une ligne de code, pour fabriquer des élixirs deux fois plus vite ! PyTorch 2.0 sort avec surprise, LeCun le transmet avec enthousiasme

Une ligne de code, pour fabriquer des élixirs deux fois plus vite ! PyTorch 2.0 sort avec surprise, LeCun le transmet avec enthousiasme

王林
王林avant
2023-04-13 08:49:021447parcourir

Le 2 décembre, PyTorch 2.0 est officiellement sorti !

Cette mise à jour pousse non seulement les performances de PyTorch vers de nouveaux sommets, mais ajoute également la prise en charge des formes et de la distribution dynamiques.

De plus, la série 2.0 déplacera également du code PyTorch du C++ vers Python.

Une ligne de code, pour fabriquer des élixirs deux fois plus vite ! PyTorch 2.0 sort avec surprise, LeCun le transmet avec enthousiasme

Actuellement, PyTorch 2.0 est encore en phase de test et la première version stable devrait être disponible début mars 2023.

Une ligne de code, pour fabriquer des élixirs deux fois plus vite ! PyTorch 2.0 sort avec surprise, LeCun le transmet avec enthousiasme

PyTorch 2.x : Plus rapide, plus Pythonique !

Au cours des dernières années, PyTorch a innové et itéré de la version 1.0 à la récente 1.13, et a rejoint la nouvelle Fondation PyTorch pour faire partie de la Fondation Linux.

Le défi avec la version actuelle de PyTorch est que le mode impatient a du mal à suivre la bande passante GPU toujours croissante et les architectures de modèles plus folles.

La naissance de PyTorch 2.0 changera et améliorera fondamentalement la façon dont PyTorch s'exécute au niveau du compilateur.

Une ligne de code, pour fabriquer des élixirs deux fois plus vite ! PyTorch 2.0 sort avec surprise, LeCun le transmet avec enthousiasme

Comme nous le savons tous, (Py) dans PyTorch vient du langage de programmation open source Python largement utilisé en science des données.

Cependant, le code de PyTorch n’utilise pas entièrement Python, mais en donne une partie au C++.

Cependant, dans la future série 2.x, l'équipe du projet PyTorch prévoit de déplacer le code lié à torch.nn vers Python.

Au-delà de cela, puisque PyTorch 2.0 est une fonctionnalité entièrement complémentaire (et facultative), la 2.0 est 100 % rétrocompatible.

En d'autres termes, la base de code est la même, l'API est la même et la manière d'écrire des modèles est la même.

Plus de support technique

  • TorchDynamo

Utiliser des hooks d'évaluation du framework Python pour capturer en toute sécurité les programmes PyTorch, il s'agit d'une innovation majeure développée par l'équipe en matière de capture de graphiques au cours des 5 dernières années.

  • AOTAutograd

surcharge le moteur autograd de PyTorch en tant que trace automatique pour générer une trace arrière anticipée.

  • PrimTorch

résume environ 2000+ opérateurs PyTorch en un ensemble fermé d'environ 250 opérateurs primitifs sur lesquels les développeurs peuvent créer un backend PyTorch complet. La barrière à l’écriture des fonctionnalités ou des backends de PyTorch est considérablement réduite.

  • TorchInductor

Un compilateur d'apprentissage en profondeur qui peut générer du code rapide pour plusieurs accélérateurs et backends. Pour les GPU de Nvidia, il utilise OpenAI Triton comme élément de base clé.

Il convient de noter que TorchDynamo, AOTAutograd, PrimTorch et TorchInductor sont tous écrits en Python et prennent en charge les formes dynamiques.

Vitesse de formation plus rapide

En introduisant un nouveau mode de compilation "torch.compile", PyTorch 2.0 peut accélérer la formation du modèle avec une seule ligne de code.

Aucune astuce requise ici, exécutez simplement torch.compile() et c'est tout :

opt_module = torch.compile(module)

Afin de vérifier ces technologies, l'équipe a soigneusement créé des tests de référence, comprenant des tâches telles que la classification d'images, la détection d'objets et la génération d'images, ainsi que diverses tâches PNL telles que la modélisation du langage, la réponse aux questions, la classification de séquences, les systèmes de recommandation. , et l'apprentissage par renforcement. Parmi eux, ces benchmarks peuvent être divisés en trois catégories :

  • 46 modèles de HuggingFace Transformers
  • 61 modèles de TIMM : la collection de modèles d'images PyTorch de pointe de Ross Wightman
  • 56 modèles de TorchBench : github Les résultats de tests d'un ensemble de bibliothèques de codes populaires

montrent que sur ces 163 modèles open source couvrant la vision, la PNL et d'autres domaines, la vitesse de formation a été améliorée de 38 à 76 %.

Une ligne de code, pour fabriquer des élixirs deux fois plus vite ! PyTorch 2.0 sort avec surprise, LeCun le transmet avec enthousiasme

Comparaison sur le GPU NVIDIA A100

De plus, l'équipe a également effectué des tests de référence sur certains modèles PyTorch open source populaires et a obtenu des accélérations substantielles de 30 % à 2x.

Le développeur Sylvain Gugger a déclaré : « Avec une seule ligne de code, PyTorch 2.0 peut atteindre une accélération de 1,5x à 2,0x lors de l'entraînement des modèles Transformers. C'est la chose la plus excitante depuis l'avènement de l'entraînement de précision mixte. Aperçu technique

Le compilateur de PyTorch peut être divisé en trois parties :

Acquisition de graphiques
  • Réduction de graphiques
  • Compilation de graphiques
Parmi elles, lors de la construction du compilateur PyTorch, l'acquisition de graphiques est un défi plus difficile .

Une ligne de code, pour fabriquer des élixirs deux fois plus vite ! PyTorch 2.0 sort avec surprise, LeCun le transmet avec enthousiasme

TorchDynamo

L'équipe a commencé à travailler sur TorchDynamo au début de cette année, en utilisant une fonctionnalité CPython introduite dans PEP-0523 appelée API d'évaluation du framework.

À cette fin, l'équipe a adopté une approche basée sur les données pour vérifier l'efficacité de TorchDynamo sur la capture de graphiques - en utilisant plus de 7 000 projets Github écrits dans PyTorch comme ensemble de validation.

Les résultats montrent que TorchDynamo peut effectuer une capture graphique correctement et en toute sécurité 99 % du temps, avec une surcharge négligeable.

TorchInductor

Pour le nouveau backend du compilateur de PyTorch 2.0, l'équipe s'est inspirée de la façon dont les utilisateurs écrivent des noyaux personnalisés hautes performances : en utilisant de plus en plus le langage Triton.

TorchInductor utilise le niveau IR boucle par boucle défini par Pythonic pour mapper automatiquement les modèles PyTorch au code Triton généré sur le GPU et C++/OpenMP sur le CPU. L'IR au niveau de la boucle principale de

TorchInductor ne contient qu'environ 50 opérateurs et il est implémenté en Python, ce qui facilite son extension.

AOTAutograd

Si vous souhaitez accélérer la formation, vous devez capturer non seulement le code au niveau de l'utilisateur, mais également la rétropropagation.

AOTAutograd peut utiliser le mécanisme d'extension torch_dispatch de PyTorch pour suivre le moteur Autograd, capturer la rétropropagation "à l'avance", puis utiliser TorchInductor pour accélérer les canaux avant et arrière.

PrimTorch

PyTorch compte plus de 1200 opérateurs, plus de 2000 si l'on prend en compte les différentes surcharges de chaque opérateur. Par conséquent, l’écriture de fonctionnalités back-end ou inter-domaines devient une tâche consommatrice d’énergie.

Dans le projet PrimTorch, l'équipe a défini deux ensembles d'opérateurs plus petits et plus stables :

  • Prim ops compte environ 250 opérateurs, adaptés aux compilateurs. Étant assez bas niveau, il suffit de les fusionner pour obtenir de bonnes performances.
  • ATen ops compte environ 750 opérateurs typiques adaptés à la sortie telle quelle. Ceux-ci conviennent aux backends déjà intégrés au niveau ATen, ou non compilés, rétablissant ainsi les performances des ensembles d'opérateurs de bas niveau comme Prim ops.

Une ligne de code, pour fabriquer des élixirs deux fois plus vite ! PyTorch 2.0 sort avec surprise, LeCun le transmet avec enthousiasme

Formes dynamiques

Lorsque nous avons examiné ce qui était nécessaire pour prendre en charge la généralité dans le code PyTorch, une exigence clé était de prendre en charge les formes dynamiques et de permettre au modèle d'accepter des tenseurs de différentes tailles sans changer la forme à chaque fois. provoquer une recompilation.

Lorsque les formes dynamiques ne sont pas prises en charge, une solution de contournement courante consiste à les compléter à la puissance 2 la plus proche. Cependant, comme le montre le graphique ci-dessous, cela entraîne une surcharge de performances importante et entraîne également des temps de compilation beaucoup plus longs.

Maintenant, avec la prise en charge des formes dynamiques, PyTorch 2.0 a atteint des performances jusqu'à 40 % supérieures à celles d'Eager.

Une ligne de code, pour fabriquer des élixirs deux fois plus vite ! PyTorch 2.0 sort avec surprise, LeCun le transmet avec enthousiasme

Enfin, dans la feuille de route de PyTorch 2.x, l'équipe espère faire avancer davantage le modèle de compilation en termes de performances et d'évolutivité.

Une ligne de code, pour fabriquer des élixirs deux fois plus vite ! PyTorch 2.0 sort avec surprise, LeCun le transmet avec enthousiasme

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer