Weights & Biaises sur Jean Zay

Avant-propos

Weights & Biaises fonctionne de paire avec son service cloud wandb.ai.
Si le code en lui même est open-source, son usage nécessite une licence (gratuite ou non).

L'IDRIS a déjà contacté l'entreprise pour avoir la possibilité d'une licence pour la plateforme sur Jean Zay.
Le prix de la licence (hébergeur) proposée étant très (très) élevée, il n'y aura pas d'hébergement de solution / serveur chez nous. L'usage de wandb.ai est donc obligatoire.

L'IDRIS recommande l'usage de MLFlow.
MLflow n'a pas de contrainte particulière et une instance peut être hébergée sur Jean Zay.
C'est une solution idéale si vous souhaitez conserver à l’abri vos données sensibles (vos données restent sur le supercalculateur). Vous pouvez lancer une instance pour visualiser vos logs depuis JupyterHub.

Présentation et Fonctionnalités

Weights & Biases (W&B ou wandb) est une plateforme collaborative conçue pour optimiser et suivre les projets de machine learning et d’intelligence artificielle. Elle fournit des outils puissants pour le suivi des expériences, la gestion des hyperparamètres, l’analyse des résultats et la collaboration entre équipes.

Grâce à W&B, les chercheurs, ingénieurs et data scientists peuvent :

  • Suivre facilement leurs expériences : enregistrez chaque run, métrique, et paramètre d'entraînement pour mieux comprendre les performances de vos modèles.
  • Visualiser les résultats en temps réel : générez des tableaux de bord interactifs pour analyser vos expériences et identifier les tendances.
  • Partager et collaborer : travaillez en équipe sur des projets complexes grâce à des rapports partagés et des intégrations avec des outils comme GitHub ou Slack.
  • Reproductibilité garantie : gardez un historique clair et organisé pour recréer vos résultats ou partager vos travaux avec d'autres.

Avec ses nombreuses intégrations (TensorFlow, PyTorch, Hugging Face, etc.) et son interface intuitive, Weights & Biases est un allié incontournable pour accélérer le développement de projets d’apprentissage machine et favoriser l’innovation.

Wandb sur Jean Zay

Création d'un compte W&B

Comme indiqué en avant-propos, il vous faut un compte W&B pour pouvoir faire la visualisation de vos logs. Vous pouvez vous incrire ici.

Lors de la création de votre compte vous devrez sélectionner une licence. Il en existe des différentes qui procurent différents niveaux de service. Celles qui nous intéressent (celles qui sont gratuites parce que la recherche n'a pas d'argent…) :

  • La licence “Free” est gratuite et relativement limitée : équipe de 5 personnes max et 5Go de stockage
  • La licence “Free W&B academic account” est aussi gratuite et offre plus de services : équipe de 10 personnes max, pas de limite du nombre d'équipes et 100Go de stockage. Il faudra en faire la demande une fois votre compte crée.

Dans tous les cas, n'oubliez pas d'indiquer votre statut d'académique (sauf si ce n'est pas le cas évidemment).

Par la suite vous devrez soit crée une “équipe” ou en rejoindre une déjà existante.

Sur la page de votre équipe, vous pourrez récupérer votre token d'accès qui vous permettra de vous connecter sur wandb.ai depuis Jean Zay.

Installation

