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:
1. Mauvaises méthodes
- exemple 1:
- exemple 2:
- 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:
ou bien insérer la directive #OAR --array 5 directement dans le script OAR comme dans
l’exemple ci-dessous:
- hello-openmp.c ( à compiler avec la commande gcc hello-openmp.c -fopenmp -o hello-openmp )
- hello-openmp.oar
Il s’agit d’un simple programme “hello world”, avec 2 threads:
2.2. tableaux de jobs
La syntaxe est la suivante:
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ées 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:
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)
…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:
- ex: #OAR -p nodemodel = ‘Dell_R640’ (i.e. chimay 23 à 28 )
(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:
- 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: