Aller au contenu

Grille de calcul

Le CIRRELT & GERAD met à votre disposition une grille de calcul locale, basée sur le gestionnaire de tâches Slurm, le même système que celui utilisé par l’Alliance de recherche numérique du Canada (anciennement Calcul Canada). Bien que nos ressources soient plus limitées et que la configuration diffère, l’utilisation reste similaire. La plupart des informations disponibles sur la page de soumission de tâches du wiki de l’Alliance s’appliquent donc également à notre grille.

Règles à suivre pour la grille de calcul

  • Ne lancez jamais de tâches directement sur la machine slurm (réservée à la gestion des soumissions).
  • Utiliser la bonne taille de mémoire pour les tâches.
  • Utiliser le bon nombre de cpu pour vos tâches.
  • Les tâches d’une durée inférieure à 10 minutes risquent d’être ignorées par le système. Assurez-vous que vos calculs dépassent ce seuil.
  • Utilisez la bonne partition pour votre tâche
    • optimum: Pour des calculs de moins de 2 jours (10 machines disponibles).
    • optimumlong: Pour des calculs de 2 à 7 jours (1 machine disponible).
    • testing: Pour valider vos scripts avant soumission (max. 15 minutes).
  • Utilisez votre espace disque sur /scratch si vous effectuez beaucoup de lecture/écriture lors de l'execution de vos tâches ou si vous avez de gros jeux de données.

Ressources matérielles

Modèle Mémoire CPU (par machine)
Dell PowerEdge R740 512 Go 2 × Intel Xeon Gold 6258R (56 cœurs)

Note : La machine slurm peut être utilisée pour tester vos scripts (partition testing), mais ses ressources sont très limitées.

Gestion des tâches

Pour toutes les commandes slurm (squeue, sbatch, etc), il faut se connecter par ssh à la machine slurm.

État de la grille

La commande sinfo permet de voir l'état de la grille de calcul et les durées maximales des partitions.

PARTITION      AVAIL    TIMELIMIT   NODES  STATE  NODELIST
optimum*       up       2-00:00:00      1   mix   optimum01
optimum*       up       2-00:00:00      1   drain optimum02
optimum*       up       2-00:00:00      9   drng  optimum03
optimum*       up       2-00:00:00      9   idle  optimum[04-10]
optimumlong    up       7-00:00:00      1   idle  optimum11
  • idle: ces machines sont entièrement disponibles
  • mix: ces machines sont utilisées en partie
  • drain: ces machines sont en maintenance
  • drng: ces machines exécutent des tâches mais n'en acceptent plus. Dès que les tâches en cours seront terminées, elles passeront au mode drain.

Soumission de tâches

La commande sbatch est utilisée pour soumettre une tâche à la grille de calcul. On peut mettre les paramètres dans le script de soumission ou les passer sur la ligne de commande ou faire une combinaison des 2.

Pour lancer une tâche dans la grille, vous devez avoir un script avec les paramètres slurm.

Voici les paramètres les plus utilisés:

Paramètre Description Exemple
--cpus-per-task Nombre de CPU alloués. Doit correspondre aux besoins réels de votre programme. --cpus-per-task=4
--mem Mémoire requise. Si dépassée, la tâche est annulée. --mem=16G
--time Durée maximale. Format : JJ-HH:MM:SS. --time=2-12:00:00
--output Fichier de sortie. Par défaut : slurm-<ID>.out. --output=resultats.log
--partition Partition cible (optimum, optimumlong, testing). --partition=optimumlong
--nodelist Noeuds spécifiques (ex. : optimum[01-03]). --nodelist=optimum01
--array permet de lancer 8=des tâches identiques en parallèle, chacune avec un identifiant unique ($SLURM_ARRAY_TASK_ID). Cela évite de soumettre manuellement chaque instance. --array=1-8

Bonnes pratiques

  • Testez votre script avec la partition testing avant de soumettre à optimum.
  • Évitez de surestimer les ressources : plus la demande est élevée, plus l’attente sera longue.
  • Limitez l’utilisation des CPU pour les logiciels comme CPLEX ou Gurobi (utilisez --cpus-per-task). Ajustez le nombre de threads dans votre programme en conséquence.

Lorsque votre script est prêt, vous n'avez qu'à utiliser la commande

sbatch instance.batch

Voici 3 exemples de scripts qui peuvent vous servir de point de départ.

Script ou on n'a qu'une seule instance à résoudre.

#!/bin/bash
#SBATCH --cpus-per-task=1
#SBATCH --mem=10G
#SBATCH --time=1:00:00
#SBATCH --output=/dev/null
#SBATCH --partition=optimum

source ~/.bashrc

module load python
source .venv/bin/activate
/usr/bin/time -v python memoire.py

