Les tableaux de jobs 

 

La bonne méthode pour lancer une campagne de tests constituée du même programme que l'on lance n fois est d'utiliser la fonctionnalité JOB ARRAY du gestionnaire de batch OAR . Une alternative est d'utiliser GNU Parallell. Pour commencer, voici ce qu'il ne faut pas faire:

  

Sommaire[Masquer]
 

1. Mauvaises méthodes

#!/bin/bash

#OAR -l ....
#OAR -n mauvaise_methode
....
PROG="/path/monprog.exe"
INPUT="/path/data/parametres.txt"
# exemple 1
for i in `cat $INPUT`; do
$PROG $INPUT
done

# exemple 2
for i in `cat $INPUT`; do
$PROG $INPUT &
done
wait

  • dans l'exemple 1, les tâches sont lancées séquentiellement: ce n'est pas l'idée recherchée...
  • dans l'exemple 2, les tâches sont effectivement lancées en parallèle d'un seul coup, mais il n'y a aucun contrôle sur le nombre de tâches lancées par cœurs: c'est très contre-performant dans la grande majorité des cas.

2. Tableaux de jobs, job array (OAR)

Il en exite deux types: simples et paramétriques.

2.1. tableaux de jobs «simples»

commande pour lancer 5 fois le même job: 

# oarsub --array 5 -S ./script.oar

 

ou bien insérer la directive #OAR --array 5 directement dans le script OAR comme dans l'exemple ci-dessous:  

 

# oarsub -S ./hello-openmp.oar
[ADMISSION RULE] Automatically redirect in the besteffort queue
[ADMISSION RULE] Automatically add the besteffort constraint on the resources
[ADMISSION RULE] Modify resource description with type constraints
Simple array job submission is used
OAR_JOB_ID=286210
OAR_JOB_ID=286211
OAR_JOB_ID=286212
OAR_JOB_ID=286213
OAR_JOB_ID=286214
OAR_ARRAY_ID=286210

Il s'agit d'un simple programme "hello world", avec 2 threads: 

# more hello.286212.stdout
OAR_ARRAY_ID: 286210
OAR_JOB_ID : 286210
OAR_NODE_FILE : orval02

Hello World from thread 1
Hello World from thread 0
...
OK

 

2.2. tableaux de jobs

 La syntaxe est la suivante: 

# oarsub ./script.oar --array-param-file fichier-de-parametre.txt

Le job est lancé autant de fois qu'il y a de ligne dans le fichier de paramètre.

exemple: calcul d'un approximation de pi par la méthode des trapèzes ( intégrale 4/(1+x^2) sur [0,1])

Les paramètres du fichier pi_input.txt correspondent simplement au nombre d'itérations passé au programme pi.exe. Comme précédemment (tableau de jobs simple) la directive  #OAR --array-param-file est incluse dans le script pi_array.oar:

# oarsub -S ./pi_array.oar

Remarques (syntaxe du fichier de paramètre):

  • une ligne commençant par un # est considérée comme un commentaire.
  • les multiples paramètres sont séparés par un espace et encadrés par des quotes: "arg1 arg2 arg3"
  • une ligne sans paramètres est indiquée par deux quotes accolées: ""

2.3. Bonnes pratiques (important!)

2.3.1. supprimer un tableau de jobs

En cas d'erreur, ne pas oublier l'option --array de la commande oardel  (pour supprimer tous les jobs)

# oardel --array 286210

...Faute de quoi, seul le premier job est supprimé ( et non le tableau entier ) : le OAR_ARRAY_ID a le même numéro que le 1er job lancé.

2.3.2. du bon usage des ressources et des queues

Quelque soit la méthode (tableaux simples ou paramétrés), ne pas oublier qu'il y a d'autres utilisateurs sur la plateforme et que l'arrivée massive de travaux  va créer un sursaut de charge.
Il peut être bien vu d'exclure un ou plusieurs nœuds en spécifiant un choix dans le script OAR:
 

  • ex1:  #OAR -p network_address = 'orval05' or network_address = 'orval04'
  • ex2:  #OAR -p nodemodel = 'Dell_R820'     (i.e. orval01, orval02 et orval08)
  • ex3:  #OAR -p nodemodel = 'Dell_R630' or  'host=orval06'   (i.e. orval 03,04,05 et 06)

(utiliser le formulaire de la page  https://www-calculco.univ-littoral.fr/outils_visu/monika pour filtrer les nœuds en fonction de leurs propriétés)

Queues besteffort & default:  La queue besteffort est à privilégier. À noter que dans le cas de la queue default, la politique de réservation reste valide: les jobs sont lancés massivement en parallèle dans un premier temps (si la place le permet), jusqu'à atteindre la limite autorisée pour un utilisateur (3000 heures.cœur  -avril 2021-), puis sont lancés dans un deuxième temps,  au fil de l'eau, au fur et à mesure que les ressources se libèrent, sans jamais dépasser la limite autorisée.

D’autres exemples de JOB ARRAY sont disponibles dans le dépôt git  tutoriaux_calculco , notamment Matlab, pour lequel il faut effectuer une légère adaptation aux scripts de lancement pour pouvoir passer un fichier de paramètres.

idempotent:   il est recommandé d'associer l'option idempotent avec besteffort. En effet,  si un job du tableau en besteffort (priorité nullle) est tué, il sera relancé automatiquement avec les mêmes paramètres dès que les ressources suffisantes seront libérées: l'achèvement du tableau est ainsi assuré.

3. GNU parallel

Disponible en package sur toutes les distributions Linux, c'est une alternative simple pour lancer des tableaux de jobs:

#!/bin/bash

#OAR -l /nodes=1/core=12
#OAR -n gnu-parallel
....
PROG="/path/monprog.exe"
INPUT="/path/data/parametres.txt"

parallel -j 12 -a $INPUT --colsep '\t' $PROG {1} {2} {3}

# le fichier $INPUT contient n lignes de 3 paramètres à passer à $PROG)
# le formattage du fichier $INPUT est ici 3 arguments séparés par une tabulation.
# cet exemple utilise qu'un thread par job ( -j 12 = 12 jobs simultanés, ce qui
# correspond aux ressources demandées OAR -l /nodes=1/core=12 )

GNU parallel permet de contrôler très finement le nombre de threads utilisés (et bien d'autres choses), en savoir plus: