> ## Documentation Index
> Fetch the complete documentation index at: https://docs.coreweave.com/llms.txt
> Use this file to discover all available pages before exploring further.

# PyTorch

> Intégrez W&B à PyTorch pour le suivi des expériences, la gestion des versions des datasets et la journalisation des métriques, des gradients et des modèles.

export const ColabLink = ({url}) => <a href={url} target="_blank" rel="noopener noreferrer" className="colab-link">
    <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
      <path d="M14.25.18l.9.2.73.26.59.3.45.32.34.34.25.34.16.33.1.3.04.26.02.2-.01.13V8.5l-.05.63-.13.55-.21.46-.26.38-.3.31-.33.25-.35.19-.35.14-.33.1-.3.07-.26.04-.21.02H8.77l-.69.05-.59.14-.5.22-.41.27-.33.32-.27.35-.2.36-.15.37-.1.35-.07.32-.04.27-.02.21v3.06H3.17l-.21-.03-.28-.07-.32-.12-.35-.18-.36-.26-.36-.36-.35-.46-.32-.59-.28-.73-.21-.88-.14-1.05-.05-1.23.06-1.22.16-1.04.24-.87.32-.71.36-.57.4-.44.42-.33.42-.24.4-.16.36-.1.32-.05.24-.01h.16l.06.01h8.16v-.83H6.18l-.01-2.75-.02-.37.05-.34.11-.31.17-.28.25-.26.31-.23.38-.2.44-.18.51-.15.58-.12.64-.1.71-.06.77-.04.84-.02 1.27.05zm-6.3 1.98l-.23.33-.08.41.08.41.23.34.33.22.41.09.41-.09.33-.22.23-.34.08-.41-.08-.41-.23-.33-.33-.22-.41-.09-.41.09zm13.09 3.95l.28.06.32.12.35.18.36.27.36.35.35.47.32.59.28.73.21.88.14 1.04.05 1.23-.06 1.23-.16 1.04-.24.86-.32.71-.36.57-.4.45-.42.33-.42.24-.4.16-.36.09-.32.05-.24.02-.16-.01h-8.22v.82h5.84l.01 2.76.02.36-.05.34-.11.31-.17.29-.25.25-.31.24-.38.2-.44.17-.51.15-.58.13-.64.09-.71.07-.77.04-.84.01-1.27-.04-1.07-.14-.9-.2-.73-.25-.59-.3-.45-.33-.34-.34-.25-.34-.16-.33-.1-.3-.04-.25-.02-.2.01-.13v-5.34l.05-.64.13-.54.21-.46.26-.38.3-.32.33-.24.35-.2.35-.14.33-.1.3-.06.26-.04.21-.02.13-.01h5.84l.69-.05.59-.14.5-.21.41-.28.33-.32.27-.35.2-.36.15-.36.1-.35.07-.32.04-.28.02-.21V6.07h2.09l.14.01.21.03zm-6.47 14.25l-.23.33-.08.41.08.41.23.33.33.23.41.08.41-.08.33-.23.23-.33.08-.41-.08-.41-.23-.33-.33-.23-.41-.08-.41.08z" />
    </svg>
    Try in Colab
  </a>;

<ColabLink url="https://colab.research.google.com/github/wandb/examples/blob/master/colabs/pytorch/Simple_PyTorch_Integration.ipynb" />

