Exemple de batch Slurm

  1. Objet et contenu du batch
  2. Exécution du batch
  3. Explication des options SBATCH utilisées
  4. Explication des Jobs Steps
  5. Variables d'environnement
  6. Schéma d'exécution du Job

Le Batch définit les deux composantes d'un Job : les ressources demandées (définies en blocs de ressources appelés Tasks) et le script qui décrit les différents Job Steps. Les Job Steps sont déclarés via la commande "srun" et sont exécutés séquentiellement ou en parallèle. Ils créent une ou plusieurs Tasks (exécutées en parallèle) et gèrent la distribution des ressources allouées. Chaque Task (commande, programme, script...) dispose de son allocation comme bon lui semble (sous-processus, threads, combinaison des deux).

1. Objet et contenu du batch "encodage.sh" :

Objet : Encodage multithread de 3 fichiers vidéo en parallèle. L'encodage sera effectué en utilisant "ffmpeg" et l'option "-threads".


# Options SBATCH :
#SBATCH --job-name=TestJob               # Nom du Job
#SBATCH --ntasks=3                       # Nombre de Tasks : 3
#SBATCH --cpus-per-task=4                # Allocation de 4 CPU par Task
#SBATCH --partition=8CPUNodes            # Nom de la partition Slurm utilisée

#SBATCH --mail-type=ALL                  # Notification par mail des évènements concernant le job : début d’exécution, fin,…
#SBATCH --mail-user=bob@irit.fr

# Jobs Steps (étapes du Job) :

# Step 1 : Préparation
srun -n1 –N1 prep.sh

# Les 3 Steps suivants sont les 3 processus d'encodage ffmpeg exécutés en parallèle.
srun -n1 -N1 /logiciels/ffmpeg/ffmpeg -i video1.mp4 -threads $SLURM_CPUS_PER_TASK [...] video1.mkv &
srun -n1 -N1 /logiciels/ffmpeg/ffmpeg -i video2.mp4 -threads $SLURM_CPUS_PER_TASK [...] video2.mkv &
srun -n1 -N1 /logiciels/ffmpeg/ffmpeg -i video3.mp4 -threads $SLURM_CPUS_PER_TASK [...] video3.mkv &

wait      # Attendre la fin des processus "enfants" (Steps) avant de terminer le processus parent (Job).

2. Exécution du Batch "encodage.sh" :

Le batch est lancé via la commande "sbatch" :


[bob@co2-slurm-client ~]$ sbatch encodage.sh

3. Explication des options SBATCH utilisées :

Dans cet exemple, les options SBATCH définissent le nom du Job, la partition utilisée, le nombre de Tasks (--ntasks) et le nombre de CPUs par Task (--cpus-per-task ). L'allocation sera alors de 12 CPUs (3 Tasks de 4 CPUs en parallèle).

Le nombre de nœuds (--nodes) n'étant pas défini, il sera déterminé par Slurm. Ici, le Batch utilise la partition "8CPUNodes" constituée de nœuds possédant chacun 8 CPUs. L’allocation demandée étant de 12 CPUs, le nombre de nœuds utilisé sera implicitement de 2.

Note :

De manière générale, lorsque "--nodes" n'est pas définie, Slurm détermine automatiquement le nombre de nœuds nécessaires (en fonction de l'utilisation des nœuds, du nombre de CPUs-par-Nœuds/Tasks-par-Nœud/CPUs-par-Task/Tasks, etc.).

Si "--ntasks" n'est pas définie, une Task par nœud sera allouée.

A noter que le nombre de Tasks d'un Job peut être défini soit explicitement avec "--ntasks" ou implicitement en définissant "--nodes" et "--ntasks-per-node".

Si les options "--ntasks", "--nodes" et "--ntasks-per-node" sont toutes définies, "--ntasks-per-node" indiquera alors le nombre maximum de Tasks par noeud.

Pour plus d’informations sur les options SBATCH, voir la rubrique "Options SBATCH courantes"


4. Explication des Job Steps :

Le Batch définit des Job Steps en utilisant la commande "srun" (plus de détail sur cette commande à l’adresse : https://slurm.schedmd.com/srun.html).

Sans déclaration explicite de Job Step(s), une seule Task sera créée et les paramètres "--ntasks", "--nodes", "--nodelist"... seront ignorés.

Un Job Step accepte également un nombre de Tasks et le nombre de nœuds sur lesquels distribuer ces Tasks via les même options que "sbatch", respectivement "--ntasks" ("-n") et "--nodes" ("-N"). Si ces options ne sont pas définies pour un Job Step, les valeurs globales du Job seront utilisées (toutes les Tasks et tous les nœuds seront alloués au Step).

Note : Une Task ne peut être exécutée/distribuée sur plusieurs nœuds ; le nombre de Tasks doit donc toujours être supérieur ou égal au nombre de nœuds (dans le Batch comme dans un Step).

Comme toute commande de script, les Steps sont, sauf indication contraire, exécutés itérativement. Pour lancer des Steps en parallèle, il suffit d'exécuter chaque Step à paralléliser en "arrière plan".

A noter que cette parallélisation est réalisée par le SHELL ('&' en fin de ligne), qui exécute la commande "srun" dans un sous-processus (sub-shell) du Job, et non par Slurm.

Dans l'exemple, les 3 Steps d'encodage sont lancés en parallèle, chacun utilisant une Task, pour un total de 12 CPUs.

Ces 3 Steps sont écrits ici un par ligne par souci de clarté ; en pratique, pour paralléliser un grand nombre de steps, on pourra utiliser :


# Sources listées dans un tableau :
vids=('video1' 'video2' 'video3')
for v in "${vids[@]}"; do
     srun -n1 -N1 /logiciels/ffmpeg/ffmpeg [...] $v.mkv &
done

# Sources lues ligne par ligne depuis un fichier :
while read v; do
    srun -n1 -N1 /logiciels/ffmpeg/ffmpeg [...] $v.mkv &
done <"/path/to/vids"

Note : Lorsque des Steps sont exécutés en parallèle, il est impératif dans le script parent (Job), d'attendre la fin de l'exécution des processus enfants avec un "wait", faute de quoi ces derniers seront automatiquement interrompus (killed) une fois la fin du Batch atteinte.


5. Variables d'environnement Slurm :

Slurm exporte un certain nombre de variables d'environnement relatives au Cluster, à la configuration générale et aux paramètres effectifs du Job. Ces variables sont accessibles dans le script et ont des noms très similaires aux options Slurm ou SBATCH correspondantes et sont donc facilement identifiables.

Dans le cas de notre Job, le paramètre "-threads" passé à ffmpeg utilise la variable d'environnement "SLURM_CPUS_PER_TASK" (qui contient la valeur de l'option "--cpus-per-task" du Batch) plutôt qu'une valeur écrite 'en dur', ce qui permet de toujours utiliser un nombre de threads égal au nombre de CPUs d'une Task, quelle que soit la valeur déclarée dans le Batch, sans avoir à modifier le script.

Pour plus d’informations, voir la rubrique "Utilisation des variables d’environnement"


6. Schéma d'exécution du Job :

Job : TestJob