> ## 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 Lightning

> Utilisez Weights & Biases avec le WandbLogger de PyTorch Lightning pour le suivi des expériences et la sauvegarde des points de contrôle du modèle.

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>;

PyTorch Lightning fournit un wrapper léger qui permet d’organiser votre code PyTorch et d’ajouter des fonctionnalités avancées comme l’entraînement distribué et la précision 16 bits. Weights & Biases fournit un wrapper léger pour journaliser vos expériences de ML. Inutile de combiner les deux vous-même : la bibliothèque PyTorch Lightning intègre directement Weights & Biases via le [`WandbLogger`](https://lightning.ai/docs/pytorch/stable/api/lightning.pytorch.loggers.wandb.html#module-lightning.pytorch.loggers.wandb).

Cette page explique comment utiliser `WandbLogger` pour suivre des métriques, journaliser des hyperparamètres, enregistrer des points de contrôle de modèle sous forme d’artifacts, journaliser des médias et lancer un entraînement multi-GPU avec PyTorch Lightning et Weights & Biases.

<h2 id="integrate-with-lightning">
  Intégrer avec Lightning
</h2>

Les sections suivantes expliquent comment vous authentifier auprès de Weights & Biases, installer la bibliothèque `wandb` et joindre un `WandbLogger` à votre `Trainer` Lightning ou à votre instance `Fabric`.

<Tabs>
  <Tab title="Logger PyTorch">
    ```python theme={"system"}
    from lightning.pytorch.loggers import WandbLogger
    from lightning.pytorch import Trainer

    wandb_logger = WandbLogger(log_model="all")
    trainer = Trainer(logger=wandb_logger)
    ```

    <Note>
      **Utilisation de `wandb.log()` :** le `WandbLogger` journalise dans Weights & Biases à partir du `global_step` du Trainer. Si vous appelez également `wandb.log()` directement dans votre code, n’utilisez pas l’argument `step` de `wandb.log()`.

      Journalisez plutôt le `global_step` du Trainer comme n’importe quelle autre métrique :

      ```python theme={"system"}
      wandb.log({"accuracy":0.99, "trainer/global_step": step})
      ```
    </Note>
  </Tab>

  <Tab title="Logger Fabric">
    ```python theme={"system"}
    import lightning as L
    from wandb.integration.lightning.fabric import WandbLogger

    wandb_logger = WandbLogger(log_model="all")
    fabric = L.Fabric(loggers=[wandb_logger])
    fabric.launch()
    fabric.log_dict({"important_metric": important_metric})
    ```
  </Tab>
</Tabs>

<Frame>
  <img src="https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/_media/n6P7K4M.gif?s=4ff557f50709714baf515fab417e2b64" alt="Tableaux de bord interactifs" width="1920" height="1080" data-path="products/wandb/_media/n6P7K4M.gif" />
</Frame>

<h3 id="sign-up-and-create-an-api-key">
  S’inscrire et créer une clé API
</h3>

Une clé API authentifie votre machine auprès de Weights & Biases. Vous pouvez générer une clé API depuis votre profil utilisateur.

<Note>
  Pour plus de simplicité, accédez aux [Paramètres utilisateur](https://forge.coreweave.com/settings) et créez une clé API. Copiez immédiatement la clé API et enregistrez-la dans un emplacement sécurisé, par exemple un gestionnaire de mots de passe.
</Note>

Pour générer une clé API depuis votre profil utilisateur :

1. Cliquez sur l’icône de votre profil utilisateur dans le coin supérieur droit.
2. Sélectionnez **Paramètres utilisateur**, puis faites défiler la page jusqu’à la section **API Keys**.

<h3 id="install-the-wandb-library-and-log-in">
  Installer la bibliothèque `wandb` et se connecter
</h3>

Pour installer la bibliothèque `wandb` en local et vous connecter :

<Tabs>
  <Tab title="Ligne de commande">
    1. Définissez la [variable d’environnement](/fr/products/wandb/track/environment-variables) `WANDB_API_KEY` sur votre clé API. Remplacez les valeurs entre `<>` par les vôtres :

       ```bash theme={"system"}
       export WANDB_API_KEY=<your_api_key>
       ```

    2. Installez la bibliothèque `wandb` et connectez-vous.

       ```shell theme={"system"}
       pip install wandb

       wandb login
       ```
  </Tab>

  <Tab title="Python">
    ```bash theme={"system"}
    pip install wandb
    ```

    ```python theme={"system"}
    import wandb
    wandb.login()
    ```
  </Tab>

  <Tab title="notebook Python">
    ```notebook theme={"system"}
    !pip install wandb

    import wandb
    wandb.login()
    ```
  </Tab>
</Tabs>

<h2 id="use-pytorch-lightnings-wandblogger">
  Utiliser le `WandbLogger` de PyTorch Lightning
</h2>

PyTorch Lightning propose plusieurs classes `WandbLogger` pour consigner les métriques, les poids du modèle et les médias. Choisissez la classe qui correspond à votre configuration d’entraînement :

* [`PyTorch`](https://lightning.ai/docs/pytorch/stable/api/lightning.pytorch.loggers.wandb.html#module-lightning.pytorch.loggers.wandb)
* [`Fabric`](https://lightning.ai/docs/pytorch/stable/api/lightning.pytorch.loggers.wandb.html#module-lightning.pytorch.loggers.wandb)

Pour l’intégration avec Lightning, instanciez le `WandbLogger` et transmettez-le au `Trainer` ou à `Fabric` de Lightning.

<Tabs>
  <Tab title="Logger PyTorch">
    ```python theme={"system"}
    trainer = Trainer(logger=wandb_logger)
    ```
  </Tab>

  <Tab title="Logger Fabric">
    ```python theme={"system"}
    fabric = L.Fabric(loggers=[wandb_logger])
    fabric.launch()
    fabric.log_dict({
        "important_metric": important_metric
    })
    ```
  </Tab>
</Tabs>

<h3 id="common-logger-arguments">
  Arguments courants du logger
</h3>

Le tableau suivant répertorie les paramètres courants de `WandbLogger`. Pour plus de détails sur l’ensemble des arguments du logger, consultez la documentation de PyTorch Lightning.

* [`PyTorch`](https://lightning.ai/docs/pytorch/stable/api/lightning.pytorch.loggers.wandb.html#module-lightning.pytorch.loggers.wandb)
* [`Fabric`](https://lightning.ai/docs/pytorch/stable/api/lightning.pytorch.loggers.wandb.html#module-lightning.pytorch.loggers.wandb)

| Paramètre | Description |
| - | - |
| `project` | Définit le projet Weights & Biases dans lequel journaliser les données |
| `name` | Nomme votre run W\&B |
| `log_model` | Journalise tous les modèles si `log_model="all"`, ou à la fin de l’entraînement si `log_model=True` |
| `save_dir` | Chemin d’enregistrement des données |

<h2 id="log-your-hyperparameters">
  Journaliser vos hyperparamètres
</h2>

Journaliser vos hyperparamètres avec Weights & Biases vous permet de comparer des runs et de reproduire des résultats. Utilisez la méthode adaptée à votre logger :

<Tabs>
  <Tab title="Logger PyTorch">
    ```python theme={"system"}
    class LitModule(LightningModule):
        def __init__(self, *args, **kwarg):
            self.save_hyperparameters()
    ```
  </Tab>

  <Tab title="Logger Fabric">
    ```python theme={"system"}
    wandb_logger.log_hyperparams(
        {
            "hyperparameter_1": hyperparameter_1,
            "hyperparameter_2": hyperparameter_2,
        }
    )
    ```
  </Tab>
</Tabs>

<h2 id="log-additional-config-parameters">
  Journaliser des paramètres de configuration supplémentaires
</h2>

Pour capturer des valeurs de configuration additionnelles parallèlement à vos hyperparamètres, mettez directement à jour la configuration de run :

```python theme={"system"}
# ajouter un paramètre
wandb_logger.experiment.config["key"] = value

# ajouter plusieurs paramètres
wandb_logger.experiment.config.update({key1: val1, key2: val2})

# utiliser directement le module wandb
wandb.config["key"] = value
wandb.config.update()
```

<h2 id="log-gradients-parameter-histogram-and-model-topology">
  Journaliser les gradients, l’histogramme des paramètres et la topologie du modèle
</h2>

Transmettez l’objet de votre modèle à `wandb_logger.watch()` pour surveiller ses gradients et ses paramètres pendant l’entraînement. Voir la documentation de `WandbLogger` de PyTorch Lightning.

<h2 id="log-metrics">
  Consigner des métriques
</h2>

<Tabs>
  <Tab title="Logger PyTorch">
    Pour consigner vos métriques dans Weights & Biases avec le `WandbLogger`, appelez `self.log('my_metric_name', metric_value)` dans votre `LightningModule`, par exemple dans vos méthodes `training_step` ou `validation_step`.

    L’extrait de code suivant montre comment définir votre `LightningModule` pour consigner vos métriques ainsi que ses hyperparamètres. Cet exemple utilise la bibliothèque [`torchmetrics`](https://github.com/Lightning-AI/torchmetrics) pour calculer vos métriques.

    ```python theme={"system"}
    import torch
    from torch.nn import Linear, CrossEntropyLoss, functional as F
    from torch.optim import Adam
    from torchmetrics.functional import accuracy
    from lightning.pytorch import LightningModule


    class My_LitModule(LightningModule):
        def __init__(self, n_classes=10, n_layer_1=128, n_layer_2=256, lr=1e-3):
            """méthode utilisée pour définir les paramètres du modèle"""
            super().__init__()

            # les images mnist sont de forme (1, 28, 28) (canaux, largeur, hauteur)
            self.layer_1 = Linear(28 * 28, n_layer_1)
            self.layer_2 = Linear(n_layer_1, n_layer_2)
            self.layer_3 = Linear(n_layer_2, n_classes)

            self.loss = CrossEntropyLoss()
            self.lr = lr

            # enregistrer les hyperparamètres dans self.hparams (journalisés automatiquement par W&B)
            self.save_hyperparameters()

        def forward(self, x):
            """méthode utilisée pour l’inférence entrée -> sortie"""

            # (b, 1, 28, 28) -> (b, 1*28*28)
            batch_size, channels, width, height = x.size()
            x = x.view(batch_size, -1)

            # appliquer 3 x (linéaire + relu)
            x = F.relu(self.layer_1(x))
            x = F.relu(self.layer_2(x))
            x = self.layer_3(x)
            return x

        def training_step(self, batch, batch_idx):
            """doit renvoyer une perte à partir d’un seul lot"""
            _, loss, acc = self._get_preds_loss_accuracy(batch)

            # Journaliser la perte et la métrique
            self.log("train_loss", loss)
            self.log("train_accuracy", acc)
            return loss

        def validation_step(self, batch, batch_idx):
            """utilisée pour consigner des métriques"""
            preds, loss, acc = self._get_preds_loss_accuracy(batch)

            # Journaliser la perte et la métrique
            self.log("val_loss", loss)
            self.log("val_accuracy", acc)
            return preds

        def configure_optimizers(self):
            """définit l’optimiseur du modèle"""
            return Adam(self.parameters(), lr=self.lr)

        def _get_preds_loss_accuracy(self, batch):
            """fonction utilitaire, car les étapes train/valid/test sont similaires"""
            x, y = batch
            logits = self(x)
            preds = torch.argmax(logits, dim=1)
            loss = self.loss(logits, y)
            acc = accuracy(preds, y)
            return preds, loss, acc
    ```
  </Tab>

  <Tab title="Logger Fabric">
    ```python theme={"system"}
    import lightning as L
    import torch
    import torchvision as tv
    from wandb.integration.lightning.fabric import WandbLogger
    import wandb

    fabric = L.Fabric(loggers=[wandb_logger])
    fabric.launch()

    model = tv.models.resnet18()
    optimizer = torch.optim.SGD(model.parameters(), lr=lr)
    model, optimizer = fabric.setup(model, optimizer)

    train_dataloader = fabric.setup_dataloaders(
        torch.utils.data.DataLoader(train_dataset, batch_size=batch_size)
    )

    model.train()
    for epoch in range(num_epochs):
        for batch in train_dataloader:
            optimizer.zero_grad()
            loss = model(batch)
            loss.backward()
            optimizer.step()
            fabric.log_dict({"loss": loss})
    ```
  </Tab>
</Tabs>

<h2 id="log-the-minmax-of-a-metric">
  Journaliser le min/max d'une métrique
</h2>

La fonction [`define_metric`](/fr/products/wandb/ref/python/experiments/run#define_metric) de Weights & Biases vous permet de choisir si votre métrique de synthèse Weights & Biases affiche la valeur minimale, maximale, moyenne ou la meilleure valeur de cette métrique. Si vous n'utilisez pas `define_metric`, c'est la dernière valeur journalisée qui apparaît dans vos métriques de synthèse. Pour plus d'informations, voir le [guide de personnalisation des axes de journalisation](/fr/products/wandb/track/log/customize-logging-axes).

Pour suivre la précision de validation maximale dans la métrique de synthèse Weights & Biases, appelez `wandb.define_metric()` une seule fois, au début de l'entraînement :

<Tabs>
  <Tab title="Logger PyTorch">
    ```python theme={"system"}
    class My_LitModule(LightningModule):
        ...

        def validation_step(self, batch, batch_idx):
            if trainer.global_step == 0:
                wandb.define_metric("val_accuracy", summary="max")

            preds, loss, acc = self._get_preds_loss_accuracy(batch)

            # Journaliser la perte et la métrique
            self.log("val_loss", loss)
            self.log("val_accuracy", acc)
            return preds
    ```
  </Tab>

  <Tab title="Logger Fabric">
    ```python theme={"system"}
    wandb.define_metric("val_accuracy", summary="max")
    fabric = L.Fabric(loggers=[wandb_logger])
    fabric.launch()
    fabric.log_dict({"val_accuracy": val_accuracy})
    ```
  </Tab>
</Tabs>

<h2 id="checkpoint-a-model">
  Créer des points de contrôle d’un modèle
</h2>

En enregistrant les points de contrôle sous forme d’artifacts W\&B, vous obtenez des fichiers de modèle versionnés que vous pouvez récupérer ultérieurement par run, par alias ou par version.

Pour enregistrer les points de contrôle du modèle en tant qu’[artifacts](/fr/products/wandb/artifacts) W\&B,
utilisez le callback Lightning [`ModelCheckpoint`](https://lightning.ai/docs/pytorch/stable/api/lightning.pytorch.callbacks.ModelCheckpoint.html) et définissez l’argument `log_model` dans le `WandbLogger`.

<Tabs>
  <Tab title="Logger PyTorch">
    ```python theme={"system"}
    trainer = Trainer(logger=wandb_logger, callbacks=[checkpoint_callback])
    ```
  </Tab>

  <Tab title="Logger Fabric">
    ```python theme={"system"}
    fabric = L.Fabric(loggers=[wandb_logger], callbacks=[checkpoint_callback])
    ```
  </Tab>
</Tabs>

Les alias `latest` et `best` sont définis automatiquement pour faciliter la récupération d’un point de contrôle de modèle à partir d’un artifact W\&B :

```python theme={"system"}
# la référence est disponible dans le panneau des artifacts
# <version> peut être une version (par exemple, « v2 ») ou un alias (« latest » ou « best »)
checkpoint_reference = "<user>/<project>/<model-run_id>:<version>"
```

<Tabs>
  <Tab title="Via le Logger">
    ```python theme={"system"}
    # télécharger le point de contrôle localement (s'il n'est pas déjà en cache)
    wandb_logger.download_artifact(checkpoint_reference, artifact_type="model")
    ```
  </Tab>

  <Tab title="Via wandb">
    ```python theme={"system"}
    # télécharger le point de contrôle localement (s'il n'est pas déjà en cache)
    run = wandb.init(project="MNIST")
    artifact = run.use_artifact(checkpoint_reference, type="model")
    artifact_dir = artifact.download()
    ```
  </Tab>
</Tabs>

<Tabs>
  <Tab title="Logger PyTorch">
    ```python theme={"system"}
    # charger le point de contrôle
    model = LitModule.load_from_checkpoint(Path(artifact_dir) / "model.ckpt")
    ```
  </Tab>

  <Tab title="Logger Fabric">
    ```python theme={"system"}
    # Récupérer le point de contrôle brut
    full_checkpoint = fabric.load(Path(artifact_dir) / "model.ckpt")

    model.load_state_dict(full_checkpoint["model"])
    optimizer.load_state_dict(full_checkpoint["optimizer"])
    ```
  </Tab>
</Tabs>

Les points de contrôle de modèle que vous journalisez sont consultables dans l’interface utilisateur de [W\&B Artifacts](/fr/products/wandb/artifacts) et incluent la traçabilité complète du modèle (voir un [exemple de point de contrôle de modèle dans l’interface utilisateur](https://forge.coreweave.com/wandb/wandb/arttest/artifacts/model/iv3_trained/5334ab69740f9dda4fed/lineage?_gl=1*yyql5q*_ga*MTQxOTYyNzExOS4xNjg0NDYyNzk1*_ga_JH1SJHJQXJ*MTY5MjMwNzI2Mi4yNjkuMS4xNjkyMzA5NjM2LjM3LjAuMA..)).

Pour mettre en favoris vos meilleurs points de contrôle de modèle et les centraliser à l’échelle de votre équipe, liez-les au [registre](/fr/products/registry).

Dans le registre, vous pouvez organiser vos meilleurs modèles par tâche, gérer leur cycle de vie, assurer leur suivi et leur audit tout au long du cycle de vie ML, et [automatiser](/fr/products/wandb/automations) des actions en aval à l’aide de webhooks ou de jobs.

<h2 id="log-images-text-and-more">
  Journaliser des images, du texte et plus encore
</h2>

Le `WandbLogger` dispose des méthodes `log_image`, `log_text` et `log_table` pour journaliser des médias.

Vous pouvez également appeler directement `wandb.log()` ou `trainer.logger.experiment.log()` pour journaliser d’autres types de médias, comme l’audio, les molécules, les nuages de points et les objets 3D.

<Tabs>
  <Tab title="Journaliser des images">
    ```python theme={"system"}
    # avec des tenseurs, des tableaux numpy ou des images PIL
    wandb_logger.log_image(key="samples", images=[img1, img2])

    # ajout de légendes
    wandb_logger.log_image(key="samples", images=[img1, img2], caption=["tree", "person"])

    # avec des chemins de fichiers
    wandb_logger.log_image(key="samples", images=["img_1.jpg", "img_2.jpg"])

    # avec .log dans le trainer
    trainer.logger.experiment.log(
        {"samples": [wandb.Image(img, caption=caption) for (img, caption) in my_images]},
        step=current_trainer_global_step,
    )
    ```
  </Tab>

  <Tab title="Journaliser du texte">
    ```python theme={"system"}
    # les données doivent être une liste de listes
    columns = ["input", "label", "prediction"]
    my_data = [["cheese", "english", "english"], ["fromage", "french", "spanish"]]

    # avec des colonnes et des données
    wandb_logger.log_text(key="my_samples", columns=columns, data=my_data)

    # avec un DataFrame pandas
    wandb_logger.log_text(key="my_samples", dataframe=my_dataframe)
    ```
  </Tab>

  <Tab title="Journaliser des tableaux">
    ```python theme={"system"}
    # journaliser une W&B Table contenant une légende textuelle, une image et de l’audio
    columns = ["caption", "image", "sound"]

    # les données doivent être une liste de listes
    my_data = [
        ["cheese", wandb.Image(img_1), wandb.Audio(snd_1)],
        ["wine", wandb.Image(img_2), wandb.Audio(snd_2)],
    ]

    # journaliser la Table
    wandb_logger.log_table(key="my_samples", columns=columns, data=my_data)
    ```
  </Tab>
</Tabs>

Utilisez le système de Callbacks de Lightning pour déterminer à quel moment journaliser dans Weights & Biases via le `WandbLogger`. L’exemple suivant journalise un échantillon d’images de validation et de prédictions :

```python theme={"system"}
import torch
import wandb
import lightning.pytorch as pl
from lightning.pytorch.loggers import WandbLogger

# ou
# from wandb.integration.lightning.fabric import WandbLogger


class LogPredictionSamplesCallback(Callback):
    def on_validation_batch_end(
        self, trainer, pl_module, outputs, batch, batch_idx, dataloader_idx
    ):
        """Called when the validation batch ends."""

        # `outputs` provient de `LightningModule.validation_step`
        # et correspond ici aux prédictions de notre modèle

        # Journaliser 20 exemples de prédictions d’images issus du premier lot
        if batch_idx == 0:
            n = 20
            x, y = batch
            images = [img for img in x[:n]]
            captions = [
                f"Ground Truth: {y_i} - Prediction: {y_pred}"
                for y_i, y_pred in zip(y[:n], outputs[:n])
            ]

            # Option 1 : journaliser les images avec `WandbLogger.log_image`
            wandb_logger.log_image(key="sample_images", images=images, caption=captions)

            # Option 2 : journaliser les images et les prédictions dans une W&B Table
            columns = ["image", "ground truth", "prediction"]
            data = [
                [wandb.Image(x_i), y_i, y_pred] or x_i,
                y_i,
                y_pred in list(zip(x[:n], y[:n], outputs[:n])),
            ]
            wandb_logger.log_table(key="sample_table", columns=columns, data=data)


trainer = pl.Trainer(callbacks=[LogPredictionSamplesCallback()])
```

<h2 id="use-multiple-gpus-with-lightning-and-weights-biases">
  Utiliser plusieurs GPU avec Lightning et Weights & Biases
</h2>

Lors d’un entraînement distribué, la manière dont vous référencez `wandb.run` d’un rank à l’autre peut déterminer si l’entraînement se poursuit ou aboutit à un interblocage. Cette section présente les exigences à respecter et propose un modèle recommandé.

PyTorch Lightning prend en charge le multi-GPU via son interface DDP. Toutefois, la conception de PyTorch Lightning vous oblige à être attentif à la manière dont vous instanciez vos GPU.

Lightning exige que chaque GPU (ou rank) de votre boucle d’entraînement soit instancié exactement de la même manière, avec les mêmes conditions initiales. Or, seul le processus de rank 0 a accès à l’objet `wandb.run`. Pour les processus de rank non nul, `wandb.run = None`, ce qui peut provoquer leur échec. Vous risquez alors un interblocage : le processus de rank 0 attend que les processus de rank non nul le rejoignent, alors que ceux-ci ont déjà planté.

C’est pourquoi vous devez être attentif à la manière dont vous configurez votre code d’entraînement. L’approche recommandée consiste à rendre votre code indépendant de l’objet `wandb.run`.

```python theme={"system"}
class MNISTClassifier(pl.LightningModule):
    def __init__(self):
        super(MNISTClassifier, self).__init__()

        self.model = nn.Sequential(
            nn.Flatten(),
            nn.Linear(28 * 28, 128),
            nn.ReLU(),
            nn.Linear(128, 10),
        )

        self.loss = nn.CrossEntropyLoss()

    def forward(self, x):
        return self.model(x)

    def training_step(self, batch, batch_idx):
        x, y = batch
        y_hat = self.forward(x)
        loss = self.loss(y_hat, y)

        self.log("train/loss", loss)
        return {"train_loss": loss}

    def validation_step(self, batch, batch_idx):
        x, y = batch
        y_hat = self.forward(x)
        loss = self.loss(y_hat, y)

        self.log("val/loss", loss)
        return {"val_loss": loss}

    def configure_optimizers(self):
        return torch.optim.Adam(self.parameters(), lr=0.001)


def main():
    # Initialiser toutes les graines aléatoires avec la même valeur.
    # C’est important dans un contexte d’entraînement distribué.
    # Chaque rank reçoit son propre ensemble de poids initiaux.
    # S’ils ne correspondent pas, les gradients ne correspondront pas non plus,
    # et l’entraînement risque de ne pas converger.
    pl.seed_everything(1)

    train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True, num_workers=4)
    val_loader = DataLoader(val_dataset, batch_size=64, shuffle=False, num_workers=4)

    model = MNISTClassifier()
    wandb_logger = WandbLogger(project="<project-name>")
    callbacks = [
        ModelCheckpoint(
            dirpath="checkpoints",
            every_n_train_steps=100,
        ),
    ]
    trainer = pl.Trainer(
        max_epochs=3, gpus=2, logger=wandb_logger, strategy="ddp", callbacks=callbacks
    )
    trainer.fit(model, train_loader, val_loader)
```

<h2 id="examples">
  Exemples
</h2>

Pour un guide pas à pas complet, suivez ce [tutoriel vidéo accompagné d’un notebook Colab](https://wandb.me/lit-colab).

<h2 id="frequently-asked-questions">
  Questions fréquentes
</h2>

<h3 id="how-does-weights-biases-integrate-with-lightning">
  Comment Weights & Biases s’intègre-t-il à Lightning ?
</h3>

L’intégration principale est basée sur l’[API `loggers` de Lightning](https://lightning.ai/docs/pytorch/stable/extensions/logging.html), qui vous permet d’écrire une grande partie de votre code de journalisation indépendamment du framework utilisé. Les instances de `Logger` sont transmises au [`Trainer` de Lightning](https://lightning.ai/docs/pytorch/stable/common/trainer.html) et sont déclenchées par le riche [système de hooks et de callbacks](https://lightning.ai/docs/pytorch/stable/extensions/callbacks.html) de cette API. Votre code de recherche reste ainsi bien séparé du code d’ingénierie et de journalisation.

<h3 id="what-does-the-integration-log-without-any-additional-code">
  Que journalise l’intégration sans code supplémentaire ?
</h3>

Weights & Biases enregistre les points de contrôle de votre modèle, que vous pouvez consulter ou télécharger pour les réutiliser dans de futurs runs. Weights & Biases capture également des [métriques système](/fr/products/wandb/ref/python/experiments/system-metrics), comme l’utilisation du GPU et les E/S réseau, ainsi que des informations sur l’environnement, comme le matériel et le système d’exploitation. Il capture l’[état du code](/fr/products/wandb/app/features/panels/code), notamment le commit Git et le patch de diff, le contenu du notebook et l’historique de session. Enfin, il capture tout ce qui est affiché sur la sortie standard.

<h3 id="what-if-i-need-to-use-wandbrun-in-my-training-setup">
  Que faire si je dois utiliser `wandb.run` dans ma configuration d’entraînement ?
</h3>

Vous devez étendre vous-même la portée de la variable à laquelle vous souhaitez accéder. Autrement dit, assurez-vous que les conditions initiales sont identiques dans tous les processus.

```python theme={"system"}
if os.environ.get("LOCAL_RANK", None) is None:
    os.environ["WANDB_DIR"] = wandb.run.dir
```

Si c’est le cas, vous pouvez utiliser `os.environ["WANDB_DIR"]` pour configurer le répertoire des points de contrôle du modèle. Ainsi, tout processus dont le rank est non nul peut accéder à `wandb.run.dir`.
