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 :

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. Sur la partition gpu_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, et ainsi être cohérent avec la configuration du nœud. 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. Sur la partition gpu_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, et ainsi être cohérent avec la configuration du nœud. 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. Sur la partition gpu_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, et ainsi être cohérent avec la configuration du nœud. 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 :

$ --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 commande hostname). Il est impératif d'utiliser la commande srun 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