Wandb est disponible dans la plupart de nos modules Pytorch (si il est absent n'hésitez pas à contacter le support).

Si le package est absent ou que vous souhaitez utiliser une version spécifique, vous pouvez l'installer localement sur votre compte :

pip install --no-cache-dir --user wandb

En cas d'installation local, il vous faudra aussi export le chemin du /bin dans votre $PATH :

export PATH=$PATH:$HOME/.local/bin
#export PATH=$PATH:$PYTHONUSERBASE/bin

Utilisation

Vous pouvez commencer par vous connecter sur W&B depuis Jean Zay avec votre token d'accès :

wandb login
#wandb: Logging into wandb.ai. (Learn how to deploy a W&B server locally: https://wandb.me/wandb-server)
#wandb: You can find your API key in your browser here: https://wandb.ai/authorize
#wandb: Paste an API key from your profile and hit enter, or press ctrl+c to quit: 9acc5adc39.... 
#wandb: Appending key for api.wandb.ai to your netrc file: $HOME/.netrc

Il existe des commandes wandb CLI pour gérer votre projet depuis le terminal :

Usage: wandb [OPTIONS] COMMAND [ARGS]...

Options:
  --version  Show the version and exit.
  --help     Show this message and exit.

Commands:
  agent         Run the W&B agent
  artifact      Commands for interacting with artifacts
  beta          Beta versions of wandb CLI commands.
  controller    Run the W&B local sweep controller
  disabled      Disable W&B.
  docker        Run your code in a docker container.
  docker-run    Wrap `docker run` and adds WANDB_API_KEY and WANDB_DOCKER...
  enabled       Enable W&B.
  init          Configure a directory with Weights & Biases
  job           Commands for managing and viewing W&B jobs
  launch        Launch or queue a W&B Job.
  launch-agent  Run a W&B launch agent.
  launch-sweep  Run a W&B launch sweep (Experimental).
  login         Login to Weights & Biases
  offline       Disable W&B sync
  online        Enable W&B sync
  pull          Pull files from Weights & Biases
  restore       Restore code, config and docker state for a run
  scheduler     Run a W&B launch sweep scheduler (Experimental)
  server        Commands for operating a local W&B server
  status        Show configuration settings
  sweep         Initialize a hyperparameter sweep.
  sync          Upload an offline training directory to W&B
  verify        Verify your local instance

Vous pouvez soit initialiser un projet avec la cli ou le faire en python depuis votre code d'apprentissage.

Pour notre tutoriel, on va faire les logs de ce toy problem:

train.py
import wandb
import random
 
# start a new wandb run to track this script
wandb.init(
    # set the wandb project where this run will be logged
    project="my-jean-zay-training",
 
    # set experiment name
    name="Llama-training",
    # Add your jobid in your experiment name is a good pratice
    # name="my-jean-zay-training"+str(os.environ["SLURM_JOBID"])
 
    # track hyperparameters and run metadata
    config={
    "learning_rate": 0.02,
    "architecture": "LLama5",
    "dataset": "CommonCorpus",
    "epochs": 10,
    }
 
    # You can set W&B offline mode inside you training script !
    #mode="offline",
)
 
# simulate training
epochs = 10
offset = random.random() / 5
for epoch in range(2, epochs):
    acc = 1 - 2 ** -epoch - random.random() / epoch - offset
    loss = 2 ** -epoch + random.random() / epoch + offset
 
    # log metrics to wandb
    wandb.log({"acc": acc, "loss": loss})
 
# Mark the run as finished
wandb.finish()

Attention : Contrairement à Tensorboard ou encore MLFlow, W&B a été conçu avec l'hypothèse d'un accès à internet du serveur de calcul qui réalise l'apprentissage.

Il s'avère que les noeuds de calcul de Jean Zay non pas d'accès à internet pour des raisons de sécurité mais aussi de bonnes pratiques (on ne veut pas avoir des ressources de calcul GPU/CPU inactivent parce que le réseau internet est trop lent).

Il faut mettre W&B en mode OFFLINE.
Si vous ne le faites pas, votre code va planter pour une erreur réseau après vous avoir consommé quelques heures de calcul.

# Depuis la CLI
wandb offline
# Ou avec une variable d'environnement
export WANDB_MODE=offline

Le mode offline, va venir écrire dans un dossier wandb/ vos logs d'apprentissage. Vous pouvez modifier ce comportement avec l'arguments 'dir' de wandb.init(). Par la suite, depuis la frontale, on enverra les logs et métadata sur le serveur W&B.

Nous allons lancer notre code exemple sur un noeud de calcul avec un script slurm :

run.slurm
#!/bin/bash
#SBATCH --job-name=Wandb
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --hint=nomultithread
#SBATCH --time=00:01:00
#SBATCH --output=log%j.out
#SBATCH --error=log%j.out
#SBATCH -A 
 
# on se place dans le repertoire de soumission
cd ${SLURM_SUBMIT_DIR}
 
# nettoyage des modules charges en interactif et herites par defaut
module purge
 
# chargement des modules
module load pytorch-gpu/py3/2.5.0
 
# activation du mode offline
export WANDB_MODE=offline
 
# execution
srun python train.py
sbatch run.slurm
#Submitted batch job 49185

Avec ce code exemple, les logs ressemblent à cela :

log49258.out
log49258.out 
Loading pytorch-gpu/py3/2.5.0
  Loading requirement: cuda/12.2.0 nccl/2.21.5-1-cuda cudnn/8.9.7.29-cuda
    gcc/10.1.0 openmpi/4.1.5-cuda intel-mkl/2020.4 magma/2.7.2-cuda sox/14.4.2
    hdf5/1.12.0-mpi-cuda libjpeg-turbo/2.1.3 ffmpeg/6.1.1 graphviz/2.49.0
    llvm/15.0.6
wandb: Using wandb-core as the SDK backend.  Please refer to https://wandb.me/wandb-core for more information.
wandb: Tracking run with wandb version 0.18.6
wandb: W&B syncing is set to `offline` in this directory.  
wandb: Run `wandb online` or set WANDB_MODE=online to enable cloud syncing.
wandb:
wandb: You can sync this run to the cloud by running:
wandb: wandb sync $WORK/exemple_wandb/wandb/offline-run-20250127_160933-88q14mmo
wandb: Find logs at: wandb/offline-run-20250127_160933-88q14mmo/logs

Notez que nos logs indiquent clairement que nous avons utilisé le mode offline. Ceux nous indiquent même la commande à réaliser (sympa) pour faire l'envoie / la synchronisation avec wandb.ai. andb.ai)

# depuis mon dossier de projet
wandb sync wandb/offline-run-20250127_160933-88q14mmo

Si vous avez exécuté plusieurs travaux, vous pouvez tout synchroniser en même temps :

wandb sync
#wandb: Number of runs to be synced: 2
#wandb:   wandb/offline-run-20250127_155830-02n127qe
#wandb:   wandb/offline-run-20250127_160933-88q14mmo
#wandb: NOTE: use wandb sync --sync-all to sync 2 unsynced runs from local directory.

Il ne vous reste plus qu'à profiter de la visualisation de vos logs sur votre espace de projet :