Table des matières
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
Machines
Voici une description sommaire des machines qui sont disponibles dans la grille de calcul.
Accessibles à tous
optimum
- 11 machines Dell PowerEdge R740
- 512Go de mémoire
- 2 processeurs Intel Xeon Gold 6258R CPU @ 2.70GHz (56 coeurs total)
Ces machines sont séparées en 2 partitions:
- optimum: tâches d'une durée maximale de 48 heures. 10 machines;
- optimumlong: tâches d'une durée maximale de 7 jours. 1 machine.
Accès restreint
Aucune pour le moment.
Slurm
Soumission de tâche
Pour toutes les commandes slurm (squeue, sbatch, etc), il faut se connecter par ssh à la machine slurm.
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.
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
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:
- bash
squeue -u username squeue -u username -t RUNNING squeue -u username -t PENDING
La première affiche toutes les tâches de l'utilisateur, la seconde, les tâches de cet utilisateur qui sont en exécution et la 3e, celles qui sont en attente de ressources.
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.
Exemple 1
Voici un script ou on n'a qu'une seule instance à résoudre.
- bash
#!/bin/bash #SBATCH --cpus-per-task=1 #SBATCH --mem=50G #SBATCH --time=1:00:00 #SBATCH --output=/dev/null #SBATCH --partition=optimum module load anaconda conda activate /usr/bin/time -v python memoire.py sleep 60
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. Dans cet exemple, on aurait cplex qui fera tourner 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. Dans ce cas spécifique, on envoie cette sortie dans /dev/null ce qui a pour effet qu'il n'en reste aucune trace. Si vous avez besoin de cette sortie assurez-vous de minimiser la quantité d'information affichées et de changer le nom du fichier de sortie.--partition
: partition à utiliser. Par défaut, ce sera optimum. Cette partition permet des tâches jusqu'à 2 jours. partition long permet des tâches jusqu'à 7 jours mais, il y a seulement une machine disponible dans ce groupe.
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.
Exemple 2
Si on a une série d'instance, alors on privilégie l'utilisation de l'option array pour lancer une seule tâche.
Dans cet exemple, lorsqu'on calcule le nombre d'instances générées, on arrive à 70. C'est pourquoi nous utilisons --array=1-70
dans l'entête. Il est très important que ces nombres concordent.
#!/bin/bash #SBATCH --time=25:00:00 #SBATCH --cpus-per-task=1 #SBATCH --mem-per-cpu=64G #SBATCH --output=/dev/null #SBATCH --array=1-70 # You have to make sure the number of items in the slurm array # is exactly the same as the number of instances generated below. # Instance generation i=1 INST_DIR=data/inputFiles for scen in 10 9 8 6 5 3 2 do for inst in LargeOrig LargePerc LargePerc2 LargePerc3 LargePerc4 do instance=${INST_DIR}/${inst}.txt for gap in 0.01 0.05 do INSTANCES[$i]="$instance $scen 1 1 0.00 $gap" (( i=$i + 1 )) done done done #for SLURM_ARRAY_TASK_ID in {1..70} #do demands=$(echo ${INSTANCES[$SLURM_ARRAY_TASK_ID]} | awk '{print $1}') phase1Sc=$(echo ${INSTANCES[$SLURM_ARRAY_TASK_ID]} | awk '{print $2}') scenario=$phase1Sc exact=$(echo ${INSTANCES[$SLURM_ARRAY_TASK_ID]} | awk '{print $3}') notrains=$(echo ${INSTANCES[$SLURM_ARRAY_TASK_ID]} | awk '{print $4}') treshold=$(echo ${INSTANCES[$SLURM_ARRAY_TASK_ID]} | awk '{print $5}') gap=$(echo ${INSTANCES[$SLURM_ARRAY_TASK_ID]} | awk '{print $6}') file=`basename $demands .txt` outName=./OUT/${file}_${phase1Sc}_${exact}_${notrains}_${treshold}_${gap}.txt ./exe -demands $demands -phase1Sc $phase1Sc -scenario $scenario -exact $exact -noTrains $notrains -threshold $threshold -gap $gap &> $outName #done sleep 60
scancel
Programme pour annuler une ou plusieurs tâches. Exemple:
- bash
scancel 1234 scancel -u usager
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.
- bash
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é.
/scratch Glusterfs
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.