Choisir la langue :

Utilisation avancée

Vous trouverez sur cette page quelques utilisations "avancées" du cluster HPC.

Resoumission automatique de job

Lors de la défaillance d'un nœud de calcul, les jobs calculant sur ce nœud sont automatiquement arrêtés puis resoumis par Slurm.
 

Si vous ne voulez pas que vos jobs soient automatiquement resoumis vous devez rajouter l'option suivante à votre fichier de soumission :

#SBATCH --no-requeue

 

Envoi et interception de signaux par un timer

Il est parfois nécessaire d'effectuer une action (sauvegarde, checkpoint, etc.) avant d'ateindre le timeout d'un job.
 

Pour cela, ajoutez la ligne #SBATCH --signal ... et la commande trap à votre fichier de soumission afin d'intercepter le signal qui sera envoyé par le timer :

#!/bin/bash                                                                                                               
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --time=01:00:00
#SBATCH --job-name=my_job
#SBATCH --mem=1G
#SBATCH --signal=B:SIGUSR1@120
 
trap "./my_end_command" SIGUSR1
./my_job_program

 

La syntaxe de l'option --signal est la suivante : --signal=B:SIGUSR1@TIME

  • B: (optionnel) signifie Before ; Cette option permet à slurm d'envoyer le signal N secondes avant la fin du walltime.
    Si vous ne spécifiez pas cette option, le signal sera envoyé N seconde après le début du job
  • SIGUSR1 est le nom du signal que nous utiliserons
  • TIME est le nombre de secondes attendu par le timer avant d'envoyer le signal ;
    Notez qu'il peut y avoir une incertitude de 60 secondes d'après la documentation de SLURM

La commande à exécuter à la réception du signal SIGUSR1 est définie par la commande trap "./my_end_command" SIGUSR1.
Cette commande doit être placée avant d'exécuter la commande principal du job (./my_job_program).
 

Par exemple :

#!/bin/bash                                                                                                               
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --time=00:02:00
#SBATCH --job-name=my_job
#SBATCH --mem=1G
#SBATCH --signal=B:SIGUSR1@10
 
trap "date > before-end-of-job-$SLURM_JOB_ID.txt" SIGUSR1
 
sleep 118
date > end-of-job-$SLURM_JOB_ID.txt

 

Dans cet exemple :

  • Le job a un walltime de 2 minutes
  • Le signal SIGUSR1 sera émis 10 secondes avant la fin
  • A réception du signal, la date sera enregistrée dans un fichier before-end-of-job-<jobid>.txt
  • Le déroulement normal du job est le suivant : on attend 1m58 (118 secondes) puis on enregistre la date dans un fichier end-of-job-<jobid>.txt

 

Dépendances et chaînage de jobs

Si vous souhaitez soumettre deux jobs qui se chaînent, par exemple job1 et job2 avec job2 qui attend la fin de job1 avant de s'éxécuter, il exsite une option dans SLURM pour vous y aider.
 

Tout d'abord, soumettez votre premier job à l'aide de la commande sbatch :

sbatch job1.slurm

 

Récupérez le job ID renvoyé par la commande sbatch (appelons-le jobid1) puis lancez votre seconde job avec l'option --dependency :

sbatch --dependency=afterany:jobid1 job2.slurm

Le mot clé afterany signifie que le second job doit se lancer qu'il y ait eu une erreur ou non sur le premier job.
 

Il existe d'autres possibilités avec l'option dependency que vous pouvez explorer dans le manuel :

man sbatch

Vous pouvez également répéter cette action plusieurs de fois d'affilé pour créer de plus longues chaînes.