Vous trouverez sur cette page quelques utilisations "avancées" du cluster.
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'atteindre 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.