sleep 60

Si on a une série d'instance, alors on privilégie l'utilisation de l'option array pour lancer une seule tâche avec sbatch qui regroupe l'ensemble des instances que vous voulez résoudre.

Dans cet exemple, lorsqu'on calcule le nombre d'instances générées, on arrive à 8.

  • n = 2 valeurs
  • dataset = 2 valeurs
  • country = 2 valeurs.

2 * 2 * 2 = 8.

C'est pourquoi nous utilisons --array=1-8 dans l'entête. Il est très important que ces nombres concordent pour que toutes les instances soient lancées.

#!/bin/bash
#SBATCH --cpus-per-task=1
#SBATCH --mem=10G
#SBATCH --time=10:00
#SBATCH --array=1-8
#SBATCH --output=arrayjob_%A_%a.out

source ~/.bashrc

# Définition de paramètres dans des tableaux 
n_values=(1 2)
datasets=("ab" "bd")
countries=("canada" "france")

# Ces boucles génèrent toutes les combinaisons possibles
# selon les paramètres spécifiés.
# Cependant, on doit exécuter seulement la tâche qui correspond
# à l'indice $SLURM_ARRAY_TASK_ID qui est fourni par slurm.
# C'est pourquoi nous avons l'indice $i qui est utilisé pour
# la comparaison.

i=0
for n in "${n_values[@]}"; do
    for dataset in "${datasets[@]}"; do
        for country in "${countries[@]}"; do
            # Si ce test ou un équivalent n'est pas présent, alors toutes les
            # tâches seront exécutées pour chacune des tâches du array
            if [ "$SLURM_ARRAY_TASK_ID" -eq "$i" ]; then
                ./array.exe "$n" "$dataset" "$country"
                exit 0
            fi
            ((i++))
        done
    done
done

sleep 60

Pour lancer un programme matlab dans la grille de calcul, il faut que votre programme ne soit pas en mode graphique et qu'il soit en mesure d'obtenir tous les paramètre dont il a besoin sans interaction et sans avoir à modifier le code.

#!/bin/bash
#SBATCH --cpus-per-task=1
#SBATCH --mem=16G
#SBATCH --time=10:00
#SBATCH --output=hello.out

source ~/.bashrc

module load matlab
matlab -batch hello

sleep 60

Annulation de tâches

Le programme scancel est utilisé pour annuler une ou plusieurs tâches. Exemple:

scancel 1234
scancel -u usager

Suivi et statistiques des tâches

État actuel des tâches

Le programme squeue est utilisé pour voir les tâches qui sont dans le système. Par défaut, si vous ne donnez aucune option, vous verrez les tâches de tout le monde. Vous pouvez utiliser l'option -u pour spécifier votre nom d'utilisateur.Vous pouvez utiliser la variable SQUEUE_FORMAT pour changer l'affichage par défaut de la commande. Par exemple à l'alliance ils utilisent:

export SQUEUE_FORMAT="%.15i %.8u %.12a %.14j %.3t %.10L %.5D %.4C %.10b %.7m %N (%r)"

Exemples

Commande Description
squeue -u username affiche toutes les tâches de l'utilisateur
squeue -u username -t RUNNING affiche les tâches de l'utilisateur qui sont en exécution
squeue -u username -t PENDING affiche les tâches de l'utilisateur qui sont en attente de ressources

Liste des états

Code Statut Description
CA Canceled La tâche a été annulée
CD Complete La tâche est terminée
F Failed La tâche quitté avec un code de sortie différent de 0
PD Pending La tâche est en attente
R Running La tâche est en cours d'exécution

Informations détaillées des tâches

Les commandes sstat et sacct peuvent être utilisées pour obtenir plus d'informations sur les tâches.

La commande sstat ne peut être utilisée que pour les tâches en cours alors que sacct peut aussi être utilisée pour les tâches terminées.

Les champs disponibles peut être affichés avec l'option -e et ensuite utilisés soit avec l'option --format.

Pour voir de plus anciennes tâches, on peut spécifier une date de départ

sacct --starttime 2022-04-17 --format=Account,User,JobID,Start,End,AllocCPUS,Elapsed,AllocTRES%30,CPUTime,AveRSS,MaxRSS,MaxRSSTask,MaxRSSNode,NodeList,ExitCode,State%20

La variable d'environnement SACCT_FORMAT permet de définir un format si on souhaite pas le spécifier à chaque exécution du programme. L'exemple suivant est le format utilisé à l'alliance.

export SACCT_FORMAT=Account,User,JobID,Start,End,AllocCPUS,Elapsed,AllocTRES%30,CPUTime,AveRSS,MaxRSS,MaxRSSTask,MaxRSSNode,NodeList,ExitCode,State%20

