Aller au contenu

Grille de calcul

Nous avons une petite grille de calcul sur laquelle vous pouvez lancer des tâches. Cette grille utilise slurm, qui est le même système que celui utilisé à l'alliance de recherche numérique du Canada (anciennement calcul Canada). Cependant, nos ressources sont beaucoup plus limitées et la configuration du système est différente. Par contre, l'utilisation est très similaire et la majorité des informations sur la page de soumission de tâches du wiki sont valides. https://docs.computecanada.ca/wiki/Running_jobs/fr

La grille de calcul est accessible à tous les membres du CIRRELT & GERAD.

Régles à suivre pour la grille de calcul

  • Ne pas lancer de tâches sur la machine slurm
  • Utiliser la bonne taille de mémoire pour les tâches.
  • Utiliser le bon nombre de cpu pour vos tâches.
  • Assurez vous que vos tâches durant au moins 10 minutes, sinon elles ne vont pas s'exéctuter.
  • Utilisez la bonne partion pour votre tâche
    • optimum pour des calculs de moins de 2 jours (10 machines).
    • optimumlong pour moins de 7 jours (1 machine).
  • Utilisez votre espace disque sur /scratch si vous effectuez beaucoup de lecture/écriture lors de l'execution de vos tâches.

Facturation

Dans le système, il y a une facturation des ressources consommées. Cette facturation n'entraîne pas de frais aux utilisateurs mais elle est utilisée pour déterminer ce que chacun a utilisé et calculer la priorité des tâches.

Donc si par exemple vous demandez 8 processeurs que vous en utilisez 8 ou 1 seul, comme ils ont été réservés pour vous, ils seront calculés comme étant utilisés et facturés.

Machines

Voici une description sommaire des machines qui sont disponibles dans la grille de calcul

  • 11 machines Dell PowerEdge R740
  • 512Go de mémoire
  • 2 processeurs Intel Xeon Gold 6258R CPU @ 2.70GHz (56 coeurs total)

slurm

La machine slurm elle même peut-être utilisée pour faire des tests des fichiers de soumission sbatch et valider qu'ils fonctionnent. Cependant, les ressources disponibles sont très limitée, l'objectif n'étant pas de faire tourner les programmes. Cette machine est dans la partition testing. Maximum 15 minutes d'exécution.

Soumission de tâche

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

sbatch

Commande 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 le nécessaire pour donner les paramètres slurm et la commande à utiliser pour faire tourner votre programme. Vous pouvez lire les quelques exemples sur cette page.

Voici les paramètres les plus utilisés:

  • --cpus-per-task: nombre de processeurs qui seront utilisés par le programme. Il est important que ce nombre concorde avec ce que le programme fait. Certains logiciels comme cplex et gurobi tentent d'utiliser tous les processeurs à moins qu'ils soient restreints. Si on demande 1 seul CPU et qu'on n'impose pas de limites à un programme comme cplex, on se retrouve dans une situation ou il y aurait 56 fils parallèles qui vont tous s'exécuter sur un seul processeur ce qui n'est pas la bonne façon de faire.
  • --mem: la mémoire dont le programme a besoin. Si cette mémoire est dépassée, la tâche est annulée.
  • --time: le temps requis pour compléter la tâche. Si on dépasse cette limite, la tâche est annulée.
  • --output: pour spécifier le nom du fichier qui contiendra la sortie du programme. Par défaut, le nom du fichier est déterminé par le numéro de tâche.
  • --partition: partition à utiliser. Par défaut, ce sera optimum. Cette partition permet des tâches jusqu'à 2 jours. optimumlong permet des tâches jusqu'à 7 jours mais, il y a seulement une machine disponible dans ce groupe. testing est pour valider que votre script fonctionne avant de soumettre dans une des autres partitions.
  • --nodelist=: Utiliser cette option si vous voulez exécuter votre code sur un noeud spécifique. Si vous vouler utiliser plusieurs noeuds. Vous devez utiliser des virgules ou spécifier une liste de noeuds comme suit optimum[01-03].

Les paramètres que vous choisissez seront utilisés pour voir quelles ressources sont disponibles pour lancer la tâche. Bien qu'il n'y ait pas de limite en tant que tel, plus vous demandez, plus vous allez attendre parce qu'il sera plus difficile d'obtenir ces ressources.

Lorsque votre script est prêt, vous n'avez qu'à utiliser la commande: sbatch instance.batch

Voici 2 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 anaconda
conda 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 mais, elle 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

# chacune des tâches doit être capable de déterminer qui elle
# est en fonction de son indice dans le array slurm.
# pour cela, on fait toutes les combinaisons possibles
# et si l'indice concorde alors c'est nous et on
# exécute le programme avec les bons arguments.

i=1
for n in 1 2
do
for dataset in ab bd
do
    for country in canada france
    do
    if [ $SLURM_ARRAY_TASK_ID -eq $i ]
    then
        ./array.exe $n $dataset $country
    fi
    (( i = $i +1 ))
    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

scancel

Programme pour annuler une ou plusieurs tâches. Exemple:

scancel 1234
scancel -u usager

squeue

Cette commande est utilisée 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 d'utilisation:

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

squeue job states:

CA Canceled Job a été annulé par l'utilisateur ou l'administrateur système
CD Completed Job est complétée
F Failed Job a été terminatée avec un code de sortie "non-zero"
PD Pending Job en attente d'allocation
R Running Job en cours d'exécution

sacct

Cette commande permet d'avoir plus d'information sur une tâche spécifique. Les champs disponibles peut être affichés avec l'option -e et ensuite utilisés soit avec l'option --format.

Le programme permet aussi d'avoir des informations sur des tâches terminées si on connaît le numéro et que l'information est encore disponible dans la base de données.

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

sstat

similaire à sacct mais pour les tâches qui sont présentement en exécution. Cette commande ne fonctionne que sur les tâches que vous avez lancé.

sinfo

Cette commande permet de voir l'état de la grille de calcul et les durées maximales des partitions. On peut voir par exemple s'il y a des machines en panne, s'il y a des machines libres ou si des machines ont été suspendue du système pour entretien.

    PARTITION      AVAIL    TIMELIMIT   NODES  STATE NODELIST
    optimum*       up       2-00:00:00      1    mix optimum01
    optimum*       up       2-00:00:00      9   idle optimum[02-10]
    optimumlong    up       7-00:00:00      1   idle optimum11
Dans cet exemple, on voit que toutes les machines sont disponibles et 1 seule a des tâches.

  • idle: ces machines sont entièrement disponibles
  • mix: ces machines sont utilisées en partie
  • drain: ces machines sont en maintenance

/scratch

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.