Skip to main content

Utilisation avancée

(Non-)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

Avec cette option Slurm enverra le signal SIGUSR1 au shell, TIME secondes (entre 0 et 65535) avant la fin du walltime.

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, l'option --dependency peut vous 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.

Pour soumettre des chaînes de jobs plus complexes, consultez --dependency ou le manuel:

man sbatch