Le programme seff peut être utilisé pour voir des statistiques d'exécution du programme comme les pourcentages d'utilisation des ressources CPU et de mémoire.

$  seff 12345
Job ID: 12345
Cluster: cluster
User/Group: 
State: COMPLETED (exit code 0)
Nodes: 1
Cores per node: 6
CPU Utilized: 07:31:57
CPU Efficiency: 22.34% of 1-09:42:54 core-walltime
Job Wall-clock time: 05:37:09
Memory Utilized: 49.33 GB
Memory Efficiency: 49.33% of 100.00 GB

Cette commande permet de voir l'utilisation des ressources demandées si elles sont optimales. Dans ce cas, la mémoire utilisée est 50% moins que la mémoire demandée par l'utilisateur. Même chose pour la demande de CPU qui est 23% des CPUs demandés pour cette tâche.


Le programme reportseff permet de voir les statistiques de plusieurs tâches à la fois.

Dans l'exemple ci-dessus, on remarque que certaines tâches sont très courtes ce qui peut indiquer que le programme n'a pas fonctionné correctement. Les chiffres en rouge attirent l'attention sur les tâches ou les ressources sont mal utilisées.

Vous pouvez obtenir plus d'information sur le programme reportseff en consultant la page du logiciel.


Le programme seff-array permet de faire une analyse des tâches d'un même array. Cela permet entre autre de voir la répartion des tâches pour différents niveaux d'utilisation des ressources sous forme d'histogramme.

 $  seff-array 12345
--------------------------------------------------------
Job Information
ID: 12345
Name: test_models.sh
Cluster: cluster
User/Group: -----
Requested CPUs: 6 cores on 1 node(s)
Requested Memory: 100G
Requested Time: 14:00:00
--------------------------------------------------------
Job Status
COMPLETED: 28
--------------------------------------------------------
--------------------------------------------------------
Finished Job Statistics
(excludes pending, running, and cancelled jobs)
Average CPU Efficiency 37.26%
Average Memory Usage 26.38G
Average Run-time 18682.25s
---------------------

CPU Efficiency (%)
---------------------
+0.00e+00 - +1.00e+01  [0]
+1.00e+01 - +2.00e+01  [7]  ████████████████████████████████████████
+2.00e+01 - +3.00e+01  [5]  ████████████████████████████▋
+3.00e+01 - +4.00e+01  [3]  █████████████████▏
+4.00e+01 - +5.00e+01  [3]  █████████████████▏
+5.00e+01 - +6.00e+01  [7]  ████████████████████████████████████████
+6.00e+01 - +7.00e+01  [2]  ███████████▍
+7.00e+01 - +8.00e+01  [1]  █████▊
+8.00e+01 - +9.00e+01  [0]
+9.00e+01 - +1.00e+02  [0]

Memory Efficiency (%)
---------------------
+0.00e+00 - +1.00e+01  [3]  █████████████▍
+1.00e+01 - +2.00e+01  [7]  ███████████████████████████████▏
+2.00e+01 - +3.00e+01  [9]  ████████████████████████████████████████
+3.00e+01 - +4.00e+01  [4]  █████████████████▊
+4.00e+01 - +5.00e+01  [4]  █████████████████▊
+5.00e+01 - +6.00e+01  [0]
+6.00e+01 - +7.00e+01  [0]
+7.00e+01 - +8.00e+01  [1]  ████▌
+8.00e+01 - +9.00e+01  [0]
+9.00e+01 - +1.00e+02  [0]

Time Efficiency (%)
---------------------
+0.00e+00 - +1.00e+01  [ 2]  ████▎
+1.00e+01 - +2.00e+01  [ 0]
+2.00e+01 - +3.00e+01  [ 0]
+3.00e+01 - +4.00e+01  [19]  ████████████████████████████████████████
+4.00e+01 - +5.00e+01  [ 7]  ██████████████▊
+5.00e+01 - +6.00e+01  [ 0]
+6.00e+01 - +7.00e+01  [ 0]
+7.00e+01 - +8.00e+01  [ 0]
+8.00e+01 - +9.00e+01  [ 0]
+9.00e+01 - +1.00e+02  [ 0]
--------------------------------------------------------

Espace de travail temporaire

Il y a un espace de travail temporaire disponible dans le répertoire /scratch de chacune des machines optimum. Cet espace est aussi disponible à partir de la machine frontale slurm de façon à ce que vous puissiez y copier vos données avant de lancer les tâches.

Il n'y a aucune sauvegarde des fichiers qui sont mis dans ce répertoire alors n'y mettez aucun fichier que vous ne pouvez pas vous permettre de perdre.

Nous vous demandons d'utiliser cet espace de façon raisonnable.