CI1 : Premiers pas
Utilisation de SLURM (∼20mn, – facile)
Nous allons accéder à des GPUs en utilisant un logiciel appelé SLURM. Slurm permet des ressources partagées sur plusieurs serveurs comme des GPUs ou des CPUs.
Écrivez un script affichant un simple message à l'écran à l'aide d'echo et soumettez le code. Où la sortie du programme a-t'elle été écrite ?
Création d'un environnement virtuel Python (∼20mn, – facile)
Dans cette section, vous apprendrez à créer un environnement virtuel à l'aide de Mamba et à installer PyTorch avec support CUDA.
Commencez par installer Miniforge en exécutant les commandes suivantes :
Répondez yes à toutes les questions demandant une réponse positive ou négative. Ensuite, déconnectez-vous de ssh et reconnectez-vous. Vous devriez maintenant pouvoir exécuter la commande mamba. Si ce n'est pas le cas, ajoutez dans le fichier ~/.bash_profile:
Créez un environnement virtuel en exécutant la commande suivante :
mamba create -n deeplearning python=3.10
Activez l'environnement nouvellement créé :
mamba activate deeplearning
Il faudra toujours utiliser cette commande pour pouvoir accéder à l'environnement virtuel.
Nous allons maintenant installer PyTorch en exécutant la commande :
pip install torch torchvision torchaudio tensorboard
Vérifiez que PyTorch est correctement installé en exécutant les commandes suivantes dans un terminal Python (après avoir demandé un GPU et activé l'environnement virtuel) :
Si la commande torch.cuda.is_available() retourne True, votre installation est prête à utiliser un GPU.
Exercices théorique (papier et crayon)
Dans cette section, vous allez consolider vos connaissances sur les concepts vus en cours, notamment le perceptron multicouche, la rétropropagation, la descente de gradient stochastique, les fonctions d'activation, et les fonctions de perte.
Dessinez un perceptron multicouche (MLP) avec :
- Une couche d'entrée avec 3 neurones
- Une couche cachée avec 4 neurones
- Une couche de sortie avec 2 neurones
La dérivée par rapport à y est -0.125.
La dérivée par rapport à z est 1.
- ReLU
- Sigmoid
- Tanh
Votre premier réseau de neurones
Dans cette section, vous allez implémenter un réseau de neurones simple en utilisant PyTorch et visualiser le processus d'entraînement avec TensorBoard.
Étape 1 : Préparation des données
Téléchargez et chargez le dataset CIFAR-10 :
import torch import torchvision from torchvision import transforms, datasets transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) # Normalisation ]) trainset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=32, shuffle=True) testset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform) testloader = torch.utils.data.DataLoader(testset, batch_size=32, shuffle=False)
Étape 2 : Implémentation du réseau
import torch.nn as nn import torch.nn.functional as F class MLP(nn.Module): def __init__(self): super(MLP, self).__init__() self.fc1 = nn.Linear(32*32*3, 128) # Couche cachée self.fc2 = nn.Linear(128, 10) # Couche de sortie
def forward(self, x): x = x.view(-1, 32*32*3) # Aplatir l'image x = F.relu(self.fc1(x)) # Activation ReLU x = self.fc2(x) # Sortie return x
Étape 3 : Entraînement du modèle
Configurez l’entraînement :
device = ( "cuda" if torch.cuda.is_available() else "cpu" ) print(f"Using {device} device") model = MLP().to(device) criterion = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # Entraînement for epoch in range(10): # 10 époques running_loss = 0.0 for inputs, labels in trainloader: inputs = inputs.to(device) labels = labels.to(device) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print(f"Époque {epoch+1}, Perte : {running_loss/len(trainloader)}")
Étape 4 : Évaluation sur l'ensemble de test
Après l'entraînement, évaluez le modèle sur l'ensemble de test :
model.eval() with torch.no_grad(): correct = 0 total = 0 for images, labels in testloader: images = images.to(device) labels = labels.to(device) outputs = model(images) _, predicted = torch.max(outputs, 1) total += labels.size(0) correct += (predicted == labels).sum().item() metric = correct / total print(f"Test metric: {metric:.2f}")
Étape 5 : Sauvegarde et chargement du modèle
Sauvegardez le modèle après l'entraînement :
torch.save(model.state_dict(), "mlp_model.pth")
Pour charger le modèle plus tard :
model.load_state_dict(torch.load("mlp_model.pth"))
Utilisation de Tensorboard
Dans cet exercice, vous allez imaginer un scénario où vous devez intégrer TensorBoard pour visualiser les métriques d'entraînement et d'évaluation d'un modèle de deep learning.
Un modèle est entraîné sur un ensemble de données pour prédire la classe d'images. Vous devez enregistrer les informations suivantes dans TensorBoard :
- La perte d'entraînement à chaque époque
- La perte de test à chaque époque
- L'exactitude (accuracy) sur l'ensemble de test
Exemple de code pour enregistrer les métriques :
from torch.utils.tensorboard import SummaryWriter writer = SummaryWriter("runs/mlp_experiment") # Exemple dans une boucle d'entraînement for epoch in range(num_epochs): ... writer.add_scalar("Loss/train", train_loss, epoch) writer.add_scalar("Loss/test", test_loss, epoch) writer.add_scalar("Accuracy/test", test_accuracy, epoch)
Ajoutez des exemples d'images mal classées à TensorBoard après chaque époque. Voici un exemple :
# Ajouter une image au tableau de bord TensorBoard from torchvision.utils import make_grid images = make_grid(images_mal_classees) # images_mal_classees contient des images incorrectement classées writer.add_image("Mauvaises classifications", images, epoch)
Ajoutez une visualisation des poids de la première couche du réseau :
# Exemple d'enregistrement des poids sous forme d'image weights = model.fc1.weight.data # Par exemple, les poids de la première couche fully-connected writer.add_histogram("Poids/Layer 1", weights, epoch)
Vous pouvez également enregistrer les hyperparamètres (par exemple, le taux d'apprentissage, la taille des batchs) et les résultats finaux pour suivre les performances de vos expériences :
# Exemple d'enregistrement des hyperparamètres et résultats finaux hyperparams = { "learning_rate": 0.001, "batch_size": 64, "num_epochs": num_epochs, } final_results = { "final_accuracy": test_accuracy, "final_loss": test_loss, } writer.add_hparams(hyperparams, final_results)
Assurez-vous de fermer le writer après l'entraînement :
writer.close()