Exemple de Batch : Job Arrays

Pour traiter un grand nombre de fichiers, il n'est pas nécessaire de générer un batch par fichier (ou groupe de fichiers) à traiter; Slurm le gère via les Job Arrays. Ils permettent, dans un seul fichier Batch, de générer un grand nombre de jobs similaires et de paramétrer le nombre de jobs exécutés en parallèle (par exemple, traiter 10 000 fichiers par lot de 50 maximum simultanément).

Un Job Array est créé en ajoutant simplement l'option SBATCH "--array" (ou "-a"). L'option accepte une liste d'indices (ou un intervalle avec, optionnellement, un incrément), et le nombre maximum de Jobs à exécuter en parallèle. Sans ce maximum, Slurm exécutera, par défaut, autant de jobs que possible (selon les ressources disponibles). Pour limiter le nombre de jobs en parallèle, n'oubliez pas de spécifiez un maximum !

Le choix des indices utilisés dans l'array est libre (arbitraire et valeurs non nécessairement continues). L'important est de choisir des indices qui permettront d'identifier le Job et donc de sélectionner la/les ressource(s) à utiliser (fichier, ID de base de données, ...).

Slurm rend cet indice accessible dans le Batch par la variable d'environnement "SLURM_ARRAY_TASK_ID".

Usage :

#SBATCH --array=<start>-<end>[:<step>][%<maxParallel>]

Ou :

#SBATCH --array=<list>[%<maxParallel>]

Exemples d\'utilisation :

#SBATCH --array=0-15            # 15 jobs (indices de 0 à 15 inclus).
#SBATCH --array=10-16:2         # 4 jobs (indices : 10,12,14,16).
#SBATCH --array=2,3,5,7,11,13   # 6 jobs.
#SBATCH --array=1-10000%32      # 10 000 jobs, 32 jobs max en //

Documentation Slurm -- Job Arrays

Description du Job :

L'exemple ci-dessous utilise un Job Array pour encoder 5 000 vidéos par lot de 8 maximum en parallèle. Les indices choisis pour l'Array reflètent le nommage des fichiers à traiter (video-<index>.mp4).

Contenu du Batch (job.sh) :

# Options SBATCH :

#SBATCH --job-name=Encode-Batch    # Nom du Job
#SBATCH --cpus-per-task=4          # Allocation de 4 CPU par Task
#SBATCH --mail-type=END            # Notification par email de la
#SBATCH --mail-user=bob@irit.fr    # fin de l'exécution du job.
#SBATCH --array=1-5000%8           # 5000 Jobs, 8 max en parallèle

# Traitement

module purge              # delete all loaded module environments
module load ffmpeg/0.6.5  # load ffmpeg module version 0.6.5

ffmpeg -i video-$SLURM_ARRAY_TASK_ID.mp4 -threads
$SLURM_CPUS_PER_TASK [...] video-\$SLURM_ARRAY_TASK_ID.mkv

Remarques :

  • Chaque encodage (Task) utilisant 4 CPUs, le Job Array monopolisera au maximum 8x4 soit 32 CPUs simultanément.

  • Le fichier à encoder est déterminé en fonction de l'indice du Job Array.

Exécution du batch :

Le Batch est transmis à Slurm via la commande "sbatch" qui, sauf erreur ou refus, crée un Job et le place dans la file d'attente.

[bob@co2-slurm-client1 ~]$  sbatch job.sh