Introduction à PyTorch

PyTorch est une bibliothèque d'apprentissage automatique Python open source basée sur la bibliothèque Torch, implémentée au niveau bas en C++, et appliquée dans des domaines de l'intelligence artificielle tels que la vision par ordinateur et le traitement du langage naturel.

PyTorch a été initialement développé par l'équipe de recherche en IA de Meta Platforms et fait maintenant partie de la Linux Foundation.

De nombreux progiciels d'apprentissage profond sont construits sur PyTorch, notamment Tesla Autopilot, Pyro d'Uber, Transformers de Hugging Face, PyTorch Lightning et Catalyst.

PyTorch présente deux caractéristiques principales :

  • Calcul tensoriel similaire à NumPy, qui peut être accéléré sur des accélérateurs matériels tels que GPU ou MPS.
  • Réseaux neuronaux profonds basés sur un système de différenciation automatique.

PyTorch inclut des sous-modules tels que torch.autograd, torch.nn et torch.optim.

PyTorch inclut une variété de fonctions de perte, notamment MSE (erreur quadratique moyenne = norme L2), la perte d'entropie croisée et la perte de log-vraisemblance négative (utile pour les classifieurs), entre autres.

Caractéristiques de PyTorch

  • Graphes de calcul dynamiques: Les graphes de calcul de PyTorch sont dynamiques, ce qui signifie qu'ils sont construits à l'exécution et peuvent être modifiés à tout moment. Cela offre une grande flexibilité pour l'expérimentation et le débogage, car les développeurs peuvent exécuter le code ligne par ligne et inspecter les résultats intermédiaires.

  • Différenciation automatique: Le système de différenciation automatique de PyTorch permet aux développeurs de calculer facilement les gradients, ce qui est crucial pour l'entraînement des modèles d'apprentissage profond. Il calcule automatiquement les gradients de la fonction de perte par rapport aux paramètres du modèle grâce à l'algorithme de rétropropagation.

  • Calcul tensoriel: PyTorch fournit des opérations tensorielles similaires à NumPy, qui peuvent être exécutées sur CPU et GPU, accélérant ainsi le processus de calcul. Les tenseurs sont la structure de données de base dans PyTorch, utilisée pour stocker et manipuler des données.

  • API riche: PyTorch fournit un grand nombre de couches prédéfinies, de fonctions de perte et d'algorithmes d'optimisation, qui sont tous des composants courants pour construire des modèles d'apprentissage profond.

  • Prise en charge de plusieurs langages: Bien que PyTorch utilise Python comme interface principale, il fournit également une interface C++, permettant une intégration et un contrôle de plus bas niveau.

Graphe de calcul dynamique

L'une des caractéristiques les plus notables de PyTorch est son mécanisme de graphe de calcul dynamique.

Contrairement au graphe de calcul statique de TensorFlow, PyTorch construit le graphe de calcul pendant l'exécution, ce qui signifie qu'à chaque calcul, le graphe change automatiquement selon la forme des données d'entrée.

Avantages du graphe de calcul dynamique :

  • Plus flexible, particulièrement adapté aux scénarios nécessitant des jugements conditionnels ou de la récursion.
  • Pratique pour le débogage et la modification, permettant d'inspecter directement les résultats intermédiaires.
  • Plus proche du style de programmation Python et facile à prendre en main.

Tenseur et Autograd

La structure de données centrale dans PyTorch est leTensor, qui est une matrice multidimensionnelle capable d'effectuer efficacement des calculs sur CPU ou GPU. Les opérations sur les tenseurs prennent en charge le mécanisme Autograd, permettant un calcul automatique des gradients lors de la rétropropagation, ce qui est crucial pour les algorithmes d'optimisation par descente de gradient en apprentissage profond.

Tensor :

  • Prend en charge le basculement entre CPU et GPU.
  • Fournit une interface de type NumPy et prend en charge les opérations élément par élément.
  • Prend en charge la différenciation automatique, ce qui facilite le calcul des gradients.

