Nous sommes ravis d’annoncer la sortie de PyTorch® 2.0 que nous avons souligné lors de la Conférence PyTorch le 02/12/22 ! PyTorch 2.0 offre le même développement en mode avide et la même expérience utilisateur, tout en modifiant et en optimisant fondamentalement le fonctionnement de PyTorch au niveau du compilateur sous le capot avec des performances plus rapides et une prise en charge des formes dynamiques et distribuées.
Cette version de nouvelle génération comprend une version stable de Accelerated Transformers (anciennement appelée Better Transformers) ; La version bêta inclut torch.compile comme API principale pour PyTorch 2.0, la fonction scaled_dot_product_attention dans le cadre de torch.nn.functional, le backend MPS, les API functorch dans le module torch.func ; et d’autres améliorations bêta/prototypes à travers diverses fonctions d’inférence, d’optimisation des performances et de la formation sur les GPU et les CPU. Pour une introduction complète et un aperçu technique de torch.compile, veuillez visiter la version 2.0 Page de démarrage.
Parallèlement à la version 2.0, nous publions également une série de mises à jour bêta des bibliothèques de domaine PyTorch, y compris celles qui sont dans l’arborescence, et des bibliothèques distinctes, notamment TorchAudio, TorchVision et TorchText. Une mise à jour pour TorchX est également publiée à mesure qu’elle passe en mode pris en charge par la communauté. Plus de détails peuvent être trouvés dans ce blog de la bibliothèque.
Cette version est composée de plus de 4 541 commits et 428 contributeurs depuis la 1.13.1. Nous tenons à remercier sincèrement notre communauté dévouée pour vos contributions. Comme toujours, nous vous encourageons à les essayer et à signaler tout problème à mesure que nous améliorons la version 2.0 et l’ensemble de la série 2 cette année.
Résumé:
- torch.compile est l’API principale de PyTorch 2.0, qui encapsule votre modèle et renvoie un modèle compilé. Il s’agit d’une fonctionnalité entièrement additive (et facultative) et, par conséquent, 2.0 est 100 % rétrocompatible par définition.
- En tant que technologie sous-jacente de torch.compile, TorchInductor avec les GPU Nvidia et AMD s’appuiera sur le compilateur d’apprentissage en profondeur OpenAI Triton pour générer un code performant et masquer les détails matériels de bas niveau. Les noyaux générés par OpenAI Triton atteignent des performances comparables à celles des noyaux écrits à la main et des bibliothèques cuda spécialisées telles que cublas.
- Les transformateurs accélérés introduisent une prise en charge hautes performances pour la formation et l’inférence à l’aide d’une architecture de noyau personnalisée pour l’attention au produit scalaire (SPDA). L’API est intégrée à torch.compile() et les développeurs de modèles peuvent également utiliser le attention au produit scalaire mis à l’échelle noyaux directement en appelant le nouvel opérateur scaled_dot_product_attention().
- Le backend Metal Performance Shaders (MPS) fournit une formation PyTorch accélérée par GPU sur les plates-formes Mac avec une prise en charge supplémentaire des 60 opérations les plus utilisées, ce qui porte la couverture à plus de 300 opérateurs.
- Amazon AWS optimise l’inférence CPU PyTorch sur la base d’AWS Graviton3 Instances C7g. PyTorch 2.0 améliore les performances d’inférence sur Graviton par rapport aux versions précédentes, y compris des améliorations pour Resnet50 et Bert.
- Nouvelles fonctionnalités et technologies de prototype sur TensorParallel, DTensor, 2D parallèle, TorchDynamo, AOTAutograd, PrimTorch et TorchInductor.
*Pour voir une liste complète des soumissions de fonctionnalités publiques 2.0, 1.13 et 1.12, cliquez sur ici.
CARACTÉRISTIQUES STABLES
[Stable] Transformateurs PyTorch 2 accélérés
La version PyTorch 2.0 inclut une nouvelle implémentation hautes performances de l’API PyTorch Transformer. En lançant des transformateurs PT2 accélérés, notre objectif est de rendre la formation et le déploiement de modèles de transformateurs de pointe abordables dans l’ensemble de l’industrie. Cette version introduit une prise en charge hautes performances pour la formation et l’inférence à l’aide d’une architecture de noyau personnalisée pour l’attention au produit scalaire (SPDA), étendant l’architecture d’inférence « fastpath », anciennement connue sous le nom de « Better Transformer ».
Semblable à l’architecture « fastpath », les noyaux personnalisés sont entièrement intégrés dans l’API PyTorch Transformer – ainsi, l’utilisation de l’API native Transformer et MultiHeadAttention permettra aux utilisateurs de :
- voir de manière transparente des améliorations significatives de la vitesse ;
- prendre en charge de nombreux autres cas d’utilisation, y compris des modèles utilisant Cross-Attention, des décodeurs de transformateur et des modèles de formation ; et
- continuer à utiliser l’inférence de chemin rapide pour les cas d’utilisation de l’encodeur de transformateur et de l’auto-attention à longueur de séquence fixe et variable.
Pour tirer pleinement parti des différents modèles matériels et cas d’utilisation de Transformer, plusieurs noyaux personnalisés SDPA sont pris en charge (voir ci-dessous), avec une logique de sélection de noyau personnalisée qui choisira le noyau le plus performant pour un modèle et un type de matériel donnés. En plus de l’API Transformer existante, les développeurs de modèles peuvent également utiliser le attention au produit scalaire mis à l’échelle noyaux directement en appelant le nouvel opérateur scaled_dot_product_attention(). Les transformateurs PyTorch 2 accélérés sont intégrés à torch.compile() . Pour utiliser votre modèle tout en bénéficiant de l’accélération supplémentaire de la compilation PT2 (pour l’inférence ou la formation), pré-traitez le modèle avec model = torch.compile(model)
.
Nous avons réalisé des accélérations majeures pour la formation de modèles de transformateurs et en particulier de grands modèles de langage avec Accelerated PyTorch 2 Transformers en utilisant une combinaison de noyaux personnalisés et de torch.compile().
Figure : L’utilisation de l’attention du produit scalaire à l’échelle avec des noyaux personnalisés et torch.compile offre des accélérations significatives pour la formation de modèles de langage volumineux, tels que pour nanoGPT montré ici.
FONCTIONNALITÉS BÊTA
[Beta] torche.compile
torch.compile est l’API principale de PyTorch 2.0, qui encapsule votre modèle et renvoie un modèle compilé. Il s’agit d’une fonctionnalité entièrement additive (et facultative) et, par conséquent, 2.0 est 100 % rétrocompatible par définition.
Torch.compile repose sur de nouvelles technologies – TorchDynamo, AOTAutograd, PrimTorch et TorchInductor :
- TorchDynamo capture les programmes PyTorch en toute sécurité à l’aide de Python Frame Evaluation Hooks et est une innovation importante qui est le résultat de 5 ans de notre R&D dans la capture sécurisée de graphes.
- AOTAutograd surcharge le moteur autograd de PyTorch en tant qu’autodiff de traçage pour générer des traces en arrière à l’avance.
- PrimTorch canonise ~2000+ opérateurs PyTorch en un ensemble fermé de ~250 opérateurs primitifs que les développeurs peuvent cibler pour créer un backend PyTorch complet. Cela réduit considérablement la barrière de l’écriture d’une fonctionnalité ou d’un backend PyTorch.
- TorchInductor est un compilateur d’apprentissage en profondeur qui génère du code rapide pour plusieurs accélérateurs et backends. Pour les GPU NVIDIA et AMD, il utilise OpenAI Triton comme élément de construction clé. Pour les processeurs Intel, nous générons du code C++ en utilisant des instructions multithreading vectorisées et en déchargeant les opérations appropriées vers mkldnn lorsque cela est possible.
Avec toutes les nouvelles technologies, torch.compile est capable de travailler 93 % du temps sur 165 modèles open source et s’exécute 20 % plus rapidement en moyenne avec une précision float32 et 36 % plus rapide en moyenne avec une précision AMP.
Pour plus d’informations, veuillez consulter https://pytorch.org/get-started/pytorch-2.0/ et pour TorchInductor CPU avec Intel ici.
[Beta] Backend MPS PyTorch
Le backend MPS fournit une formation PyTorch accélérée par GPU sur les plates-formes Mac. Cette version améliore l’exactitude, la stabilité et la couverture de l’opérateur.
Le backend MPS inclut désormais la prise en charge des 60 opérations les plus utilisées, ainsi que les opérations les plus fréquemment demandées par la communauté, ce qui porte la couverture à plus de 300 opérateurs. L’objectif principal de la version était de permettre des tests complets en mode avant et gradient basés sur OpInfo pour résoudre les problèmes d’exactitude silencieuse. Ces changements ont entraîné une adoption plus large du backend MPS par des réseaux tiers tels que Stable Diffusion, YoloV5, WhisperAI, ainsi qu’une couverture accrue pour les réseaux Torchbench et les didacticiels de base. Nous encourageons les développeurs à mettre à jour vers la dernière version de macOS pour bénéficier des meilleures performances et stabilité sur le backend MPS.
Liens
- Back-end MPS
- Informations sur le développeur
- Formation accélérée PyTorch sur Mac
- Métal, Shaders de performance en métal & Graphique des shaders de performances métalliques
[Beta] Attention aux produits scalaires 2.0
Nous sommes ravis d’annoncer la sortie de PyTorch 2.0, qui introduit une puissante fonction d’attention aux produits scalaires dans le cadre de torch.nn.functional. Cette fonction comprend plusieurs implémentations qui peuvent être appliquées de manière transparente en fonction de l’entrée et du matériel utilisé.
Dans les versions précédentes de PyTorch, vous deviez vous fier à des implémentations tierces et installer des packages séparés pour tirer parti d’algorithmes optimisés en mémoire tels que FlashAttention. Avec PyTorch 2.0, toutes ces implémentations sont facilement disponibles par défaut.
Ces implémentations comprennent FlashAttention de HazyResearch, Memory-Efficient Attention from the xFormers projet et une implémentation C++ native idéale pour les appareils non CUDA ou lorsqu’une haute précision est requise.
PyTorch 2.0 sélectionnera automatiquement l’implémentation optimale pour votre cas d’utilisation, mais vous pouvez également les basculer individuellement pour un contrôle plus précis. De plus, la fonction d’attention au produit scalaire mis à l’échelle peut être utilisée pour créer des composants d’architecture de transformateur communs.
En savoir plus avec le Documentation et ça Didacticiel.
[Beta] functorch -> torche.func
Inspiré par GoogleJAX, functorch est une bibliothèque qui propose des transformations composables vmap (vectorisation) et autodiff. Il permet des cas d’utilisation avancés d’autodiff qui seraient autrement difficiles à exprimer dans PyTorch. Les exemples comprennent:
Nous sommes ravis d’annoncer qu’en tant qu’étape finale de l’amont et de l’intégration de functorch dans PyTorch, les API functorch sont désormais disponibles dans le module torch.func. Nos API de transformation de fonction sont identiques à celles d’avant, mais nous avons modifié le fonctionnement de l’interaction avec les modules NN. Veuillez consulter le documents et le guide de migration pour plus de détails.
De plus, nous avons ajout de la prise en charge de torch.autograd.Function: on est maintenant capable d’appliquer des transformations de fonction (par exemple vmap, grad, jvp) sur torch.autograd.Function.
[Beta] Collectifs Dispatchables
Les collectifs distribuables sont une amélioration de l’API init_process_group() existante qui change le backend en un argument facultatif. Pour les utilisateurs, le principal avantage de cette fonctionnalité est qu’elle leur permettra d’écrire du code pouvant s’exécuter à la fois sur les machines GPU et CPU sans avoir à modifier les spécifications du backend. La fonctionnalité de dispatchabilité permettra également aux utilisateurs de prendre en charge plus facilement les collectifs GPU et CPU, car ils n’auront plus besoin de spécifier manuellement le backend (par exemple, « NCCL » ou « GLOO »). Les spécifications de backend existantes par les utilisateurs seront honorées et ne nécessiteront pas de modification.
Exemple d’utilisation :
import torch.distributed.dist
…
# old
dist.init_process_group(backend=”nccl”, ...)
dist.all_reduce(...) # with CUDA tensors works
dist.all_reduce(...) # with CPU tensors does not work
# new
dist.init_process_group(...) # backend is optional
dist.all_reduce(...) # with CUDA tensors works
dist.all_reduce(...) # with CPU tensors works
Apprendre encore plus ici.
[Beta] torch.set_default_device et torch.device comme gestionnaire de contexte
torch.set_default_device permet aux utilisateurs de modifier le périphérique par défaut sur lequel les fonctions d’usine de PyTorch sont allouées. Par exemple, si vous torch.set_default_device(‘cuda’), un appel à torch.empty(2) sera alloué sur CUDA (plutôt que sur CPU). Vous pouvez également utiliser torch.device comme gestionnaire de contexte pour modifier le périphérique par défaut localement. Cela résout une demande de fonctionnalité de longue date de la version initiale de PyTorch pour un moyen de le faire.
Apprendre encore plus ici.