PyTorch : définition, fonctionnement et exemple
La bibliothèque open source de deep learning devenue le standard de la recherche : tenseurs, autograd, entraînement sur GPU, exemple de boucle d'entraînement et comparaison avec TensorFlow et JAX.
Par Équipe Blent· Mis à jour le · 15 min de lecture· Niveau intermédiaire
PyTorch en bref
- Type
- Bibliothèque de deep learning
- Créateur
- Meta AI (FAIR), 2016
- Gouvernance
- PyTorch Foundation (Linux Foundation)
- Licence
- BSD-3-Clause
- Langages
- Python, C++, noyaux CUDA
- Principe clé
- Tenseurs et autograd
- Écosystème
- torchvision, torchaudio, Hugging Face
Définition : PyTorch
PyTorch est une bibliothèque open source de deep learning pour Python, créée par Meta AI et aujourd'hui gouvernée par la PyTorch Foundation, rattachée à la Linux Foundation. Elle repose sur deux briques : les tenseurs, des tableaux multidimensionnels calculables sur CPU ou GPU, et l'autograd, qui calcule automatiquement les gradients nécessaires à l'entraînement d'un réseau de neurones. Son exécution dite impérative, instruction par instruction, rend le code simple à écrire et à déboguer. PyTorch est devenu le standard de la recherche et le socle de l'écosystème Hugging Face.
En une phrase : PyTorch permet de définir, d'entraîner et de déboguer un réseau de neurones comme du Python ordinaire, avec le calcul sur GPU en prime.
Dans cette définition
Qu'est-ce que PyTorch ?
PyTorch est la bibliothèque la plus utilisée pour construire et entraîner des réseaux de neurones en Python. Elle fournit des tenseurs calculables sur GPU, un moteur de différentiation automatique et une bibliothèque de couches, de fonctions de perte et d'optimiseurs. Elle constitue la base pratique du Deep Learning moderne.
PyTorch se situe sous les outils de plus haut niveau : les Transformers de Hugging Face, les moteurs comme vLLM ou les bibliothèques de fine-tuning s'appuient dessus. Il appartient à la famille du Machine Learning, mais il vise les modèles de grande taille entraînés par descente de gradient, là où des bibliothèques comme scikit-learn traitent les modèles classiques.
Le projet est né à Facebook AI Research (aujourd'hui Meta AI), autour d'Adam Paszke, Sam Gross, Soumith Chintala et Gregory Chanan, et s'inspire de la bibliothèque Torch, écrite en Lua. Il est publié en open source en 2016 et présenté dans un article à NeurIPS en 2019. En 2022, sa gouvernance est confiée à la PyTorch Foundation, rattachée à la Linux Foundation, ce qui l'a placé sous une direction neutre vis-à-vis de Meta. La version 2.0, publiée en mars 2023, a introduit torch.compile.
À retenir : PyTorch n'est pas un modèle ni une plateforme, c'est une bibliothèque de calcul. Il fournit les briques pour écrire, entraîner et exécuter un modèle, mais ne décide ni de l'architecture ni des données.
Sous le capot : tenseurs, autograd et GPU
Trois mécanismes expliquent la façon dont PyTorch fonctionne et pourquoi il s'est imposé auprès des chercheurs.
Les tenseurs
Un tenseur est un tableau multidimensionnel : un nombre, un vecteur, une matrice ou un volume plus complexe, comme un lot d'images. Il possède un type de données (float32, bfloat16...) et un périphérique, CPU ou GPU. L'interface ressemble à celle de NumPy, avec une différence décisive : un tenseur peut être déplacé sur un GPU, où les opérations matricielles s'exécutent en parallèle. L'accélération s'appuie sur la plateforme CUDA de NVIDIA, avec une prise en charge d'autres accélérateurs.
L'autograd et le graphe dynamique
L'entraînement exige le gradient de la perte par rapport à chaque paramètre. PyTorch l'obtient en enregistrant, pendant le calcul avant, les opérations effectuées sur les tenseurs : ce graphe est construit à la volée, à chaque exécution. L'appel à backward() le parcourt à l'envers. Comme le graphe suit simplement l'exécution du code Python, un modèle peut contenir des boucles ou des conditions, et une erreur se repère avec un débogueur classique.
La compilation
L'exécution impérative a un coût : chaque opération est lancée séparément. Depuis PyTorch 2.0, torch.compile capture le code d'un modèle et génère une version optimisée, tout en gardant l'écriture habituelle. C'est la réponse de PyTorch à l'approche de compilation de JAX et de TensorFlow.
Exemple : une boucle d'entraînement
L'exemple ci-dessous entraîne un petit réseau à reconnaître des chiffres manuscrits MNIST, avec torchvision pour les données. Le code utilise le GPU s'il est disponible.
import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
# Choisir le périphérique de calcul
device = "cuda" if torch.cuda.is_available() else "cpu"
# Charger MNIST et le découper en lots
data = datasets.MNIST(
"data", train=True, download=True, transform=transforms.ToTensor()
)
loader = DataLoader(data, batch_size=64, shuffle=True)
# Définir le modèle comme une suite de couches
model = nn.Sequential(
nn.Flatten(),
nn.Linear(28 * 28, 128),
nn.ReLU(),
nn.Linear(128, 10),
).to(device)
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
for epoch in range(3):
for images, labels in loader:
images, labels = images.to(device), labels.to(device)
loss = loss_fn(model(images), labels) # calcul avant et perte
optimizer.zero_grad() # remise à zéro des gradients
loss.backward() # rétropropagation (autograd)
optimizer.step() # mise à jour des poids
print(f"Époque {epoch + 1} : perte = {loss.item():.4f}")
torch.save(model.state_dict(), "mnist.pt")
Le modèle et chaque lot sont envoyés sur le périphérique choisi avec .to(device). Les quatre lignes au cœur de la boucle suivent le cycle décrit plus haut : perte, remise à zéro des gradients, rétropropagation, mise à jour. Cette boucle explicite est la signature de PyTorch : elle demande quelques lignes de plus qu'une API de haut niveau, mais chaque étape reste visible et modifiable.
Les principaux cas d'usage de PyTorch
PyTorch couvre toute la chaîne du deep learning, de la recherche à l'inférence en production.
Vision par ordinateur
Classer, détecter ou segmenter des objets dans des images et des vidéos.
Traitement du langage
Entraîner et adapter des Transformers, dont la plupart des LLM ouverts.
IA générative
Créer des modèles de diffusion, des GAN ou des modèles de langage.
Fine-tuning de modèles
Adapter un modèle préentraîné à un domaine avec des méthodes comme LoRA.
Recherche scientifique
Prototyper rapidement de nouvelles architectures et les reproduire à partir des publications.
Séries temporelles et recommandation
Prévoir une demande, détecter des anomalies ou classer des contenus.
Quels sont les avantages de PyTorch ?
PyTorch doit sa position dominante à une expérience de développement proche de Python natif, appuyée par un écosystème très riche.
- Exécution impérative : le code s'écrit et se débogue avec les outils Python habituels, points d'arrêt et affichages compris.
- Graphe de calcul dynamique, qui autorise des boucles et des conditions dans le modèle.
- Écosystème très large : torchvision, torchaudio, Hugging Face Transformers et la plupart des projets récents de recherche.
- Calcul sur GPU simple à activer, avec prise en charge de CUDA et d'autres accélérateurs.
- Entraînement distribué intégré, du multi-GPU à plusieurs machines.
- Projet open source sous licence permissive, gouverné de façon neutre par la PyTorch Foundation.
Quelles sont les limites de PyTorch ?
PyTorch n'est pas un framework de production clé en main : certains besoins demandent des outils complémentaires.
- La boucle d'entraînement est à écrire soi-même, ce qui demande plus de code qu'une API de haut niveau comme Keras.
- Le déploiement en production passe par des outils annexes comme TorchServe, ONNX ou un moteur de serving.
- Les performances dépendent de la bonne utilisation du GPU : transferts de données, taille des lots, précision mixte.
- Les évolutions rapides imposent de suivre les versions et la compatibilité avec CUDA.
- Le débogage des erreurs de forme (shape) et de mémoire GPU reste difficile pour les débutants.
- L'exécution sur des accélérateurs autres que NVIDIA peut demander davantage de configuration.
PyTorch vs TensorFlow : quelles différences ?
Les deux bibliothèques sont des frameworks complets de deep learning. TensorFlow, publié par Google en 2015, a dominé les premières années. PyTorch l'a progressivement rattrapé puis dépassé dans la recherche, avant de s'imposer aussi dans l'écosystème des LLM.
| Critère | PyTorch | TensorFlow |
|---|---|---|
| Origine | Meta AI, 2016 | Google, 2015 |
| Gouvernance | PyTorch Foundation (Linux Foundation) | Google, avec une communauté open source |
| Style d'exécution | Impératif par défaut, compilation optionnelle | Impératif depuis TensorFlow 2, compilation avec tf.function |
| API de haut niveau | Boucle écrite à la main, ou bibliothèques tierces | Keras intégré |
| Recherche et modèles ouverts | Très majoritaire, base de Hugging Face | Moins présent dans les publications récentes |
| Déploiement | TorchServe, ONNX, moteurs de serving | TensorFlow Serving, TensorFlow Lite, TensorFlow.js |
| Idéal pour | Recherche, fine-tuning, LLM | Projets existants, déploiement mobile ou navigateur |
Ce n'est pas un choix binaire. Les concepts sont les mêmes : tenseurs, gradients, optimiseurs. Une équipe qui maîtrise l'un apprend l'autre en quelques jours. Le critère pratique est l'écosystème : si les modèles et le code à reprendre sont en PyTorch, c'est PyTorch.
JAX, développé par Google, constitue une troisième voie. Il applique des transformations (dérivation, compilation XLA, vectorisation) à des fonctions pures, et séduit pour la recherche à grande échelle et le calcul scientifique. Son écosystème reste toutefois plus restreint que celui de PyTorch.
Passer de PyTorch à la production
Entraîner un modèle n'est qu'une partie du travail. Pour l'exploiter, quelques règles s'imposent.
- Fixer les versions : PyTorch, CUDA et les pilotes GPU doivent rester compatibles. Les images Docker officielles évitent la plupart des écarts.
- Exploiter le GPU : précision mixte, lots de taille adaptée et chargement de données en parallèle (
num_workers) sont les premiers leviers de performance. - Distribuer l'entraînement :
DistributedDataParallelrépartit un entraînement sur plusieurs GPU ou machines. - Sauvegarder proprement : enregistrer le
state_dictdu modèle plutôt que l'objet complet, avec la version de la bibliothèque. - Servir le modèle : choisir un moteur adapté, comme vLLM pour les LLM, ou une plateforme comme KServe sur Kubernetes.
- Suivre les expériences : un outil comme MLflow garde la trace des paramètres, des métriques et des modèles.
Quand utiliser PyTorch ?
PyTorch est le choix par défaut dès qu'il faut entraîner ou adapter un modèle de deep learning, surtout dans l'écosystème des modèles ouverts.
PyTorch est adapté
- Vous entraînez ou ajustez un réseau de neurones, un Transformer ou un LLM.
- Vous voulez reprendre le code d'une publication récente.
- Vous utilisez les modèles du Hub de Hugging Face.
- Vous avez besoin de comprendre et de contrôler chaque étape de l'entraînement.
Un autre outil est préférable
- Un modèle de machine learning classique (arbres, régression) suffit : scikit-learn est plus simple.
- Le besoin se résout par un appel à une API de modèle propriétaire.
- Votre projet est déjà bâti sur TensorFlow ou sur un déploiement mobile spécifique.
- L'équipe cherche une API de très haut niveau sans écrire la boucle d'entraînement.
Technologies et outils associés à PyTorch
PyTorch se situe au centre d'un écosystème de bibliothèques, de moteurs et de plateformes de déploiement.
- Alternative
TensorFlow
Le framework de deep learning de Google, historiquement orienté production.
- Alternative
JAX
Bibliothèque de calcul numérique de Google, fondée sur la transformation de fonctions et la compilation XLA.
- Modèles
Hugging Face
Le Hub et la bibliothèque Transformers, bâtis principalement sur PyTorch.
- Calcul GPU
CUDA
La plateforme de NVIDIA sur laquelle repose l'accélération GPU de PyTorch.
- Matériel
NVIDIA
Le fabricant des GPU les plus utilisés pour entraîner des modèles PyTorch.
- Fine-tuning
Unsloth
Bibliothèque qui accélère le fine-tuning de LLM et réduit la mémoire utilisée.
- Inférence
vLLM
Moteur de serving de LLM écrit en Python autour de PyTorch.
- Déploiement
KServe
Plateforme de serving de modèles sur Kubernetes.
Les concepts à connaître autour de PyTorch
Quelques notions suffisent pour lire et écrire la plupart du code PyTorch.
- TenseurLa structure de données de base : un tableau multidimensionnel doté d'un type et d'un périphérique (CPU ou GPU).
- AutogradLe moteur de différentiation automatique qui calcule les gradients à partir des opérations enregistrées.
- Deep LearningL'apprentissage de réseaux de neurones profonds, domaine dans lequel PyTorch s'est imposé.
- TransformerL'architecture de réseau à la base des LLM, implémentée en PyTorch dans la plupart des projets ouverts.
- torch.compileLa fonction de compilation introduite avec PyTorch 2.0 pour accélérer l'exécution des modèles.
- Précision mixteL'usage de nombres de 16 bits pour accélérer l'entraînement et réduire la mémoire, sans perte notable de qualité.
Ressources pour approfondir PyTorch
Trois articles pour situer PyTorch dans l'écosystème du deep learning, du calcul GPU et du fine-tuning.
- Comparatif
TensorFlow : Deep Learning sous Python
Le framework concurrent de PyTorch, pour comparer les approches.
Lire l'article - Guide
CUDA : tout savoir sur le framework GPU de NVIDIA
Comprendre la couche de calcul GPU sur laquelle s'appuie PyTorch.
Lire l'article - Tutoriel
Unsloth : fine-tuner des LLM
Adapter un modèle de langage ouvert avec une bibliothèque construite sur PyTorch.
Lire l'article
Questions fréquentes
Questions fréquentes
Expertise
À propos de l'auteur
Équipe Blent
Les ingénieurs et mentors Blent conçoivent, évaluent et mettent en production des modèles de machine learning, et forment chaque année des centaines de professionnels à la data et à l'IA.
Sources et méthodologie
- Paszke et al., PyTorch: An Imperative Style, High-Performance Deep Learning Library, NeurIPS 2019
- Documentation officielle de PyTorch et site de la PyTorch Foundation
- Retours d'expérience des projets et formations Blent
Comment fonctionne PyTorch ?
Un entraînement PyTorch suit toujours le même cycle. Les quatre dernières étapes se répètent à chaque lot de données.
Représenter les données en tenseurs
Images, textes ou tableaux sont convertis en tenseurs, des structures multidimensionnelles proches des tableaux NumPy, que l'on peut déplacer sur GPU.
Définir le modèle
Le réseau est une classe qui hérite de torch.nn.Module : ses couches sont déclarées dans le constructeur, et la méthode forward décrit le calcul.
Calculer la perte
Le modèle produit des prédictions sur un lot de données, puis une fonction de perte mesure l'écart avec les valeurs attendues.
Rétropropager les gradients
L'appel à loss.backward() déclenche l'autograd, qui remonte le graphe de calcul construit à la volée pour obtenir le gradient de chaque paramètre.
Mettre à jour les paramètres
Un optimiseur comme SGD ou Adam ajuste les poids à partir des gradients, puis ceux-ci sont remis à zéro avant le lot suivant.
Évaluer et sauvegarder
Le modèle est évalué sur des données de validation, puis ses poids sont enregistrés pour être rechargés, partagés ou déployés.