Autograd :

  • Le moteur de différenciation automatique intégré de PyTorch peut suivre automatiquement toutes les opérations sur les tenseurs et calculer les gradients lors de la rétropropagation.
  • Viarequires_gradattribut, vous pouvez spécifier qu'un tenseur nécessite le calcul du gradient.
  • Prend en charge une rétropropagation efficace, adaptée à l'entraînement des réseaux de neurones.

Définition et entraînement du modèle

PyTorch fournittorch.nnmodule, permettant aux utilisateurs d'hériternn.Moduleclasse pour définir des modèles de réseaux de neurones. Utilisezforwardfonction permettant de spécifier la propagation avant ; rétropropagation automatique (viaautograd) et le calcul du gradient sont également gérés en interne par PyTorch.

Module de réseau de neurones (torch.nn) :

  • Fournit des couches couramment utilisées (telles que des couches linéaires, des couches convolutives, des couches de pooling, etc.).
  • Prend en charge la définition d'architectures complexes de réseaux de neurones (y compris les réseaux à entrées et sorties multiples).
  • Compatible avec les optimiseurs (tels quetorch.optim) pour les utiliser ensemble.

Accélération GPU

PyTorch prend entièrement en charge l'exécution sur GPU pour accélérer l'entraînement des modèles d'apprentissage profond. Grâce à une simple.to(device)méthode, les utilisateurs peuvent transférer des modèles et des tenseurs vers le GPU pour le calcul. PyTorch prend en charge l'entraînement multi-GPU et peut tirer parti de la technologie NVIDIA CUDA pour améliorer considérablement l'efficacité de calcul.

Prise en charge GPU :

  • Sélectionne automatiquement le GPU ou le CPU.
  • Prend en charge l'accélération via CUDA.
  • Prend en charge le calcul parallèle multi-GPU (DataParalleloutorch.distributed)。

Écosystème et soutien de la communauté

En tant que projet open source, PyTorch dispose d'une grande communauté et d'un vaste écosystème. Il est non seulement largement utilisé dans le milieu universitaire, mais aussi largement déployé dans l'industrie, en particulier dans des domaines tels que la vision par ordinateur et le traitement du langage naturel. PyTorch fournit également de nombreux outils et bibliothèques liés à l'apprentissage profond, tels que :

  • torchvision: jeux de données et modèles pour les tâches de vision par ordinateur.
  • torchtext: jeux de données et outils de prétraitement pour les tâches de traitement du langage naturel.
  • torchaudio: une boîte à outils pour le traitement audio.
  • PyTorch Lightning: une bibliothèque de haut niveau qui simplifie le code PyTorch, en mettant l'accent sur l'itération rapide dans la recherche et l'expérimentation.

Comparaison avec d'autres frameworks

En raison de sa flexibilité, de sa facilité d'utilisation et du soutien de la communauté, PyTorch est devenu le framework préféré de nombreux chercheurs et développeurs en apprentissage profond.

TensorFlow vs PyTorch

  • Le graphe de calcul dynamique de PyTorch le rend plus flexible et adapté à l'expérimentation et à la recherche rapides, tandis que le graphe de calcul statique de TensorFlow laisse plus de place à l'optimisation dans les environnements de production.
  • PyTorch est plus pratique pour le débogage, tandis que TensorFlow est plus mature en matière de déploiement et prend en charge un plus grand nombre de matériels et de plateformes.
  • Ces dernières années, TensorFlow a également introduit des graphes dynamiques (tels que TensorFlow 2.x), ce qui rend les deux de plus en plus proches en termes de fonctionnalités.
  • D'autres frameworks d'apprentissage profond, tels que Keras et Caffe, ont également certaines applications, mais en raison de sa flexibilité, de sa facilité d'utilisation et du soutien de la communauté, PyTorch est devenu le framework préféré de nombreux chercheurs et développeurs en apprentissage profond.
