> ## Documentation Index
> Fetch the complete documentation index at: https://wb-21fd5541-sdk-testing-latest.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Intégrez W&B à PyTorch Ignite pour journaliser automatiquement les métriques d'entraînement, les paramètres du modèle et les configurations de l'expérience.

# PyTorch Ignite

* Voir les visualisations obtenues dans ce [rapport W\&B d'exemple →](https://app.wandb.ai/example-team/pytorch-ignite-example/reports/PyTorch-Ignite-with-W%26B--Vmlldzo0NzkwMg)
* Essayez d'exécuter vous-même le code dans ce [notebook hébergé d'exemple →](https://colab.research.google.com/drive/15e-yGOvboTzXU4pe91Jg-Yr7sae3zBOJ#scrollTo=ztVifsYAmnRr)

Ignite prend en charge un gestionnaire W\&B qui permet de journaliser les métriques, les paramètres du modèle et de l'optimiseur, ainsi que les gradients, pendant l'entraînement et la validation. Il peut également être utilisé pour journaliser des points de contrôle du modèle dans le cloud W\&B. Cette classe encapsule également le module wandb. Cela signifie que vous pouvez appeler n'importe quelle fonction wandb à l'aide de ce wrapper. Voir des exemples montrant comment enregistrer les paramètres du modèle et les gradients.

<div id="basic-setup">
  ## Configuration de base
</div>

```python theme={null}
from argparse import ArgumentParser
import wandb
import torch
from torch import nn
from torch.optim import SGD
from torch.utils.data import DataLoader
import torch.nn.functional as F
from torchvision.transforms import Compose, ToTensor, Normalize
from torchvision.datasets import MNIST

from ignite.engine import Events, create_supervised_trainer, create_supervised_evaluator
from ignite.metrics import Accuracy, Loss

from tqdm import tqdm


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
        self.conv2_drop = nn.Dropout2d()
        self.fc1 = nn.Linear(320, 50)
        self.fc2 = nn.Linear(50, 10)

    def forward(self, x):
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
        x = x.view(-1, 320)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        return F.log_softmax(x, dim=-1)


def get_data_loaders(train_batch_size, val_batch_size):
    data_transform = Compose([ToTensor(), Normalize((0.1307,), (0.3081,))])

    train_loader = DataLoader(MNIST(download=True, root=".", transform=data_transform, train=True),
                              batch_size=train_batch_size, shuffle=True)

    val_loader = DataLoader(MNIST(download=False, root=".", transform=data_transform, train=False),
                            batch_size=val_batch_size, shuffle=False)
    return train_loader, val_loader
```

L’utilisation de `WandBLogger` dans ignite suit un processus modulaire. Commencez par créer un objet `WandBLogger`. Attachez-le ensuite à un trainer ou à un evaluator pour journaliser automatiquement les métriques. Cet exemple montre :

* La journalisation de la perte d’entraînement, attachée à l’objet trainer.
* La journalisation de la perte de validation, attachée à l’evaluator.
* La journalisation de paramètres facultatifs, comme le taux d’apprentissage.
* La surveillance du modèle.

```python theme={null}
from ignite.contrib.handlers.wandb_logger import *
def run(train_batch_size, val_batch_size, epochs, lr, momentum, log_interval):
    train_loader, val_loader = get_data_loaders(train_batch_size, val_batch_size)
    model = Net()
    device = 'cpu'

    if torch.cuda.is_available():
        device = 'cuda'

    optimizer = SGD(model.parameters(), lr=lr, momentum=momentum)
    trainer = create_supervised_trainer(model, optimizer, F.nll_loss, device=device)
    evaluator = create_supervised_evaluator(model,
                                            metrics={'accuracy': Accuracy(),
                                                     'nll': Loss(F.nll_loss)},
                                            device=device)

    desc = "ITERATION - loss: {:.2f}"
    pbar = tqdm(
        initial=0, leave=False, total=len(train_loader),
        desc=desc.format(0)
    )
    #Création de l'objet WandBLogger
    wandb_logger = WandBLogger(
    project="pytorch-ignite-integration",
    name="cnn-mnist",
    config={"max_epochs": epochs,"batch_size":train_batch_size},
    tags=["pytorch-ignite", "mninst"]
    )

    wandb_logger.attach_output_handler(
    trainer,
    event_name=Events.ITERATION_COMPLETED,
    tag="training",
    output_transform=lambda loss: {"loss": loss}
    )

    wandb_logger.attach_output_handler(
    evaluator,
    event_name=Events.EPOCH_COMPLETED,
    tag="training",
    metric_names=["nll", "accuracy"],
    global_step_transform=lambda *_: trainer.state.iteration,
    )

    wandb_logger.attach_opt_params_handler(
    trainer,
    event_name=Events.ITERATION_STARTED,
    optimizer=optimizer,
    param_name='lr'  # facultatif
    )

    wandb_logger.watch(model)
```

Vous pouvez utiliser ignite `EVENTS`, de manière facultative, pour journaliser directement les métriques dans le terminal

```python theme={null}
    @trainer.on(Events.ITERATION_COMPLETED(every=log_interval))
    def log_training_loss(engine):
        pbar.desc = desc.format(engine.state.output)
        pbar.update(log_interval)

    @trainer.on(Events.EPOCH_COMPLETED)
    def log_training_results(engine):
        pbar.refresh()
        evaluator.run(train_loader)
        metrics = evaluator.state.metrics
        avg_accuracy = metrics['accuracy']
        avg_nll = metrics['nll']
        tqdm.write(
            "Training Results - Epoch: {}  Avg accuracy: {:.2f} Avg loss: {:.2f}"
            .format(engine.state.epoch, avg_accuracy, avg_nll)
        )

    @trainer.on(Events.EPOCH_COMPLETED)
    def log_validation_results(engine):
        evaluator.run(val_loader)
        metrics = evaluator.state.metrics
        avg_accuracy = metrics['accuracy']
        avg_nll = metrics['nll']
        tqdm.write(
            "Validation Results - Epoch: {}  Avg accuracy: {:.2f} Avg loss: {:.2f}"
            .format(engine.state.epoch, avg_accuracy, avg_nll))

        pbar.n = pbar.last_print_n = 0

    trainer.run(train_loader, max_epochs=epochs)
    pbar.close()


if __name__ == "__main__":
    parser = ArgumentParser()
    parser.add_argument('--batch_size', type=int, default=64,
                        help='input batch size for training (default: 64)')
    parser.add_argument('--val_batch_size', type=int, default=1000,
                        help='input batch size for validation (default: 1000)')
    parser.add_argument('--epochs', type=int, default=10,
                        help='number of epochs to train (default: 10)')
    parser.add_argument('--lr', type=float, default=0.01,
                        help='learning rate (default: 0.01)')
    parser.add_argument('--momentum', type=float, default=0.5,
                        help='SGD momentum (default: 0.5)')
    parser.add_argument('--log_interval', type=int, default=10,
                        help='how many batches to wait before logging training status')

    args = parser.parse_args()
    run(args.batch_size, args.val_batch_size, args.epochs, args.lr, args.momentum, args.log_interval)
```

Ce code génère ces visualisations ::

<Frame>
  <img src="https://mintcdn.com/wb-21fd5541-sdk-testing-latest/5BwwFpNAnQO_33rW/images/integrations/pytorch-ignite-1.png?fit=max&auto=format&n=5BwwFpNAnQO_33rW&q=85&s=9df4ef5e4f456b304fd74c1e130ba2c7" alt="tableau de bord d'entraînement PyTorch Ignite" width="900" height="450" data-path="images/integrations/pytorch-ignite-1.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/wb-21fd5541-sdk-testing-latest/5BwwFpNAnQO_33rW/images/integrations/pytorch-ignite-2.png?fit=max&auto=format&n=5BwwFpNAnQO_33rW&q=85&s=d71093cde6ac42c24f4cc9a7f9566c5e" alt="performances de PyTorch Ignite" width="900" height="450" data-path="images/integrations/pytorch-ignite-2.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/wb-21fd5541-sdk-testing-latest/5BwwFpNAnQO_33rW/images/integrations/pytorch-ignite-3.png?fit=max&auto=format&n=5BwwFpNAnQO_33rW&q=85&s=538ba7ee438d08c4c2cc9aa15a66d612" alt="résultats de l'optimisation des hyperparamètres de PyTorch Ignite" width="900" height="450" data-path="images/integrations/pytorch-ignite-3.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/wb-21fd5541-sdk-testing-latest/5BwwFpNAnQO_33rW/images/integrations/pytorch-ignite-4.png?fit=max&auto=format&n=5BwwFpNAnQO_33rW&q=85&s=ee3add9865c74aef43a7bfe66e58d0aa" alt="tableau de bord de comparaison des modèles PyTorch Ignite" width="1664" height="855" data-path="images/integrations/pytorch-ignite-4.png" />
</Frame>

Consultez la [documentation Ignite](https://pytorch.org/ignite/contrib/handlers.html#module-ignite.contrib.handlers.wandb_logger) pour plus de détails.
