Aller au contenu principal

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.

  1. Créer un script de soumission :
multi_gpu_mpi_cuda-aware.slurm
#!/bin/bash
#SBATCH --job-name=multi_gpu_mpi_cuda-aware # nom du job
# Il est possible d'utiliser uniquement des GPU V100 16 Go ou 32 Go
##SBATCH -C v100-16g # decommenter pour reserver uniquement des GPU V100 16 Go
##SBATCH -C v100-32g # decommenter pour reserver uniquement des GPU V100 32 Go
# Ici, reservation de 2 noeuds avec 4 GPU par noeud et 10 CPU par tache :
#SBATCH --nodes=2 # nombre de noeuds
#SBATCH --ntasks-per-node=4 # nombre de taches par noeud (= nombre de GPU par noeud ici)
#SBATCH --gres=gpu:4 # nombre de GPU par noeud (max 4)
# Le nombre de CPU par tache doit etre adapte en fonction de la partition utilisee. Sachant
# qu'ici on reserve un GPU par tache (soit 1/4 des GPU du noeud), l'ideal est de reserver 1/4
# des CPU du noeud par tache :
#SBATCH --cpus-per-task=10 # nombre de CPU par tache (1/4 des CPU du noeud 4-GPU V100)
# /!\ Attention, "multithread" fait reference à l'hyperthreading dans la terminologie Slurm
#SBATCH --hint=nomultithread # hyperthreading desactive
#SBATCH --time=00:10:00 # temps maximum d'execution demande (HH:MM:SS)
#SBATCH --output=multi_gpu%j.out # nom du fichier de sortie (%j est remplacé par le numéro du travail)
#SBATCH --error=multi_gpu%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

# Le code doit etre compile avec les modules compatibles avec la partition choisie
# Execution du code
srun ./executable_multi_gpu_mpi_cuda-aware
  1. Soumettre ce script via la commande sbatch :
sbatch multi_gpu_mpi_cuda-aware.slurm

Remarques :

  • 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.
  • Nous vous recommandons de compiler et d'exécuter votre code dans un même environnement logiciel en chargeant les mêmes modules.
  • L'option --hint=nomultithread assure la réservation des cœurs physiques (pas d'hyperthreading).
  • La mémoire allouée pour le job est proportionnelle au nombre de cœurs CPU demandés. Par exemple, si vous demandez 1/4 des cœurs CPU physiques d'un nœud, vous aurez accès à 1/4 de sa mémoire RAM. Il est important d'être cohérent avec la configuration des nœuds utilisés pour éviter une surfacturation d'heures, tout en profitant de la mémoire à laquelle vous avez le droit. Vous pouvez consulter notre documentation à ce sujet : Allocation mémoire avec Slurm.
  • Dans ces exemples, 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 se situe au moment d'utiliser la commande sbatch : la variable $SLURM_SUBMIT_DIR est automatiquement valorisée par Slurm.
  • Le fichier de sortie du calcul se trouvera é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.
  • L'usage de la commande srun est indispensable lorsque vous demandez une exécution multi-tâches. Nous déconseillons l'usage de mpirun sur Jean Zay, seule srun garantit une distribution conforme aux spécifications de ressources demandées dans votre fichier de soumission.
  • Les travaux ont tous des ressources définies par une partition et une "Qualité de Service" QoS (Quality of Service) positionnées par défaut dans Slurm. Vous pouvez en modifier les limites en spécifiant une partition et/ou une QoS comme indiqué dans notre documentation détaillant les partitions et les Qos GPU.
  • 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 travail comme indiqué dans notre documentation détaillant la gestion des heures de calcul pour vous assurer que les heures consommées par vos travaux soient décomptées de la bonne attribution.