Ouessant : codes batch

Les travaux sont gérés sur l'ensemble des nœuds par le logiciel LSF. Ils sont répartis dans des “classes” principalement en fonction du temps elapsed et du nombre de cœurs.

Pour soumettre un travail en batch depuis Ouessant, il faut :

  • Créer un script de soumission :

    job
    # Nom du job
    #BSUB -J monJob_test
    # Ficher output et error, ici regroupes
    #BSUB -e %J.err
    #BSUB -o %J.out
    # Nombre de tache MPI 
    #BSUB -n 4
    # Binding
    #BSUB -a p8aff(1,1,1,balance)
    # Nombre de gpu
    #BSUB -R "rusage[ngpus_shared=4]"
    # Nombre de tache MPI par noeud
    #BSUB -R "span[ptile=4]"
    # Durée maximum du travail 
    #BSUB -W 01:00
    #BSUB -x
     
    module load xlf smpi
    # Echo des commandes et leur sortie
    set -x
     
    mpirun /pwrlocal/ibmccmpl/bin/task_prolog.sh -devices auto ./a.out
  • Soumettre ce script via la commande bsub :

      bsub < job.sh

Mode SMT

Sur chaque nœud de Ouessant, il y a deux processeurs POWER 8, chaque processeurs a 10 cœurs. Donc il y a 20 cœurs sur chaque nœud.

Les POWER 8 ont un mode (SMT) qui permet d'avoir jusqu'à 8 cœurs logiques par cœur. Le mode SMT correspond au nombre de cœur logique par cœur, par défaut on est en mode SMT 1 ).

L'utilisation de plusieurs cœurs logiques n'apporte pas obligatoirement de gain de performance.

Affinité des cœurs

L'application p8aff de LSF permet de spécifier l'affinité des cœurs.

p8aff(<num_threads_per_task>,<smt>,<cpus_per_core>,<distribution_policy>)

La signification des ces arguments est :

Argument Valeur Signification
<num_threads_per_task> 1-160 Nombre de thread par tache MPI ( OMP_NUM_THREADS est valorisé a cette valeur )
<smt> 1,2,4 ou 8 mode SMT
<cpu_per_core> 1-8 Nombre de cœurs logiques dans chaque cœur physique utilisé par les threads
<distribution_policy> balance ou pack Politique de distribution MPI

La politique de distribution permet de définir comment sont distribués les processus MPI sur les POWER 8

  • pack : les processus sont distribués d'abord sur le premier POWER 8
  • balance : les processus sont distribués entre les deux POWER 8

Par exemple si on est en mode SMTx1 et 4 processus MPI. On a avec la politique pack :

Power 8 #1 Power 8 #2
0 8 16 24 32 40 48 56 64 72 80 88 96 104 112 120 128 136 144 152
x x x x

Et avec la politique balance on a :

Power 8 #1 Power 8 #2
0 8 16 24 32 40 48 56 64 72 80 88 96 104 112 120 128 136 144 152
x x x x

Exemple de configuration

Configuration d’exécution directives LSF
1 MPI #BSUB -n 1
#BSUB -R “span[ptile=1]”
#BSUB -a p8aff(1,1,1,balance)
1 MPIx20 Threads #BSUB -n 1
#BSUB -R “span[ptile=1]”
#BSUB -a p8aff(20,1,1,balance)
1 MPIx40 Threads #BSUB -n 1
#BSUB -R “span[ptile=1]”
#BSUB -a p8aff(40,2,2,balance)
2 MPIx10 Threads #BSUB -n 2
#BSUB -R “span[ptile=2]”
#BSUB -a p8aff(10,1,1,balance)
4 MPI #BSUB -n 4
#BSUB -R “span[ptile=4]”
#BSUB -a p8aff(1,1,1,balance)
4 MPI x 5 Threads #BSUB -n 4
#BSUB -R “span[ptile=4]”
#BSUB -a p8aff(5,1,1,balance)
20 MPI #BSUB -n 20
#BSUB -R “span[ptile=20]”
#BSUB -a p8aff(1,1,1,balance)
40 MPI #BSUB -n 40
#BSUB -R “span[ptile=40]”
#BSUB -a p8aff(1,2,1,balance)
80 MPI #BSUB -n 80
#BSUB -R “span[ptile=80]”
#BSUB -a p8aff(1,4,1,balance)

Sélection des GPUs

  • Avec la directive BSUB, on indique le nombre de GPU que l'on veut utilise

#BSUB -R “rusage[ngpus_excl_p=<num_gpus>]”

  • Nvidia Multi-Process Service (MPS) permet de partager les GPUs avec plusieurs processus. C'est utile quand le nombre de processus MPI est plus grand que le nombre de GPUs réservés. Pour l'utiliser il faut ajouter cette directive :

#BSUB -env LSB_START_JOB_MPS=Y

Pour simplifier l'attribution des GPUs au processus, il est conseillé d'utiliser le script /pwrlocal/ibmccmpl/bin/task_prolog.sh comme indiqué plus haut.