Utilisez [W\&B](https://forge.coreweave.com/wandb) pour le suivi des expériences de machine learning, la gestion des versions des datasets et la collaboration sur vos projets.

<Frame>
  <img src="https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/huggingface-why.png?fit=max&auto=format&n=3Dv_sw2eg8feUJlx&q=85&s=7bc6de71cf51f9fd1c36822fb2d250c2" alt="Avantages de W&B" width="4672" height="816" data-path="products/wandb/_media/huggingface-why.png" />
</Frame>

<h2 id="what-this-notebook-covers">
  Contenu de ce notebook
</h2>

Ce tutoriel explique comment intégrer W\&B à votre code d’entraînement PyTorch pour suivre vos expériences, journaliser des métriques et des gradients, et versionner vos modèles. Utilisez-le pour ajouter le suivi des expériences à un pipeline PyTorch existant.

<Frame>
  <img src="https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/pytorch.png?fit=max&auto=format&n=3Dv_sw2eg8feUJlx&q=85&s=9a04307a49ba65491c0648a16d374785" alt="Schéma de l’intégration de PyTorch et W&B" width="1831" height="1088" data-path="products/wandb/_media/pytorch.png" />
</Frame>

```python theme={"system"}
# importer la bibliothèque
import wandb

# capture a dictionary of hyperparameters with config
config = {
    "learning_rate": 0.001,
    "epochs": 100,
    "batch_size": 128
}

# démarrer une nouvelle expérience
with wandb.init(project="new-sota-model", config=config) as run:

    # configurer le modèle et les données
    model, dataloader = get_model(), get_data()

    # facultatif : suivre les gradients
    run.watch(model)

    for batch in dataloader:
        metrics = model.training_step()
        # journaliser les métriques dans votre boucle d'entraînement pour visualiser les performances du modèle
        run.log(metrics)

    # facultatif : enregistrer le modèle à la fin
    model.to_onnx()
    run.save("model.onnx")
```

Suivez le [tutoriel vidéo](https://wandb.me/pytorch-video) en parallèle.

Les sections dont le titre commence par *Étape* contiennent tout ce dont vous avez besoin pour intégrer W\&B à un pipeline existant. Le reste du notebook charge les données et définit un modèle.

<h2 id="install-import-and-log-in">
  Installer, importer et se connecter
</h2>

Avant de définir l’expérience, configurez l’environnement et authentifiez-vous auprès de W\&B.

```python theme={"system"}
import os
import random

import numpy as np
import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms
from tqdm.auto import tqdm

# Garantir un comportement déterministe
seed = 42
torch.backends.cudnn.deterministic = True
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)

# Configuration du périphérique
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

# retirer le miroir lent de la liste des miroirs MNIST
torchvision.datasets.MNIST.mirrors = [mirror for mirror in torchvision.datasets.MNIST.mirrors
                                      if not mirror.startswith("http://yann.lecun.com")]
```

<h3 id="step-0-install-wb">
  Étape 0 : installer W\&B
</h3>

Pour commencer, installez la bibliothèque `wandb` avec `pip`.

```python theme={"system"}
!pip install wandb onnx -Uq
```

<h3 id="step-1-import-wb-and-log-in">
  Étape 1 : importer W\&B et se connecter
</h3>

Pour journaliser des données dans le service W\&B, vous devez vous connecter.

Si vous utilisez W\&B pour la première fois, inscrivez-vous gratuitement en suivant le lien qui s’affiche.

```python theme={"system"}
import wandb

wandb.login()
```

<h2 id="define-the-experiment-and-pipeline">
  Définir l’expérience et le pipeline
</h2>

Une fois W\&B installé et votre session authentifiée, définissez la configuration de l’expérience ainsi que le pipeline d’entraînement qui l’utilisera.

<h3 id="track-metadata-and-hyperparameters-with-wandbinit">
  Suivre les métadonnées et les hyperparamètres avec `wandb.init()`
</h3>

Commencez par définir votre expérience dans le code. Quels sont les hyperparamètres ? Quelles métadonnées sont associées à ce run ?

Un flux de travail courant consiste à stocker ces informations dans un dictionnaire `config` (ou un objet similaire), puis à y accéder selon les besoins.

Cet exemple ne fait varier que quelques hyperparamètres et code le reste en dur. N’importe quel élément de votre modèle peut figurer dans la `config`.

L’exemple inclut également des métadonnées relatives au dataset MNIST et à une architecture convolutive. Si vous travaillez ensuite, par exemple, avec des architectures entièrement connectées sur CIFAR dans le même projet, ces métadonnées vous aideront à distinguer vos runs.

```python theme={"system"}
config = dict(
    epochs=5,
    classes=10,
    kernels=[16, 32],
    batch_size=128,
    learning_rate=0.005,
    dataset="MNIST",
    architecture="CNN")
```

Ensuite, définissez le pipeline global, classique pour l’entraînement d’un modèle :

1. `make` : créer un modèle, ainsi que les données et l’optimiseur associés.
2. `train` : entraîner le modèle en conséquence.
3. `test` : tester le modèle pour évaluer le déroulement de l’entraînement.

Le code suivant implémente ces fonctions.

```python theme={"system"}
def model_pipeline(hyperparameters):

    # demander à wandb de démarrer
    with wandb.init(project="pytorch-demo", config=hyperparameters) as run:
        # accéder à tous les hyperparamètres via run.config, pour que la journalisation reflète l’exécution réelle.
        config = run.config

        # créer le modèle, les données et le problème d’optimisation
        model, train_loader, test_loader, criterion, optimizer = make(config)
        print(model)

        # puis les utiliser pour entraîner le modèle
        train(model, train_loader, criterion, optimizer, config)

        # et évaluer ses performances finales
        test(model, test_loader)

    return model
```

La seule différence avec un pipeline standard est que tout se déroule dans le contexte de `wandb.init()`. L’appel de cette fonction établit un canal de communication entre votre code et les serveurs W\&B.

Passer le dictionnaire `config` à `wandb.init()` journalise immédiatement toutes ces informations dans W\&B : vous savez ainsi toujours quelles valeurs d’hyperparamètres vous avez définies pour votre expérience.

Pour garantir que les valeurs choisies et journalisées sont toujours celles qu’utilise votre modèle, W\&B recommande d’utiliser la copie `run.config` de votre objet. Consultez la définition de `make` ci-dessous pour en voir quelques exemples.

Une fois le pipeline défini, les sections suivantes implémentent successivement chacune de ses étapes : configuration des données et du modèle, entraînement et test.

> *Remarque* : W\&B exécute son code dans des processus distincts afin qu’un éventuel problème côté W\&B ne fasse pas planter votre code. Une fois le problème résolu, vous pouvez journaliser les données avec `wandb sync`.

```python theme={"system"}
def make(config):
    # Préparer les données
    train, test = get_data(train=True), get_data(train=False)
    train_loader = make_loader(train, batch_size=config.batch_size)
    test_loader = make_loader(test, batch_size=config.batch_size)

    # Créer le modèle
    model = ConvNet(config.kernels, config.classes).to(device)

    # Définir la fonction de perte et l’optimiseur
    criterion = nn.CrossEntropyLoss()
    optimizer = torch.optim.Adam(
        model.parameters(), lr=config.learning_rate)
    
    return model, train_loader, test_loader, criterion, optimizer
```

<h3 id="define-the-data-loading-and-model">
  Définir le chargement des données et le modèle
</h3>

Indiquez ensuite comment les données sont chargées et à quoi ressemble le modèle.

Cette étape est importante, mais elle est identique à ce qu'elle serait sans `wandb`.

```python theme={"system"}
def get_data(slice=5, train=True):
    full_dataset = torchvision.datasets.MNIST(root=".",
                                              train=train, 
                                              transform=transforms.ToTensor(),
                                              download=True)
    #  équivalent à un slicing avec [::slice] 
    sub_dataset = torch.utils.data.Subset(
      full_dataset, indices=range(0, len(full_dataset), slice))
    
    return sub_dataset


def make_loader(dataset, batch_size):
    loader = torch.utils.data.DataLoader(dataset=dataset,
                                         batch_size=batch_size, 
                                         shuffle=True,
                                         pin_memory=True, num_workers=2)
    return loader
```

L'utilisation de `wandb` ne modifie en rien la définition du modèle ; cet exemple utilise donc une architecture ConvNet standard. N'hésitez pas à expérimenter avec ce code. W\&B journalise tous vos résultats sur [Forge](https://forge.coreweave.com/wandb).

```python theme={"system"}
# Réseau de neurones classique et convolutif

class ConvNet(nn.Module):
    def __init__(self, kernels, classes=10):
        super(ConvNet, self).__init__()
        
        self.layer1 = nn.Sequential(
            nn.Conv2d(1, kernels[0], kernel_size=5, stride=1, padding=2),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2))
        self.layer2 = nn.Sequential(
            nn.Conv2d(16, kernels[1], kernel_size=5, stride=1, padding=2),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2))
        self.fc = nn.Linear(7 * 7 * kernels[-1], classes)
        
    def forward(self, x):
        out = self.layer1(x)
        out = self.layer2(out)
        out = out.reshape(out.size(0), -1)
        out = self.fc(out)
        return out
```

<h3 id="define-training-logic">
  Définir la logique d’entraînement
</h3>

Poursuivons dans `model_pipeline` : il est temps de définir le fonctionnement de `train`. C’est à cette étape que l’intégration W\&B suit les gradients, les paramètres et les métriques au fil de l’entraînement.

Deux fonctions de `wandb` entrent ici en jeu : `watch` et `log`.

<h3 id="track-gradients-with-runwatch-and-everything-else-with-runlog">
  Suivre les gradients avec `run.watch()` et tout le reste avec `run.log()`
</h3>

`run.watch()` journalise les gradients et les paramètres de votre modèle toutes les `log_freq` étapes d’entraînement.

Appelez `run.watch()` avant de lancer l’entraînement. Pour en savoir plus sur les modes de journalisation, l’utilisation de plusieurs modèles et les conseils de performances, consultez [Comment puis-je journaliser les gradients et les poids du modèle avec wandb.watch ?](/fr/support/models/articles/how-do-i-log-gradients-and-model-weights-with-wandb-watch).

Le reste du code d’entraînement ne change pas : itérez sur les époques et les lots, effectuez les passes avant et arrière, puis appliquez votre `optimizer`.

```python theme={"system"}
def train(model, loader, criterion, optimizer, config):
    # Demander à wandb d’observer le comportement du modèle : gradients, poids, etc.
    run = wandb.init(project="pytorch-demo", config=config)
    run.watch(model, criterion, log="all", log_freq=10)

    # Lancer l’entraînement et le suivre avec wandb
    total_batches = len(loader) * config.epochs
    example_ct = 0  # nombre d’exemples traités
    batch_ct = 0
    for epoch in tqdm(range(config.epochs)):
        for _, (images, labels) in enumerate(loader):

            loss = train_batch(images, labels, model, optimizer, criterion)
            example_ct +=  len(images)
            batch_ct += 1

            # Journaliser les métriques tous les 25 lots
            if ((batch_ct + 1) % 25) == 0:
                train_log(loss, example_ct, epoch)


def train_batch(images, labels, model, optimizer, criterion):
    images, labels = images.to(device), labels.to(device)
    
    # Passe avant ➡
    outputs = model(images)
    loss = criterion(outputs, labels)
    
    # Passe arrière ⬅
    optimizer.zero_grad()
    loss.backward()

    # Effectuer une étape d’optimisation
    optimizer.step()

    return loss
```

La seule différence se trouve dans le code de journalisation : là où vous affichiez auparavant les métriques dans le terminal, vous les transmettez désormais à `run.log()`.

`run.log()` attend un dictionnaire dont les clés sont des chaînes de caractères. Ces chaînes identifient les objets journalisés, qui constituent les valeurs. Vous pouvez également journaliser, de manière facultative, l'étape (`step`) d'entraînement en cours.

> *Remarque* : utiliser le nombre d'exemples vus par le modèle facilite la comparaison entre différentes tailles de lot, mais vous pouvez aussi utiliser le nombre brut d'étapes ou de lots. Pour les runs d'entraînement plus longs, il peut également être judicieux de journaliser par `epoch`.

```python theme={"system"}
def train_log(loss, example_ct, epoch):
    with wandb.init(project="pytorch-demo") as run:
        # Journaliser la perte et le numéro d’époque
        # C’est ici que les métriques sont journalisées dans W&B
        run.log({"epoch": epoch, "loss": loss}, step=example_ct)
        print(f"Loss after {str(example_ct).zfill(5)} examples: {loss:.3f}")
```

<h3 id="define-testing-logic">
  Définir la logique de test
</h3>

Une fois l’entraînement du modèle terminé, testez-le : exécutez-le par exemple sur de nouvelles données issues de la production, ou appliquez-le à quelques exemples sélectionnés à la main. L’étape de test est aussi le moment idéal pour enregistrer le modèle entraîné.

<h3 id="optional-call-runsave">
  Facultatif : appeler `run.save()`
</h3>

C'est également le bon moment pour enregistrer sur disque l'architecture du modèle et ses paramètres finaux. Pour une compatibilité optimale, exportez (`export`) le modèle au [format Open Neural Network eXchange (ONNX)](https://onnx.ai/).

En transmettant ce nom de fichier à `run.save()`, vous avez la garantie que les paramètres du modèle sont enregistrés sur les serveurs W\&B : fini les incertitudes sur le fichier `.h5` ou `.pb` qui correspond à chaque run d'entraînement.

Pour découvrir des fonctionnalités `wandb` plus avancées de stockage, de gestion des versions et de distribution des modèles, consultez les [outils Artifacts](https://www.wandb.com/artifacts).

```python theme={"system"}
def test(model, test_loader):
    model.eval()

    with wandb.init(project="pytorch-demo") as run:
        # Exécuter le modèle sur quelques exemples de test
        with torch.no_grad():
            correct, total = 0, 0
            for images, labels in test_loader:
                images, labels = images.to(device), labels.to(device)
                outputs = model(images)
                _, predicted = torch.max(outputs.data, 1)
                total += labels.size(0)
                correct += (predicted == labels).sum().item()

            print(f"Accuracy of the model on the {total} " +
                f"test images: {correct / total:%}")
            
            run.log({"test_accuracy": correct / total})

        # Enregistrer le modèle au format d’échange ONNX
        torch.onnx.export(model, images, "model.onnx")
        run.save("model.onnx")
```

<h3 id="run-training-and-watch-your-metrics-live-on-wandbai">
  Lancer l’entraînement et suivre vos métriques en direct sur wandb.ai
</h3>

Maintenant que vous avez défini l’ensemble du pipeline et ajouté ces quelques lignes de code W\&B, vous pouvez exécuter votre expérience, entièrement suivie.

W\&B vous indique quelques liens : la documentation, la page du projet (qui regroupe tous les runs d’un projet) et la page du run (où sont stockés les résultats de ce run).

Accédez à la page du run et consultez les onglets suivants :

1. **Charts**, où les gradients du modèle, les valeurs des paramètres et la perte sont journalisés tout au long de l’entraînement.
2. **System**, qui contient les métriques système, notamment l’utilisation des E/S disque ainsi que les métriques CPU et GPU.
3. **Logs**, qui contient une copie de tout ce qui a été écrit sur la sortie standard pendant l’entraînement.
4. **Files**, où, une fois l’entraînement terminé, vous pouvez cliquer sur `model.onnx` pour visualiser votre réseau avec le [visualiseur de modèles Netron](https://github.com/lutzroeder/netron).

Une fois le run terminé, à la sortie du bloc `with wandb.init()`, W\&B affiche également une synthèse des résultats dans la sortie de la cellule.

```python theme={"system"}
# Construire, entraîner et analyser le modèle à l’aide du pipeline
model = model_pipeline(config)
```

<h3 id="test-hyperparameters-with-sweeps">
  Tester des hyperparamètres avec des sweeps
</h3>

Cet exemple ne portait que sur un seul ensemble d'hyperparamètres. Or, dans la plupart des flux de travail de ML, il est essentiel d'itérer sur plusieurs hyperparamètres.

Vous pouvez utiliser W\&B Sweeps pour automatiser le test des hyperparamètres et explorer l'espace des modèles et des stratégies d'optimisation possibles. Vous pouvez ainsi aller au-delà du run précédent, limité à une seule configuration.

Consultez ce [notebook Colab illustrant l'optimisation des hyperparamètres avec W\&B Sweeps](https://wandb.me/sweeps-colab).

L'exécution d'un sweep d'hyperparamètres avec W\&B se déroule en trois étapes :

1. **Définir le sweep :** créez un dictionnaire ou un [fichier YAML](/fr/products/wandb/sweeps/define-sweep-configuration) qui spécifie les paramètres à explorer, la stratégie de recherche, la métrique d'optimisation, etc.
2. **Initialiser le sweep :** `sweep_id = wandb.sweep(sweep_config)`.
3. **Lancer l'agent de sweep :** `wandb.agent(sweep_id, function=train)`.

Il n'en faut pas plus pour exécuter un sweep d'hyperparamètres.

<Frame>
  <img src="https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/pytorch-2.png?fit=max&auto=format&n=3Dv_sw2eg8feUJlx&q=85&s=8f008510ef1a5a83f55745dff00d6e97" alt="Tableau de bord d'entraînement PyTorch" width="1849" height="1078" data-path="products/wandb/_media/pytorch-2.png" />
</Frame>

<h2 id="example-gallery">
  Galerie d’exemples
</h2>

Explorez des exemples de projets suivis et visualisés avec W\&B dans la [Galerie](https://app.wandb.ai/gallery).

<h2 id="advanced-setup">
  Configuration avancée
</h2>

Les options suivantes permettent d'étendre le flux de travail de base présenté ci-dessus aux environnements de production, hors ligne ou gérés :

* [Variables d'environnement](/fr/products/wandb/platform/hosting/env-vars) : définissez les clés API dans des variables d'environnement pour pouvoir lancer l'entraînement sur un cluster géré.
* [Mode hors ligne](/fr/support/models/articles/how-do-i-run-wandb-offline) : utilisez le mode `dryrun` pour entraîner hors ligne et synchroniser les résultats plus tard.
* [Sur site](/fr/products/wandb/platform/hosting/hosting-options/self-managed) : installez W\&B dans un cloud privé ou sur des serveurs isolés du réseau au sein de votre propre infrastructure.
* [Sweeps](/fr/products/wandb/sweeps) : configurez rapidement une recherche d'hyperparamètres grâce à un outil d'optimisation léger.
