Lexique · Frameworks / outils IA

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.

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. É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.

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.

python
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èrePyTorchTensorFlow
OrigineMeta AI, 2016Google, 2015
GouvernancePyTorch Foundation (Linux Foundation)Google, avec une communauté open source
Style d'exécutionImpératif par défaut, compilation optionnelleImpératif depuis TensorFlow 2, compilation avec tf.function
API de haut niveauBoucle écrite à la main, ou bibliothèques tiercesKeras intégré
Recherche et modèles ouvertsTrès majoritaire, base de Hugging FaceMoins présent dans les publications récentes
DéploiementTorchServe, ONNX, moteurs de servingTensorFlow Serving, TensorFlow Lite, TensorFlow.js
Idéal pourRecherche, fine-tuning, LLMProjets 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 : DistributedDataParallel répartit un entraînement sur plusieurs GPU ou machines.
  • Sauvegarder proprement : enregistrer le state_dict du 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.

Pertinent si

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.
Moins adapté si

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.

Les concepts à connaître autour de PyTorch

Quelques notions suffisent pour lire et écrire la plupart du code PyTorch.

Ressources pour approfondir PyTorch

Trois articles pour situer PyTorch dans l'écosystème du deep learning, du calcul GPU et du fine-tuning.

Questions fréquentes

Questions fréquentes

Oui. PyTorch est open source, distribué sous une licence de type BSD, et utilisable à des fins commerciales. Le coût réel vient de l'infrastructure de calcul, GPU compris, qui exécute l'entraînement et l'inférence.

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