Use this file to discover all available pages before exploring further.
W&B Sandboxes est en préversion privée, accessible uniquement sur invitation. Pour demander à y accéder, contactez l’assistance ou votre AISE.
Dans ce tutoriel, vous allez entraîner un modèle PyTorch dans un environnement W&B Sandbox. Pour ce faire, vous allez démarrer un sandbox avec les variables d’environnement appropriées, installer les dépendances nécessaires et exécuter un script Python qui entraîne un réseau de neurones simple sur le jeu de données UCI Zoo.
Si ce n’est pas déjà fait, connectez-vous à W&B. Utilisez la commande CLI wandb login et suivez les instructions pour vous connecter à votre compte W&B :
wandb login
Voir la documentation de référence wandb login pour plus d’informations sur la manière dont W&B recherche les informations d’authentification.
Copiez le script d’entraînement et les dépendances
Développez la liste déroulante ci-dessous pour accéder au code requis pour ce tutoriel. Faites un copier-coller du code dans trois fichiers distincts, dans le même répertoire que ce tutoriel. Dans la section suivante, vous exécuterez un script qui lit ces fichiers et entraîne un modèle PyTorch dans un environnement W&B Sandbox.
Script d'entraînement du modèle PyTorch
Copiez-collez le code suivant dans un fichier nommé requirements.txt. Ce fichier contient les dépendances du script d’entraînement.
requirements.txt
torchpandasucimlreposcikit-learnpyyaml
Copiez-collez le code suivant dans un fichier YAML nommé hyperparameters.yaml. Ce fichier contient les hyperparamètres du script d’entraînement.
Copiez-collez le code suivant dans un fichier nommé train.py. Ce script entraîne un modèle PyTorch simple sur le jeu de données UCI Zoo et enregistre le modèle entraîné dans un fichier nommé zoo_wandb.pth.
train.py
import argparseimport torchfrom torch import nnimport yamlimport pandas as pdfrom ucimlrepo import fetch_ucirepofrom sklearn.model_selection import train_test_splitclass NeuralNetwork(nn.Module): def __init__(self): super().__init__() self.linear_stack = nn.Sequential( nn.Linear(in_features=16 , out_features=16), nn.Sigmoid(), nn.Linear(in_features=16, out_features=7) ) def forward(self, x): logits = self.linear_stack(x) return logitsdef main(args): # Charger les hyperparamètres à partir du fichier de configuration fourni with open(args.config, 'r') as f: hyperparameter_config = yaml.safe_load(f) # récupérer le jeu de données zoo = fetch_ucirepo(id=111) # données (sous forme de dataframes pandas) X = zoo.data.features y = zoo.data.targets print("features: ", X.shape, "type: ", type(X)) print("labels: ", y.shape, "type: ", type(y)) ## Traiter les données # Le type de données doit correspondre à celui du modèle ; le dtype par défaut de nn.Linear est torch.float32 dataset = torch.tensor(X.values).type(torch.float32) # Convertir en tenseur et mettre en forme les labels de 0 à 6 pour l'indexation labels = torch.tensor(y.values) - 1 print("dataset: ", dataset.shape, "dtype: ",dataset.dtype) print("labels: ", labels.shape, "dtype: ",labels.dtype) torch.save(dataset, "zoo_dataset.pt") torch.save(labels, "zoo_labels.pt") # Décrire comment le jeu de données d'entraînement est divisé pour référence ultérieure et reproductibilité. config = { "random_state" : 42, "test_size" : 0.25, "shuffle" : True } # Diviser le jeu de données en ensemble d'entraînement et ensemble de test X_train, X_test, y_train, y_test = train_test_split( dataset,labels, random_state=config["random_state"], test_size=config["test_size"], shuffle=config["shuffle"] ) # Enregistrer les fichiers localement torch.save(X_train, "zoo_dataset_X_train.pt") torch.save(y_train, "zoo_labels_y_train.pt") torch.save(X_test, "zoo_dataset_X_test.pt") torch.save(y_test, "zoo_labels_y_test.pt") ## Définir le modèle model = NeuralNetwork() loss_fn = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=hyperparameter_config["learning_rate"]) print(model) # Définir une valeur de perte initiale fictive pour la comparaison dans la boucle d'entraînement prev_best_loss = 1e10 # Boucle d'entraînement for e in range(hyperparameter_config["epochs"] + 1): pred = model(X_train) loss = loss_fn(pred, y_train.squeeze(1)) loss.backward() optimizer.step() optimizer.zero_grad() # Enregistrer un point de contrôle / le modèle si la perte s'améliore if (e % 100 == 0) and (loss <= prev_best_loss): print("epoch: ", e, "loss:", loss.item()) # Enregistrer la nouvelle meilleure perte prev_best_loss = loss print("Enregistrement du modèle...") PATH = 'zoo_wandb.pth' torch.save(model.state_dict(), PATH)if __name__ == "__main__": parser = argparse.ArgumentParser(description="Entraîner un réseau de neurones simple sur le jeu de données zoo.") parser.add_argument("--config", type=str, required=True, help="Chemin vers le fichier de configuration des hyperparamètres.") args = parser.parse_args() main(args)
Créer le sandbox et exécuter le script d’entraînement
L’extrait de code suivant montre comment créer un sandbox, y copier le script d’entraînement et les dépendances, exécuter le script d’entraînement, puis télécharger le fichier de modèle généré. La section suivante fournit une explication du code, ligne par ligne.Copiez-collez le code suivant dans un fichier Python et exécutez-le. Enregistrez-le dans le même répertoire que les fichiers train.py, requirements.txt et hyperparameters.yaml que vous avez créés à l’étape précédente.
train_in_sandbox.py
from pathlib import Pathfrom wandb.sandbox import Sandbox, NetworkOptions# Fichiers à monter dans le sandbox. Indiquez le chemin à l'intérieur du# sandbox et le contenu de chaque fichier sous forme d'octets dans un dictionnairemounted_files = [ {"mount_path": "train.py", "file_content": Path("train.py").read_bytes()}, {"mount_path": "requirements.txt", "file_content": Path("requirements.txt").read_bytes()}, ]print("Starting sandbox...")with Sandbox.run( mounted_files=mounted_files, container_image="python:3.13", network=NetworkOptions(egress_mode="internet"), max_lifetime_seconds=3600) as sandbox: sandbox.write_file("hyperparameters.yaml", Path("hyperparameters.yaml").read_bytes()).result() # Installer les dépendances print("Installing dependencies...") sandbox.exec(["pip", "install", "-r", "requirements.txt"], check=True).result() # Exécuter le script print("Running script...") result = sandbox.exec(["python", "train.py", "--config", "hyperparameters.yaml"]).result() print(result.stdout) print(result.stderr) print(f"Exit code: {result.returncode}") # Enregistrer le fichier de modèle généré localement print("Downloading zoo_wandb.pth...") model_data = sandbox.read_file("zoo_wandb.pth").result() Path("zoo_wandb.pth").write_bytes(model_data) print("Saved zoo_wandb.pth")
L’extrait de code précédent effectue les opérations suivantes :
(Lignes 6 à 9) Liste les fichiers à monter dans le sandbox : train.py et requirements.txt.
(Ligne 12) Démarre le sandbox. Le sandbox est configuré pour utiliser l’image de conteneur python:3.13, disposer d’un accès à Internet et avoir une durée de vie maximale de 3 600 secondes (1 heure).
(Ligne 18) Écrit le fichier hyperparameters.yaml dans le sandbox. Cela permet au script d’entraînement (train.py) d’accéder aux hyperparamètres lorsqu’il s’exécute.
(Ligne 22) Installe les dépendances. La commande pip install -r requirements.txt est exécutée dans le sandbox pour installer les dépendances nécessaires au script d’entraînement.
(Ligne 26) Exécute le script d’entraînement. La commande python train.py --config hyperparameters.yaml est exécutée dans le sandbox pour démarrer le processus d’entraînement. Le script entraîne un modèle PyTorch sur le jeu de données UCI Zoo et enregistre le modèle entraîné dans un fichier nommé zoo_wandb.pth.
(Lignes 27 à 29) Affiche la sortie et le code de sortie. Une fois l’exécution du script d’entraînement terminée, la sortie standard, la sortie d’erreur standard et le code de sortie sont affichés dans la console à des fins de débogage et de vérification.
(Lignes 33 à 34) Télécharge le fichier de modèle généré. Le fichier zoo_wandb.pth est lu depuis le sandbox à l’aide de la méthode read_file() et enregistré localement.