Rappel :
Les noeuds de soumission de jobs sont :
SGE est un système batch avec répartition automatique de charge et gestion de files d'attente. SGE permet :
En pratique :
Queue : une queue est une file d'attente dans laquelle s'accumulent les jobs en attente de traitement par l'ordonnanceur.
Job : une tâche ou job est un petit programme (shell) contenant la définition de l'environnement dans lequel il souhaite lancer son calcul, ainsi que les commandes nécessaires au lancement du traitement.
Suivre ce lien Organisation des files d'attente
Problème :
Solution :
qlogin
pour se connecter sur un noeud de calcul en mode interactifqrsh
pour lancer directement un programme sur un noeud en mode interactif Exemple 1 :
[user@mesologin1~]$ qlogin [user@node1-13 ~]
il est possible de quitter ce mode interactif à l'aide de la commande exit
ou du raccourci clavier CTRL-D
Exemple 2 : se connecter à un noeud particulier (utilise la queue par défaut : all.q)
[user@mesologin1 ~]$ qlogin -l hostname=node1-20
Exemple 2.1 : se connecter à un noeud particulier d'une queue donnée, par exemple on se connecte sur les machines de la queue tesla.q ou bigmem
[user@mesologin1 ~] qlogin -q tesla.q
Exemple 3 : demander un noeud avec 16 coeurs pendant 8h
[user@mesologin1 ~] qlogin -q all.q -pe openmp 16 -l h_rt=8:00:00
Exemple 4 : lancer un programme directement sur le noeud GPU (CTL +C) pour l'arrêter.
$ qrsh -q tesla.q PGI_ACC_TIME=1 ./acc_mm.pgi.exe
Pour lancer des jobs de manière asynchrone,
c'est à dire sans avoir besoin d'attendre la fin de l'exécution du calcul,
il est nécessaire d'utiliser la commande qsub
.
Une aide exhaustive est disponible à l'aide de la commande suivante :
$ qsub -help $ man qsub
Généralement :
$ qsub [options] [scriptfile]
Où options correspond aux ressources demandées, par exemple:
et scriptfile représente le script de lancement de l'application
Option | Description |
---|---|
#$ -q [queue] | Queue (file d'attente) à utiliser |
#$ -N [job] | Nom du job |
#$ -V | Exporte toutes les variables d'environnement |
#$ -cwd | Utiliser le répertoire courant comme répertoire de travail |
#$ -o [outfile] | Nom du fichier où stocker la sortie standard |
#$ -e [errfile] | Nom du fichier où stocker les erreurs |
#$ -pe [par] | Environnement parallèle à utiliser |
Dans le script SGE, on peut utiliser les variables d'environnement suivantes :
Variable | Description |
---|---|
$JOB_ID | Identifiant unique propre au job |
$JOB_NAME | Nom attribué au job (par défaut, correspond au nom du script) |
$TMPDIR | Répertoire temporaire de SGE, supprimé à la fin de l'exécution du job |
$SGE_TASK_ID | Identificant de la tâche courante en cas d'utilisation de tableaux de tâches (CF. Job parallèle) |
$NSLOTS | Nombre de cœurs demandés par le script (Voir Job parallèle) |
Exemple de script :
#!/bin/bash #$ -V #$ -N test_sge #$ -cwd #$ -o $JOB_NAME.$JOB_ID.out #$ -e $JOB_NAME.$JOB_ID.err pwd sleep 30
un autre exemple :
#!/bin/bash #$ -V #$ -N test_sge #$ -cwd #$ -o $JOB_NAME.$JOB_ID.out #$ -e $JOB_NAME.$JOB_ID.err time ./monProgrammeCompile
Soumission du job :
$ qsub script.sge
Visualisation de l'état :
$ qstat job-ID prior name user state submit/start at queue slots ja-task-ID ----------------------------------------------------------------------------------------------------------------- 90312 0.74999 test_sge Username r 07/01/2010 14:38:21 all.q@node1-31 1
Problème : lancer plusieurs instances du même programme en parallèle sur des données différentes
Exemple applicatif : lancer l'application appli
100 fois en parallèle avec des données différentes : input1
,…
input100
.
L'application produira des données output1
, …
, output100
Solution : utilisation de tableau tâches (Technique SGE)
Syntaxe :
#$ -t 1-100
On peut fixer le nombre de tâches actives à un instant donné avec l'option
#$ -tc
Exemple 100 tâches à exécuter avec un pool de 50 :
#$ -t 1-100 -tc 50
Script pour l'exemple applicatif :
#!/bin/bash #$ -q all.q #$ -N test_sge #$ -t 1-100 #$ -o $JOB_NAME.$JOB_ID.out #$ -o $JOB_NAME.$JOB_ID.err #$ -l h_vmem=4G ./appli input$SGE_TASK_ID output$SGE_TASK_ID
Contexte : l'application s'exécute sur un nœud en utilisant plusieurs cœurs
Solution : utilisation l'environnement parallèle openmp
#$ -pe openmp <nbSlots> export OMP_NUM_THREADS=$NSLOTS
Exemple
#!/bin/bash #$ -N test_sge #$ -pe openmp 8 ## on demande 8 coeurs #$ -o $JOB_NAME.$JOB_ID.out export OMP_NUM_THREADS=$NSLOTS ## lancement de l'application ./appli input
mpi
parallel.q
Exemple d'un script SGE MPI
#!/bin/bash #$ -q parallel.q #$ -pe mpi 16 #$ -N test_sge #$ -o $JOB_NAME.$JOB_ID.out #$ -e $JOB_NAME.$JOB_ID.err #### on charge le module open mpi module load mpi/openmpi/icc/1.7.5 ## lancement de l'application mpirun -np $NSLOTS ./appli_mpi
SGE peut notifier l'utilisateur lorsque le job est démarré, arrêté ou supprimé. Pour cela il faut rajouter certaines options dans vos scripts :
#$ -M addresse@mail
#$ -m e
#$ -m b
#$- m a
#$ -m bea
Exemple
#!/bin/bash #$ -N test_sge #$ -o $JOB_NAME.$JOB_ID.out #$ -M kamel.mazouzi@univ-fcomte.fr #$ -m bea ##notification : debut, arret, fin sleep 60
Pour lister les jobs
$ qstat
Afficher la liste de tous les jobs
$ qstat -u "*"
Affichier la liste des noeuds exécutant mes jobs
$ qstat -g t
Afficher l'état des instances des queues
$ qstat -f
Afficher l'utilisation des queues
$ qstat -g c CLUSTER QUEUE CQLOAD USED RES AVAIL TOTAL aoACDS cdsuE -------------------------------------------------------------------------------- 3dvisu.q 0.01 0 0 8 8 0 0 all.q 0.00 0 0 508 508 0 0 parallel.q 0.00 0 0 704 704 0 0 tesla.q 0.00 0 0 8 8 0 0 xphi.q 0.01 0 0 12 12 0 0
Afficher les jobs en attente pour l'utilisateur toto
$ qstat -u toto -s p
Afficher les jobs en exécution pour l'utilisateur toto
$ qstat -u toto -s r
Afficher l'état d'un job en erreur (la ligne error peut indiquer la raison de non soumission si le job est en mode Eqw)
$ qstat -j 66666
Savoir pourquoi un job n'a pas ete schedule
$ qstat -j job_id
Afficher les jobs terminés (historique)
$ qstat -s z
Afficher les ressources disponibles
$ qhost
Afficher les ressources disponibles en détail ( mémoire, swap, jobs, …)
$ qhost -q
Supprimer un job
$ qdel 666 ## supprime le job 666
Supprimer tous les jobs de toto
$ qdel -u toto
Forcer la suppression du job numéro 66666
$ qdel -f 66666
Pour basculer les jobs d'un utilisateur de la file courante vers une nouvelle file (newqueue)
Exemple : basculer les jobs de l'utilisateur dupond
de la file all.q
vers la file bigmem.q
$ qalter -u dupond -q bigmem.q
Pour suspendre un job :
$ qhold jobid
Pour reprendre le traitement d'un job :
$ qrls jobid
Après la soumission d'un job, ce dernier peut avoir plusieurs états :
d | deleting |
t , r | transfering, running |
s , S , T | suspending , threshold |
R | restarted |
w | waiting |
h | hold |
E | error |
q | queuing |
L'utilisation de l'option h_vmem
est vivement recommandée pour spécifier la mémoire nécessaire à l'exécution des jobs.
Cette pratique permet à votre application de disposer des ressources appropriées (cœurs/mémoire) et d'éviter des crashs liés à l'utilisation
de ressources excessives sur le cluster (saturation d'un ou plusieurs nœuds de calcul).
Il est par conséquent important de préciser la quantité mémoire à prévoir dans vos scripts :
#$-l h_vmem=MEM_MAX
MEM_MAX | Quantité de mémoire maximale autorisée par cœur/processus |
---|
h_vmem
dans vos scripts, une valeur de 1G lui sera attribuée par défaut.
h_vmem
en évitant la surestimation pour ne pas bloquer les autres utilisateurs. qmem, qmemview
ou sur le portail https://mesoportail.univ-fcomte.fr rubrique mesjobs
qsub -l h_vmem=2G mon_script.sge
qsub -l h_vmem=1800M mon_script.sge
Mon job a besoin de 1800 Mo et il sera tué par SGE s'il dépasse cette valeur.
qsub -l h_vmem=400M mon_script.sge
L'application séquentielle s'exécute sur un 1 seul cœur, une valeur h_vmem lui sera attribuée :
#$ -l h_vmem=300M
ou
qsub -l h_vmem=300M script.sge
La quantité mémoire demandée est par processus ou par cœur. Si une application parallèle s'exécutant sur : NOMBRE_DE_COEURS
coeurs et a besoin d'une mémoire : MEMOIRE_TOTALE
, il faut diviser cette quantité sur l'ensemble de cœeurs :
#$ -l h_vmem= MEMOIRE_TOTALE/NOMBRE_DE_COEURS
L'application MPI à besoin en total de 24000 M
qsub -pe impi_tight=16 -h v_mem=1500M script.sge
Dans le cas ou tous les cœurs sont utilisés, il vaut mieux prendre la totalité de la mémoire sur un noeud.
Sur une machine de 12G mémoire :
qsub -pe openmp 8 -l h_vmem=1.5G script.sge
Par exemple :
$ qlogin -q tesla.q -l h_vmem=2G
qhost -F h_vmem
qmemview
Visualisation de la mémoire utilisée par différents jobs, la commande : qmemAll
JOB ID | SLOTS | VMEM REQUESTED | TOTAL VMEM USED | RECOMMENDED VMEM VALUE | RATIO USED | |||||
---|---|---|---|---|---|---|---|---|---|---|
157263 | 110 | 1100M | 63.159G | 705.331M | 53.434% | |||||
157264 | 60 | 1000M | 19.821G | 405.504M | 33.792% | |||||
157353 | 32 | 2.7G | 53.173G | 1.993G | 61.518% | |||||
157385 | 24 | 1.5G | 23.591G | 1206.681M | 65.466% | |||||
157407 | 64 | 2.0G | 70.971G | 1.329G | 55.400% | |||||
157409 | 60 | 1000M | 21.235G | 433.766M | 36.147% | |||||
157462 | 68 | 1000M | 23.149G | 417.792M | 34.816% | |||||
158141 | 8 | 1.5G | 545.871M | 81.879M | 4.442% |
Analyse
100M
processeur | date d'achat | vitesse (GHz) | puissance (GFlops)/node | Nombre de cœurs | nombre de nœuds | remarque |
---|---|---|---|---|---|---|
Westmere | 2010 | 2.66GHz | 255 | 12 | x | utiliser dans la file d'attente all.q |
Sandybridge | 2013 | 2.2GHz | 281 | 16 | x | utiliser dans la file d'attente all.q et parallel.q |
Haswell | 2015 | 2.6GHz | 665 | 16 | 20 | utiliser dans la file d'attente parallel.q |
Pour demander à utiliser un type de processeur particulier ;
#$ -l proctype=XXXX
Avec XXXX=westmere
, sandybridge
ou haswell
.
Ainsi, pour s'exécuter sur le processeur sandybridge
, l'option SGE est :
#$ -l proctype=sandybridge
MPI
de la file parallel.q
Comment connaître le type de processeur sur un noeud ?
La commande proctype
permet d'afficher le type d’architecture du processeur :
$ [user@node1-32 ~]$ proctype -march= westmere