Vecteurs de tâches
This site replaces the former Compute Canada documentation site, and is now being managed by the Digital Research Alliance of Canada. Ce site remplace l'ancien site de documentation de Calcul Canada et est maintenant géré par l'Alliance de recherche numérique du Canada. |
Page enfant de Exécuter des tâches
Si vous avez plusieurs tâches dont un paramètre diffère, vous pouvez utiliser un vecteur de tâches (job array, array job, task array). La variable d’environnement $SLURM_ARRAY_TASK_ID
différencie chacune des tâches et l’ordonnanceur leur attribue une valeur différente. Les valeurs sont définies par le paramètre --array
.
Voyez la documentation de SchedMD.
Exemples du paramètre --array
sbatch --array=0-7 # $SLURM_ARRAY_TASK_ID takes values from 0 to 7 inclusive sbatch --array=1,3,5,7 # $SLURM_ARRAY_TASK_ID takes the listed values sbatch --array=1-7:2 # Step-size of 2, same as the previous example sbatch --array=1-100%10 # Allows no more than 10 of the jobs to run simultaneously
Exemple simple
#!/bin/bash
#SBATCH --array=1-10
#SBATCH --time=3:00:00
program_x <input.$SLURM_ARRAY_TASK_ID
program_y $SLURM_ARRAY_TASK_ID some_arg another_arg
Ce script crée 10 tâches indépendantes. Chacune a une durée maximum de 3 heures et chacune peut commencer à des moments différents sur des nœuds différents.
Le script utilise $SLURM_ARRAY_TASK_ID pour indiquer le fichier pour les données en entrée (program x) et utiliser en commande de ligne l'argument some_arg another_arg pour l'application (program y).
Le fait d’utiliser un vecteur de tâches plutôt que plusieurs tâches séquentielles est avantageux pour vous-même et pour les autres utilisateurs. Un vecteur de tâches en attente ne produit qu’une seule ligne dans squeue, ce qui vous permet de consulter son résultat plus facilement. De plus, l’ordonnanceur n’est pas appelé à analyser les besoins de chacune des tâches séparément, ce qui résulte en un gain de performance.
En excluant le recours à sbatch comme étape initiale, l’ordonnanceur subit la même charge avec un vecteur de tâches qu’avec un nombre équivalent de tâches soumises séparément. Il n’est pas recommandé d’utiliser un vecteur pour soumettre des tâches qui ont une durée de beaucoup moins d’une heure. Les tâches d’une durée de quelques minutes seulement devraient être groupées avec META, GLOST, GNU Parallel ou une boucle de l’interpréteur à l'intérieur d'une tâche.
Exemple avec des répertoires multiples
Supposons que vous voulez exécuter le même script dans des répertoires multiples ayant une structure identique;
- si les noms des répertoires peuvent être des nombres séquentiels, il serait facile d’adapter l’exemple présenté plus haut;
- autrement, créez un fichier avec les noms des répertoires comme suit
$ cat case_list pacific2016 pacific2017 atlantic2016 atlantic2017
Il y a plusieurs manières de sélectionner une ligne en particulier dans un fichier; dans le prochain exemple, nous utilisons sed
.
#!/bin/bash
#SBATCH --time=3:00:00
#SBATCH --array=1-4
echo "Starting task $SLURM_ARRAY_TASK_ID"
DIR=$(sed -n "${SLURM_ARRAY_TASK_ID}p" case_list)
cd $DIR
# Place the code to execute here
pwd
ls
ATTENTION
- Le nombre de tâches que vous demandez doit être égal au nombre de lignes du fichier.
- Le fichier
case_list
ne doit pas être modifié tant que toutes les tâches du vecteur ne sont pas exécutées puisque le fichier sera lu au commencement de chaque nouvelle tâche.