Jean Zay : exécution d'un travail multi GPU MPI CUDA-aware et GPUDirect en batch

Les travaux sont gérés sur l'ensemble des nœuds par le logiciel Slurm .

Pour soumettre un travail distribué multi GPU MPI CUDA-aware et GPUDirect en batch sur Jean Zay, il faut créer un script de soumission en vous inspirant des deux exemples donnés ci-dessous.

ATTENTION : il est nécessaire d'exécuter le code en utilisant la même bibliothèque OpenMPI CUDA-aware que celle que vous avez utilisée pour compiler votre code. De plus, l'utilisation de la fonctionnalité MPI CUDA-aware GPUDirect sur Jean Zay impose de respecter un ordre d'initialisation bien précis pour CUDA ou OpenACC et MPI dans le code. Veuillez vous référer à la page MPI CUDA-aware et GPUDirect.

  • Pour une exécution utilisant 3 GPU (sur un même nœud) de la partition gpu par défaut :

    multi_gpu_mpi_cuda-aware.slurm
    #!/bin/bash
    #SBATCH --job-name=multi_gpu_mpi_cuda-aware     # nom du job
    ##SBATCH --partition=gpu_p2          # de-commente pour la partition gpu_p2
    #SBATCH --nodes=1                    # nombre de noeud
    #SBATCH --ntasks-per-node=3          # nombre de tache MPI par noeud (= nombre de GPU par noeud)
    #SBATCH --gres=gpu:3                 # nombre de GPU par noeud (max 8 avec gpu_p2)
    #SBATCH --cpus-per-task=10           # nombre de coeurs CPU par tache (ici 1/4 du noeud par tache donc par GPU)
    ##SBATCH --cpus-per-task=3           # nombre de coeurs CPU par tache (pour gpu_p2 : 1/8 du noeud)
    # /!\ Attention, "multithread" fait reference a l'hyperthreading dans la terminologie Slurm
    #SBATCH --hint=nomultithread         # hyperthreading desactive
    #SBATCH --time=00:10:00              # temps d’execution maximum demande (HH:MM:SS)
    #SBATCH --output=multi_gpu_mpi%j.out # nom du fichier de sortie
    #SBATCH --error=multi_gpu_mpi%j.out  # nom du fichier d'erreur (ici commun avec la sortie)
     
    # nettoyage des modules charges en interactif et herites par defaut
    module purge
     
    # chargement des modules
    module load ...
     
    # echo des commandes lancees
    set -x
     
    # execution du code
    srun ./executable_multi_gpu_mpi_cuda-aware
  • Pour une exécution utilisant 8 GPU (soit 2 nœuds complets) sur la partition gpu par défaut :

    multi_gpu_mpi_cuda-aware.slurm
    #!/bin/bash
    #SBATCH --job-name=multi_gpu_mpi_cuda-aware     # nom du job
    ##SBATCH --partition=gpu_p2          # de-commente pour la partition gpu_p2
    #SBATCH --ntasks=8                   # nombre total de tache MPI
    #SBATCH --ntasks-per-node=4          # nombre de tache MPI par noeud (= nombre de GPU par noeud)
    #SBATCH --gres=gpu:4                 # nombre de GPU par noeud (max 8 avec gpu_p2)
    #SBATCH --cpus-per-task=10           # nombre de coeurs CPU par tache (un quart du noeud ici)
    ##SBATCH --cpus-per-task=3           # nombre de coeurs CPU par tache (pour gpu_p2 : 1/8 du noeud)
    # /!\ Attention, "multithread" fait reference a l'hyperthreading dans la terminologie Slurm
    #SBATCH --hint=nomultithread         # hyperthreading desactive
    #SBATCH --time=00:10:00              # temps d'execution maximum demande (HH:MM:SS)
    #SBATCH --output=multi_gpu_mpi%j.out # nom du fichier de sortie
    #SBATCH --error=multi_gpu_mpi%j.out  # nom du fichier d'erreur (ici commun avec la sortie)
     
    # nettoyage des modules charges en interactif et herites par defaut
    module purge
     
    # chargement des modules
    module load ...
     
    # echo des commandes lancees
    set -x
     
    # execution du code
    srun ./executable_multi_gpu_mpi_cuda-aware

Puis soumettre le script via la commande sbatch :

$ sbatch multi_gpu_mpi_cuda-aware.slurm

Remarques :

  • Une exécution sur la partition gpu_p2 se fait de manière analogue, en spécifiant --partition=gpu_p2 et --cpus-per-task=3.
  • Nous vous recommandons de compiler et d'exécuter votre code dans un même environnement en chargeant les mêmes modules.
  • Dans cet exemple, on suppose que l'exécutable executable_multi_gpu_mpi_cuda-aware se situe dans le répertoire de soumission, c'est-à-dire le répertoire dans lequel on entre la commande sbatch.
  • Le fichier de sortie du calcul multi_gpu_mpi<numero_job>.out se trouve également dans le répertoire de soumission. Il est créé dès le début de l'exécution du travail; l'éditer ou le modifier pendant le déroulement du travail peut perturber celui-ci.
  • Le module purge est rendu indispensable par le comportement par défaut de Slurm : les modules que vous avez chargés dans votre environnement au moment où vous lancez sbatch sont pris en compte dans le job soumis, rendant l'exécution de votre job dépendant de ce que vous aurez fait avant.
  • Pour éviter les erreurs de distribution automatique de tâches, nous vous recommandons d'utiliser srun pour exécuter votre code au lieu de mpirun, ce qui permet de garantir une distribution conforme aux spécifications de ressources demandées dans votre fichier de soumission.
  • Les jobs ont tous des ressources définies dans Slurm par une partition et une “Qualité de Service” QoS (Quality of Service) par défaut. Vous pouvez en modifier les limites en spécifiant une autre partition et/ou une QoS comme indiqué dans notre documentation détaillant les partitions et les Qos.
  • Pour les comptes multi-projets ainsi que ceux ayant des heures CPU et GPU, il est indispensable de spécifier l'attribution d'heures sur laquelle décompter les heures de calcul du job comme indiqué dans notre documentation détaillant la gestion des heures de calcul.
  • Nous vous recommandons fortement de consulter notre documentation détaillant la gestion des heures de calcul sur Jean Zay pour vous assurer que les heures consommées par vos travaux soient décomptées de la bonne attribution.
  • L'erreur CUDA failure: cuCtxGetDevice() renvoyée à l'exécution signifie probablement que vous n'avez pas respecté l'ordre d'initialisation CUDA ou OpenACC et MPI, comme indiqué dans la page MPI CUDA-aware et GPUDirect