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

# PyTorch Lightning

> Utilisez W&B avec PyTorch Lightning grâce au WandbLogger intégré pour le suivi des expériences et l’enregistrement de 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>
    Essayer sur Colab
  </a>;

{/* <ColabLink url="https://colab.research.google.com/github/wandb/examples/blob/master/colabs/pytorch-lightning/Optimize_PyTorch_Lightning_models_with_Weights_%26_Biases.ipynb" /> */}

PyTorch Lightning fournit un wrapper léger pour organiser votre code PyTorch et ajouter facilement des fonctionnalités avancées telles que l’entraînement distribué et la précision en 16 bits. W\&B fournit un wrapper léger pour consigner vos expériences de ML. Mais vous n’avez pas besoin de combiner les deux vous-même : W\&B est directement intégré à la bibliothèque PyTorch Lightning via le [`WandbLogger`](https://lightning.ai/docs/pytorch/stable/api/lightning.pytorch.loggers.wandb.html#module-lightning.pytorch.loggers.wandb).

<div id="integrate-with-lightning">
  ## Intégrer Lightning
</div>

<Tabs>
  <Tab title="Logger PyTorch">
    ```python theme={null}
    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` envoie les journaux vers W\&B en utilisant le `global_step` du Trainer. Si vous effectuez des appels supplémentaires à `wandb.log()` directement dans votre code, **n'utilisez pas** l'argument `step` dans `wandb.log()`.

      À la place, journalisez le `global_step` du Trainer comme vos autres métriques :

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

  <Tab title="Logger Fabric">
    ```python theme={null}
    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/wb-21fd5541/mVjDwbx0mC8gYx-b/images/integrations/n6P7K4M.gif?s=7d3d0917631ff3ad6467018fc770f984" alt="Tableaux de bord interactifs" width="1920" height="1080" data-path="images/integrations/n6P7K4M.gif" />
</Frame>

```
```

<div id="sign-up-and-create-an-api-key">
  ### Inscrivez-vous et créez une clé API
</div>

Une clé API permet d’authentifier votre machine auprès de W\&B. Vous pouvez générer une clé API depuis votre profil.

<Note>
  Pour une méthode plus directe, accédez aux [Paramètres utilisateur](https://wandb.ai/settings) et créez une clé API. Copiez immédiatement la clé API et conservez-la dans un endroit sûr, par exemple dans un gestionnaire de mots de passe.
</Note>

1. Cliquez sur l’icône de votre profil en haut à droite.
2. Sélectionnez **Paramètres utilisateur**, puis faites défiler jusqu’à la section **Clés API**.

<div id="install-the-wandb-library-and-log-in">
  ### Installez la bibliothèque `wandb` et connectez-vous
</div>

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

<Tabs>
  <Tab title="Ligne de commande">
    1. Définissez la [variable d'environnement](/fr/models/track/environment-variables/) `WANDB_API_KEY` sur votre clé API.

       ```bash theme={null}
       export WANDB_API_KEY=<your_api_key>
       ```

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

       ```shell theme={null}
       pip install wandb

       wandb login
       ```
  </Tab>

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

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

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

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

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

PyTorch Lightning propose plusieurs classes `WandbLogger` pour consigner des métriques, ainsi que les poids du modèle, des médias, et bien plus encore.

* [`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’utiliser avec Lightning, instanciez `WandbLogger`, puis transmettez-le à `Trainer` ou à `Fabric` de Lightning.

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

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

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

Vous trouverez ci-dessous quelques-uns des paramètres les plus utilisés dans `WandbLogger`. Consultez la documentation de PyTorch Lightning pour en savoir plus sur tous les arguments du logger.

* [`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 dans quel projet wandb journaliser                                                          |
| `name`      | Donne un nom à votre run wandb                                                                      |
| `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 où les données sont enregistrées                                                             |

<div id="log-your-hyperparameters">
  ## Journalisez vos hyperparamètres
</div>

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

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

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

```python theme={null}
# 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()
```

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

Vous pouvez passer l’objet de votre modèle à `wandblogger.watch()` pour surveiller les gradients et les paramètres de votre modèle pendant l’entraînement. Voir la documentation de `WandbLogger` pour PyTorch Lightning

<div id="log-metrics">
  ## Journaliser des métriques
</div>

<Tabs>
  <Tab title="Logger PyTorch">
    Vous pouvez journaliser vos métriques dans W\&B lorsque vous utilisez `WandbLogger` en appelant `self.log('my_metric_name', metric_vale)` dans votre `LightningModule`, par exemple dans les méthodes `training_step` ou `validation_step`.

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

    ```python theme={null}
    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 ont la 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, de l’entrée à la sortie"""

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

            # effectuons 3 x (linear + 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 journaliser 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 d’entraînement, de validation et de 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="Fabric Logger">
    ```python theme={null}
    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>

```
```

<div id="log-the-minmax-of-a-metric">
  ## Journaliser les valeurs min/max d’une métrique
</div>

Avec la fonction [`define_metric`](/fr/models/ref/python/experiments/run#define_metric) de wandb, vous pouvez définir si vous souhaitez que votre métrique de synthèse W\&B affiche la valeur minimale, maximale, moyenne ou la meilleure valeur pour cette métrique. Si `define`\_`metric` \_ n’est pas utilisé, la dernière valeur journalisée apparaîtra dans vos métriques de synthèse. Voir la [documentation de référence de `define_metric` ici](/fr/models/ref/python/experiments/run#define_metric) et le [guide ici](/fr/models/track/log/customize-logging-axes/) pour en savoir plus.

Pour indiquer à W\&B de suivre la précision de validation maximale dans la métrique de synthèse W\&B, appelez `wandb.define_metric()` une seule fois, au début de l’entraînement :

<Tabs>
  <Tab title="Logger PyTorch">
    ```python theme={null}
    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={null}
    wandb.define_metric("val_accuracy", summary="max")
    fabric = L.Fabric(loggers=[wandb_logger])
    fabric.launch()
    fabric.log_dict({"val_accuracy": val_accuracy})
    ```
  </Tab>
</Tabs>

<div id="checkpoint-a-model">
  ## Créer un point de contrôle d’un modèle
</div>

Pour enregistrer des points de contrôle du modèle en tant qu’Artifacts W\&B [Artifacts](/fr/models/artifacts/),
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 `WandbLogger`.

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

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

Les alias *latest* et *best* sont automatiquement définis pour vous permettre de récupérer facilement un point de contrôle du modèle depuis un [Artifact](/fr/models/artifacts/) W\&B :

```python theme={null}
# la référence peut être récupérée dans le panneau des artifacts
# "VERSION" peut être une version (ex : "v2") ou un alias ("latest" ou "best")
checkpoint_reference = "USER/PROJECT/MODEL-RUN_ID:VERSION"
```

<Tabs>
  <Tab title="Via Logger">
    ```python theme={null}
    # télécharger le point de contrôle en local (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={null}
    # télécharger le point de contrôle en local (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={null}
    # charger le point de contrôle
    model = LitModule.load_from_checkpoint(Path(artifact_dir) / "model.ckpt")
    ```
  </Tab>

  <Tab title="Logger Fabric">
    ```python theme={null}
    # 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 visibles dans l'UI [W\&B Artifacts](/fr/models/artifacts/) et incluent la traçabilité complète du modèle (voir un exemple de point de contrôle de modèle dans l'UI [ici](https://wandb.ai/wandb/arttest/artifacts/model/iv3_trained/5334ab69740f9dda4fed/lineage?_gl=1*yyql5q*_ga*MTQxOTYyNzExOS4xNjg0NDYyNzk1*_ga_JH1SJHJQXJ*MTY5MjMwNzI2Mi4yNjkuMS4xNjkyMzA5NjM2LjM3LjAuMA..)).

Pour mettre vos meilleurs points de contrôle de modèle en favoris et les centraliser pour votre équipe, vous pouvez les lier au [registre de modèles W\&B](/fr/models).

Vous pouvez y organiser vos meilleurs modèles par tâche, gérer le cycle de vie des modèles, faciliter leur suivi et leur audit tout au long du cycle de vie du ML, et [automatiser](/fr/models/automations/) les actions en aval avec des webhooks ou des jobs.

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

Le `WandbLogger` fournit les méthodes `log_image`, `log_text` et `log_table` pour la journalisation de médias.

Vous pouvez aussi appeler directement `wandb.log()` ou `trainer.logger.experiment.log()` pour journaliser d'autres types de médias, comme Audio, des molécules, des nuages de points, des objets 3D, et bien plus encore.

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

    # ajouter des légendes

    wandb_logger.log_image(key="samples", images=[img1, img2], caption=["tree", "person"])

    # utiliser un chemin de fichier

    wandb_logger.log_image(key="samples", images=["img_1.jpg", "img_2.jpg"])

    # utiliser .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={null}
    # les données doivent être une liste de listes
    columns = ["input", "label", "prediction"]
    my_data = [["cheese", "english", "english"], ["fromage", "french", "spanish"]]

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

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

  <Tab title="Journaliser des tableaux">
    ```python theme={null}
    # journaliser un tableau W&B 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 le tableau

    wandb_logger.log_table(key="my_samples", columns=columns, data=data)

    ```
  </Tab>
</Tabs>

Vous pouvez utiliser le système de callbacks de Lightning pour contrôler quand vous journalisez vers W\&B via `WandbLogger` ; dans cet exemple, nous journalisons un échantillon de nos images de validation et de nos prédictions :

```python theme={null}
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`
        # ce qui correspond aux prédictions de notre modèle dans ce cas

        # Journalisons 20 exemples de prédictions d'images du premier batch
        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 sous forme de 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()])
```

<div id="use-multiple-gpus-with-lightning-and-wb">
  ## Utiliser plusieurs GPU avec Lightning et W\&B
</div>

PyTorch Lightning prend en charge le multi-GPU via son interface DDP. Cependant, la conception de PyTorch Lightning exige que vous fassiez attention à la façon dont vous instanciez vos GPU.

Lightning part du principe que chaque GPU (ou rang) dans votre boucle d’entraînement doit être instancié exactement de la même manière, avec les mêmes conditions initiales. Cependant, seul le processus de rang 0 a accès à l’objet `wandb.run`, et pour les processus de rang non nul : `wandb.run = None`. Cela peut faire échouer vos processus non nuls. Une telle situation peut vous placer dans un **interblocage**, car le processus de rang 0 attendra que les processus de rang non nul le rejoignent, alors qu’ils ont déjà planté.

Pour cette raison, faites attention à la façon dont vous configurez votre code d’entraînement. La méthode recommandée consiste à rendre votre code indépendant de l’objet `wandb.run`.

```python theme={null}
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():
    # Définir toutes les graines aléatoires sur la même valeur.
    # C'est important dans un contexte d'entraînement distribué.
    # Chaque rang obtiendra son propre ensemble de poids initiaux.
    # S'ils ne correspondent pas, les gradients ne correspondront pas non plus,
    # ce qui risque de mener à un entraînement qui ne converge pas.
    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)
```

<div id="examples">
  ## Exemples
</div>

Vous pouvez suivre ce tutoriel dans une [vidéo avec un notebook Colab](https://wandb.me/lit-colab).

<div id="frequently-asked-questions">
  ## Foire aux questions
</div>

<div id="how-does-wb-integrate-with-lightning">
  ### Comment W\&B s’intègre-t-il à Lightning ?
</div>

L’intégration principale s’appuie sur l’API [Lightning `loggers`](https://lightning.ai/docs/pytorch/stable/extensions/logging.html), qui vous permet d’écrire une grande partie de votre code de journalisation de manière indépendante du framework. Les `Logger` sont transmis au [Lightning `Trainer`](https://lightning.ai/docs/pytorch/stable/common/trainer.html) et sont déclenchés par le riche [système de hooks et de callbacks](https://lightning.ai/docs/pytorch/stable/extensions/callbacks.html) de cette API. Cela permet de bien séparer votre code de recherche du code d’ingénierie et de journalisation.

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

Nous enregistrerons les points de contrôle du modèle dans W\&B, où vous pourrez les consulter ou les télécharger pour les utiliser dans de futurs runs. Nous capturerons également les [métriques système](/fr/models/ref/python/experiments/system-metrics), comme l’utilisation du GPU et les entrées/sorties réseau, des informations sur l’environnement, comme les caractéristiques du matériel et du système d’exploitation, l’[état du code](/fr/models/app/features/panels/code/) (y compris le commit git et le patch diff, le contenu du notebook et l’historique de la session), ainsi que tout ce qui est affiché dans la sortie standard.

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

Vous devez vous-même élargir la portée de la variable à laquelle vous souhaitez accéder. En d’autres termes, veillez à ce que les conditions initiales soient identiques dans tous les processus.

```python theme={null}
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 de rang non nul peut accéder à `wandb.run.dir`.
