Table des matières
Jean Zay : exécution interactive d'un code GPU
Connexion sur la frontale
L'accès à la frontale se fait par une connexion ssh
:
$ ssh login@jean-zay.idris.fr
Les ressources de ce nœud interactif sont partagées entre tous les utilisateurs connectés : l'interactif sur la frontale est donc réservé uniquement pour la compilation et la mise au point des scripts.
Attention : les nœuds frontaux de Jean Zay ne sont pas équipés de GPU. Ils ne peuvent donc pas être utilisés pour des exécutions nécessitant un ou plusieurs GPU.
Pour effectuer les exécutions interactives de vos codes GPU sur les nœuds de calcul convergés, vous devez utiliser :
- soit la commande
srun
:- pour obtenir un terminal sur un nœud de calcul GPU au sein duquel vous pourrez exécuter votre code,
- ou pour exécuter directement votre code sur la partition GPU.
- soit la commande
salloc
pour effectuer une réservation de ressources GPU permettant ensuite d'effectuer plusieurs exécutions.
Par contre, il est nécessaire de soumettre un travail batch pour les calculs demandant des ressources GPU importantes (en nombre de GPUs, mémoire ou temps Elapsed).
Obtention d'un terminal sur un nœud de calcul GPU
Il est possible d'ouvrir un terminal directement sur un nœud de calcul convergé sur lequel des ressources vous sont réservées (ici 1 GPU sur la partition GPU par défaut) en utilisant la commande suivante :
$ srun --pty --nodes=1 --ntasks-per-node=1 --cpus-per-task=10 --gres=gpu:1 --hint=nomultithread [--other-options] bash
Remarques :
- L’option
--pty
permet d'obtenir un terminal interactif. - 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 d'un nœud, vous aurez accès à 1/4 de sa mémoire. Sur la partition gpu par défaut, l'option
--cpus-per-task=10
permet ainsi de réserver 1/4 de la mémoire du nœud par GPU (1 tache par GPU). Sur la partitiongpu_p2
(--partition=gpu_p2
), il faut spécifier--cpus-per-task=3
pour réserver 1/8 de la mémoire du nœud par GPU. Sur la partitiongpu_p5
(-C a100
), il faut spécifier--cpus-per-task=8
pour réserver 1/8 de la mémoire du nœud par GPU. Sur la partitiongpu_p6
(-C h100
), il faut spécifier--cpus-per-task=24
pour réserver 1/4 de la mémoire du nœud par GPU. Ainsi vous serez cohérent avec la configuration des nœuds utilisés et éviterez une surfacturation d'heures. Vous pouvez consulter notre documentation à ce sujet : Allocation mémoire sur les partitions GPU. --other-options
peut contenir toutes les options Slurm usuelles de configuration des travaux (--time=
, etc ) : voir la documentation sur les scripts batch de soumission dans la rubrique Exécution/Contrôle d'un code GPU.- Les réservations ont toutes 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 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.
Le terminal est opérationnel après validation de l'allocation :
$ srun --pty --nodes=1 --ntasks-per-node=1 --cpus-per-task=10 --gres=gpu:1 --hint=nomultithread bash srun: job 1369723 queued and waiting for resources srun: job 1369723 has been allocated resources bash-4.2$ hostname r6i3n6 bash-4.2$ nvidia-smi Fri Apr 10 19:09:08 2020 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 430.14 Driver Version: 430.14 CUDA Version: 10.2 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla V100-SXM2... On | 00000000:1C:00.0 Off | 0 | | N/A 44C P0 45W / 300W | 0MiB / 32510MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
Vous pouvez vérifier que votre travail interactif a bien démarré grâce à la commande squeue
, et obtenir des informations complètes sur l'état du job avec la commande scontrol show job <identifiant du travail>
.
Une fois le terminal opérationnel, vous pouvez lancer vos exécutables de la manière habituelle ./votre_executable
.
Attention : MPI n'est actuellement pas utilisable dans cette configuration.
Pour quitter le mode interactif, utilisez la commande exit
:
bash-4.2$ exit
Attention : si vous ne quittez pas le mode interactif vous-même, la durée d'allocation maximale (par défaut ou spécifiée avec l'option --time
) est appliquée et autant d'heures de calcul sont décomptées sur le projet que vous avez spécifié.
Exécution interactive sur la partition GPU
Si vous n'avez pas besoin d'ouvrir un terminal sur un nœud de calcul, il est également possible de démarrer directement depuis la frontale l'exécution interactive d'un code sur les nœuds de calcul convergé en utilisant la commande suivante (ici avec 4 GPU sur la partition gpu par défaut) :
$ srun --nodes=1 --ntasks-per-node=4 --cpus-per-task=10 --gres=gpu:4 --hint=nomultithread [--other-options] ./mon_executable
Remarques :
- 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 d'un nœud, vous aurez accès à 1/4 de sa mémoire. Sur la partition gpu par défaut, l'option
--cpus-per-task=10
permet ainsi de réserver 1/4 de la mémoire du nœud par GPU (1 tache par GPU). Sur la partitiongpu_p2
(--partition=gpu_p2
), il faut spécifier--cpus-per-task=3
pour réserver 1/8 de la mémoire du nœud par GPU. Sur la partitiongpu_p5
(-C a100
), il faut spécifier--cpus-per-task=8
pour réserver 1/8 de la mémoire du nœud par GPU. Sur la partitiongpu_p6
(-C h100
), il faut spécifier--cpus-per-task=24
pour réserver 1/4 de la mémoire du nœud par GPU. Ainsi vous serez cohérent avec la configuration des nœuds utilisés et éviterez une surfacturation d'heures. Vous pouvez consulter notre documentation à ce sujet : Allocation mémoire sur les partitions GPU. --other-options
peut contenir toutes les options Slurm usuelles de configuration des travaux (--time=
, etc ) : voir la documentation sur les scripts batch de soumission dans la rubrique Exécution/Contrôle d'un code GPU.- Les réservations ont toutes 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 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.
Réservation de ressources réutilisables pour plusieurs exécutions interactives
Chaque exécution interactive démarrée comme décrit dans la section précédente correspond à un travail différent. Comme tous les travaux, ils sont susceptibles d'être placés en attente pendant un temps plus ou moins long si les ressources de calcul ne sont pas disponibles.
Si vous souhaitez enchaîner plusieurs exécutions interactives, il peut être pertinent de préalablement réserver des ressources qui pourront être réutilisées pour plusieurs exécutions. Vous devrez alors attendre que les ressources soient disponibles une seule fois au moment de la réservation et non pour chaque exécution.
La réservation des ressources (ici pour 4 GPU sur la partition gpu par défaut) se fait via la commande suivante :
$ salloc --nodes=1 --ntasks-per-node=4 --cpus-per-task=10 --gres=gpu:4 --hint=nomultithread [--other-options]
Remarques :
- 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 d'un nœud, vous aurez accès à 1/4 de sa mémoire. Sur la partition gpu par défaut, l'option
--cpus-per-task=10
permet ainsi de réserver 1/4 de la mémoire du nœud par GPU (1 tache par GPU). Sur la partitiongpu_p2
(--partition=gpu_p2
), il faut spécifier--cpus-per-task=3
pour réserver 1/8 de la mémoire du nœud par GPU. Sur la partitiongpu_p5
(-C a100
), il faut spécifier--cpus-per-task=8
pour réserver 1/8 de la mémoire du nœud par GPU. Sur la partitiongpu_p6
(-C h100
), il faut spécifier--cpus-per-task=24
pour réserver 1/4 de la mémoire du nœud par GPU. Ainsi vous serez cohérent avec la configuration des nœuds utilisés et éviterez une surfacturation d'heures. Vous pouvez consulter notre documentation à ce sujet : Allocation mémoire sur les partitions GPU. --other-options
peut contenir toutes les options Slurm usuelles de configuration des travaux (--time=
, etc ) : voir la documentation sur les scripts batch de soumission dans la rubrique Exécution/Contrôle d'un code GPU.- Les réservations ont toutes 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 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.
La réservation devient utilisable après validation de l'allocation :
$ salloc --nodes=1 --ntasks-per-node=4 --cpus-per-task=10 --gres=gpu:4 --hint=nomultithread [--other-options] salloc: Pending job allocation 1369712 salloc: job 1369712 queued and waiting for resources salloc: job 1369712 has been allocated resources salloc: Granted job allocation 1369712
Vous pouvez vérifier que votre réservation est bien active grâce à la commande squeue
, et obtenir des informations complètes sur l'état du job avec la commande scontrol show job <identifiant du travail>
.
Vous pouvez alors démarrer des exécutions interactives en utilisant la commande srun
:
$ srun [--other-options] ./code
Remarque : Si vous ne précisez aucune option pour la commande srun
, les options utilisées pour le salloc
(par exemple le nombre de tâches) seront utilisées par défaut.
Attention :
- Après avoir réservé des ressources avec
salloc
, vous êtes toujours connecté sur la frontale (vous pouvez le vérifier en utilisant la commandehostname
). Il est impératif d'utiliser la commandesrun
pour que vos exécutions utilisent les ressources réservées. - Si vous oubliez de libérer la réservation, la durée d'allocation maximale (par défaut ou spécifiée avec l'option
--time
) est appliquée et autant d'heures de calcul sont décomptées sur le projet que vous avez spécifié. Il est donc nécessaire de le faire explicitement :
$ exit exit salloc: Relinquishing job allocation 1369712