FonctionnalitéTensorFlowPyTorch
DéveloppeurGoogleFacebook (FAIR)
Type de graphe de calculGraphe de calcul statique (défini avant l'exécution)Graphe de calcul dynamique (exécuté au moment de la définition)
FlexibilitéFaible (le graphe de calcul est construit au moment de la compilation et n'est pas facile à modifier)Élevé (le graphe de calcul est créé dynamiquement au moment de l'exécution, facile à modifier et à déboguer)
DébogageDifficile (nécessite d'utilisertf.debuggingou des outils externes pour le débogage)Facile (peut être débogué directement en Python)
Facilité d'utilisationFaible (plus complexe, plus d'API, courbe d'apprentissage plus raide)Élevé (API concise, syntaxe plus proche de Python, facile à prendre en main)
DéploiementFort (prend en charge un large éventail de matériels, tels que TensorFlow Lite et TensorFlow.js)Plus faible (relativement peu d'outils et de plateformes de déploiement, bien qu'il existe un support de TensorFlow)
Support communautaireTrès fort (communauté mature et vaste, nombreux tutoriels et documentation abondante)Très fort (communauté active, en particulier dans le milieu universitaire, écosystème en développement rapide)
Entraînement du modèlePrend en charge l'entraînement distribué et prend en charge plusieurs appareils (tels que CPU, GPU, TPU)Prend en charge l'entraînement distribué, prend en charge le multi-GPU, CPU et TPU
Niveau d'APIAPI de haut niveau : Keras ; API de bas niveau : TensorFlow CoreAPI de haut niveau : TorchVision, TorchText, etc. ; API de bas niveau : Torch
PerformanceÉlevé (mature en optimisation, adapté aux environnements de production)Élevé (adapté à la recherche et au prototypage, les performances en production s'améliorent également)
Différenciation automatiquePris en chargetf.GradientTapeImplémente la différenciation dynamique (plus complexe)Pris en chargeautogradDifférenciation dynamique (plus concise et intuitive)
Réglage et évolutivitéFort (prend en charge l'exécution sur plusieurs plateformes, telles que TensorFlow Serving, etc.)Plus faible (bien qu'il excelle dans les environnements académiques et expérimentaux, la prise en charge en environnement de production est relativement limitée)
Flexibilité du frameworkPlus faible (TensorFlow 2.x a introduit des fonctionnalités de graphe dynamique, mais il n'est toujours pas entièrement flexible)Élevé (le graphe dynamique apporte une plus grande flexibilité)
Prend en charge plusieurs langagesPrend en charge plusieurs langages (Python, C++, Java, JavaScript, etc.)Prend principalement en charge Python (mais dispose aussi d'une API C++)
Compatibilité et migrationTensorFlow 2.x offre une bonne compatibilité avec les anciennes versionsFaible compatibilité avec TensorFlow, la migration est difficile

PyTorch vs NumPy

Fonctionnalités PyTorch NumPy
Objectif Dédié à l'apprentissage profond Calcul scientifique général
Prise en charge GPU Prend nativement en charge CUDA Pas directement pris en charge
Différenciation automatique Différenciation automatique intégrée Nécessite un calcul manuel du gradient
Réseaux de neurones Ensemble riche de modules de réseaux de neurones Doit être implémenté à partir de zéro
Coût d'apprentissage Relativement élevée Relativement faible

Historique et développement de PyTorch

Le prédécesseur de PyTorch était Torch, un framework de calcul scientifique basé sur le langage Lua. Avec la popularité croissante de Python dans l'apprentissage automatique, l'équipe Facebook a décidé de porter les idées principales de Torch vers Python, donnant naissance à PyTorch.

  • 2016: Facebook a publié PyTorch version 0.1
  • 2017: PyTorch 0.2 a introduit la prise en charge de l'entraînement distribué
  • 2018: PyTorch 1.0 a été publié, ajoutant des capacités de déploiement en production
  • 2019: PyTorch 1.3 a introduit la prise en charge du mobile
  • 2020: PyTorch 1.6 a ajouté l'entraînement automatique en précision mixte
  • 2021: PyTorch 1.9 a introduit TorchScript et l'interface C++
  • 2022: PyTorch 1.12 a optimisé les performances et la stabilité
  • 2023: PyTorch 2.0 a été publié, introduisant un mode de compilation qui améliore grandement les performances
Autres extensions