Slurm, l'ordonnanceur de travaux

Cet article est une introduction à slurm, l'ordonnanceur de travaux (jobs) sur CALI. Vous trouverez les recettes pratiques pour commencer à travailler sur CALI :

  • comment soumettre un job
  • comment voir l'état de vos travaux

Avant-propos

Sur un cluster de calcul, vous ne travaillez pas comme sur votre PC personnel. Vous ne pouvez pas lancer un programme inter-actif qui utiliserait immédiatement les ressources du cluster.

Pour exécuter un programme, vous devez le soumettre à l’ordonnanceur (scheduler). Le logiciel utilisé comme ordonnanceur sur notre cluster est slurm. Il exécutera votre programme (job) en différé, quand les ressources (CPU, mémoire) nécessaires à votre travail seront disponibles “quelque part” dans le cluster, sur un des nœuds dédiés aux calculs.

Premier exemple pratique

Fichier batch et soumission

Nous créons un fichier texte mon_programme.batch (n'importe quel nom est admissible) :

#!/bin/bash

#SBATCH --partition=rapide
#SBATCH --ntasks=1
#SBATCH --mem-per-cpu=100
#SBATCH --time=00:30:00

./mon_programme

Ensuite, on indique à slurm que l'on veut lancer ce job :

sbatch mon_programme.batch

Et voilà, votre code mon_programme sera exécuté dès que le cluster aura des ressources disponibles ! Nous allons maintenant détailler le contenu du fichier batch et comment slurm travaille..

Explications

Le fichier texte mon_programme.sbatch est de type shell script.

Mais il possèdes des commentaires spéciaux, commençant par #SBATCH , placés en première partie du fichier. Ces directives destinées à slurm indiquent :

  • la partition voulue (plus de détails ci-après)
  • les ressources nécessaires : nombre de processus qui seront lancés, quantité de mémoire, nombre de CPU
  • le temps d’exécution maximum prévu

Dans notre exemple :

  • --partition=rapide sélectionne la partition nommée rapide
  • --ntasks=1 donne le nombre de processus qui sera exécuté dans le batch – En général, on met “1” pour un programme séquentiel ou multi-threadé, une valeur > 1 seulement pour les programmes MPI
  • --mem-per-cpu=100 donne la quantité de mémoire en Mo pour chaque CPU. Le job sera tué si la quantité consommée excède la valeur demandée :!:
  • --time=00:30:00 donne la durée maximale du job, au format JOUR-HH:MM:SS . Le job sera tué si la quantité consommée excède la valeur demandée :!:

Dans sa seconde partie, le fichier contient la ou les commandes à exécuter.

La commande sbatch permet de soumettre le fichier batch, autrement dit de créer un job slurm qui sera exécuté dès que les ressources demandées seront disponibles. sbatch a affiché le Job ID, un numéro unique associé au job soumis.

Toutes les directives (#SBATCH …) sont en pratique des options de la commande sbatch. Il est simplement plus facile de les inscrire dans le fichier batch que de les taper sur la ligne de commande.

Où est mon job ? Comment l'arrêter ?

Une fois votre job soumis, vous pouvez examiner la queue, c'est-à-dire la liste des travaux en attente ou en cours d'éxécution.

Pour voir tous les jobs dans la file :

squeue -l

Les job ont un état associé – Les 2 principaux sont :

  • PENDING : en attente
  • RUNNING : en cours d'exécution

Vous pouvez stopper un job en cours avec :

scancel <JOB_ID>

Pour plus d'informations, consultez le contenu de la rubrique dédiée à slurm

Où sont stockés les résultats du job ?

Slurm exécute le job depuis le dossier où vous étiez quand vous avez soumis le job.

Par défaut, les sorties standards et d'erreur (qui s'affichent sur le terminal) sont redirigées vers le fichier slurm-<JOB_ID>.out

Dépassement des ressources

Si votre job dépasse certaines quantités demandées (mémoire, temps d'exécution), il sera automatiquement tué par slurm.

Les partitions slurm

Un élément est primordial quand vous soumettez un job : la partition

  • c'est un groupe de nœuds de calcul du cluster, avec une priorité
  • des limites sont associées à chacune : temps maximal d'exécution, nombre de CPU utilisables (au total ou par utilisateur)
  • certaines sont pré-emptibles : un job en cours pourra être suspendu s'il faut libérer des ressources pour un autre, plus prioritaire :!:

Vous pourrez par la suite consulter la liste complète des partitions utilisables, ou la page utilisation des noeuds GPU. Nous présentons ci-après les choix les plus usuels.

Travaux de très courte durée

Utilisez partition=rapide

  • pour les travaux très courts (< 1 heure) : mise au point du code, tests
  • limites d'usage basses

Travaux "normaux"

Utilisez partition=normal

  • pour les jobs les plus communs (2 jours maximum)

Points d'attention sur les ressources

  • Vous devez indiquer les ressources mémoire et temps nécessaires, car les valeurs par défaut sont très basses et ne permettraient certainement pas à votre travail de se terminer
  • Les quantités demandées en temps, CPU, mémoire doivent être compatible avec la partition, sinon ils ne seront pas acceptés lors de la soumission
  • Un job consommant plus de mémoire ou de temps que demandé sera tué