Skoči na vsebino

SLURM: Uporaba in dobre prakse

Dostop prek prijavnega vozliča in uporaba sistema SLURM omogočata neposredno delo na gručah, hiter razvoj in natančen nadzor nad izvajanjem.

Javni dostop na ta način trenutno (2020–02) v SLING podpirajo gruče Maister (Univerza v Mariboru, projekt HPC RIVR), Trdina (Fakulteta za informacijske študije, projekt HPC RIVR) in NSC (Institut Jožef Stefan).

Ureditev dostopa: prijavno vozlišče

Za uporabo gruč prek sistema SLURM mora uporabnik pridobiti dostop do prijavnega vozlišča (login node). Prijavno vozlišče je računalnik, ki je neposredno povezan s sistemom in pravilno konfiguriran, da lahko komunicira z nadzornim demonom ter ima nameščena orodja za delo na ukazni vrstici.

Glej Navodila > Pridobitev dostopa.

Uporabni ukazi

  • sbatch, salloc, srun: zagon posla
  • scancel: preklic posla v vrsti ali v teku
  • smd: sprememba alokacije posla, npr. v primeru strojne napake
  • sinfo: podatki o stanju sistema
  • squeue, sprio, sjstat: podatki o stanju nalog in vrst
  • sacct, sreport: podatki o tekočih in končanih poslih ter nalogah, generiranje poročil
  • sview, smap: grafičen prikaz stanja sistema, poslov in mrežne topologije
  • sattach: pripojitev seji tekoče naloge/posla
  • sbcast, sgather: prenos datotek z delovnih vozlišč
  • scontrol: administracija, spremljanje in konfiguracija gruče
  • sacctmgr upravljanje z bazo, podatki o gručah, uporabnikih, računih in particijah

Za vse naštete funkcije SLURM implementira dokumentiran API, tako da jih je mogoče priklicati klicati programsko.

Gruče in viri

SLURM vire v gruči razume kot vozlišča (nodes), ki so enota računske kapacitete, particije (partitions), ki so logične množice vozliš, posle ali alokacije (jobs, allocations), ki so nabor dodeljenih virov posameznemu uporabniku za določen čas, ter korake (job steps), ki so posamezne naloge, zaporedne ali vzporedne, kakor se izvajajo v okviru posamezne alokacije ali posla.

Particije so logične enote, ki so hkrati vrste za izvajanje nalog, a tudi enote, na katerih je mogoče nastavljati parametre ter omejitve, kot so: * omejitve velikosti alokacije/posla/naloge/koraka * časovne omejitve izvajanja * dovoljenja in prioritete za uporabnike in skupine * pravila za obravnavo prioritet * dostopnost virov v particijah (vozlišča, procesorji, pomnilnik, vektorske enote GPGPU ipd.)

Viri v sistemu SLURM

Pošiljanje nalog po sistemu SLURM

Uporaba treh ukazov:

  • sbatch se uporablja za zagon izvršljivih datotek, ki se bodo izvedle, ko pridejo na vrsto. Izvršljiva datoteka lahko vsebuje več srun ukazov za zagon poslov. Pri oddaji posla prek sbatch, dobimo ID/številko naloge v vrsti.
  • salloc se uporablja za dodeljevanje virov za izvajanje posla v realnem času. Praviloma se uporabi, da se ustvari lupina, ki se nato uporabi za izvedbo zagona posla s srun.
  • srun se uporablja za izvedbo nalog v realnem času. Posel lahko vsebuje več nalog oz. korakov (angl.: steps), ki se izvedejo zaporedno ali vzporedno, na neodvisnih ali skupnih virih v dodeljevanju posla vozlišču.

Navadno se srun uporablja v kombinaciji s sbatch ali salloc, torej v okviru obstoječe alokacije (izbranih virov).

Če že poznate sistem za upravljanje vrst, si lahko pomagate s primerjavo sistema SLURM z drugimi upravljavci vrst, ki vključuje analogne ukaze, koncepte in spremenljivke: https://slurm.schedmd.com/rosetta.pdf

srun – zagon paralelnih poslov s sistemom SLURM

SLURM srun pogosto enačimo z mpirun za posle tipa MPI. Če ne gre za paralelne naloge tega tipa, je bolje uporabiti sbatch. Primer uporabe, kjer se kot aplikacijo uporabi kar programček hostname, ki le izpiše ime delovnega vozlišča (računalnika), na katerem teče proces:

  • Primer 1: srun hostname
  • Primer 2: srun -N 2 hostname
  • Primer 3: srun -n 2 hostname
  • Primer 4: srun -N 2 -n 2 hostname
  • Primer 5: srun -N 2 -n 4 hostname
    • -N ali --nodes: število vozlišč
    • -n ali --ntasks: število nalog v poslu

Dobra praksa: Uporabite -n ali -N s stikalom --ntasks-per-node. Svojim skriptam dodajte atribut za izvedljivost (executable bit): chmod a+x my_script.sh

sbatch – pošiljanje izvršljive datoteke s sistemom SLURM

Raba sbatch:

Zahtevane vire in druge parametre za izvedbo posla (izbira vrste/particije, čas trajanja naloge, določitev izhodne datoteke ipd.), lahko določite s parametri SBATCH, ki jih navedete v začetku vaše izvršljive datoteke, takoj za #!/bin/bash.

#!/bin/bash
#SBATCH --job-name=test
#SBATCH --output=result.txt
#SBATCH --ntasks=1
#SBATCH --time=10:00
#SBATCH --mem-per-cpu=100
srun hostname
srun sleep 60 `

Dobra praksa: Skriptam sbatch dodajte atribut za izvedljivost (executable bit): chmod a+x test-script.sh

Pošiljanje naloge: sbatch test-script.sh

salloc – dodeljevanje virov

Raba salloc:

  • salloc zahteva dodelitev virov za naš posel in zažene lupino na prvem vozlišču, ki ustreza zahtevam za naš posel
  • vire določimo enako kot s srun ali sbatch
  • ko posel zaključimo, se dodeljeni viri sprostijo

Primer:

salloc --partition=grid --nodes=2 --ntasks-per-node=8 --time=01:00:00
module load mpi
srun ./hellompi
exit

Primeri za srun/sbatch/salloc

  • --ntasks-per-node: število nalog na posameznem vozlišču
  • -c or --cpus-per-task: število jeder za posamezen posel
  • --time: čas za izvedbo posla (angl. walltime) (format: dd-hh:mm:ss)
  • --output: stdout v določeno datoteko
  • --job-name: ime posla
  • --mem: skupno predpomnilnika za izvedbo posla (format: 4G)
  • --mem-per-cpu: predpomnilnik/jedro
  • --cpu-bind=[quiet,verbose]: priključi naloge glede na CPU

Za več možnosti: Uporabite man srun/sbatch ali srun/sbatch --help.

Razlika med srun in sbatch

  • oba ukaza izvajamo z enakimi stikali
  • sbatch edini pozna nize poslov z istimi vhodnimi podatki (angl. array jobs)
  • srun edini pozna možnost izvedbe posla --exclusive, ki omogoča alokacijo celega vozlišča in s tem izvedbo več paralelnih nalog znotraj ene alokacije virov (od SLURM v20.02, vključno z dodatnimi viri gres, npr. GPU).

Primer posla s sbatch

sbatch --partition=grid --job-name=test --mem=4G --time=5-0:0 --output=test.log myscript.sh

je enako kot:

sbatch -p grid -J test --mem=4G -t 5-0:0 -o test.log myscript.sh

in enako kot:

#!/bin/bash
#SBATCH --partition=gridlong
#SBATCH --job-name=test
#SBATCH --mem=4G
#SBATCH --time=5-0:0
#SBATCH --output=test.log
sh myscript.sh`

Upravljanje poslov

Osnovni pregled vrste

Kako preveriti status vozlišč in vrste?

  • squeue -l podrobnosti poslov v vrsti (-l = long)
  • squeue -u $USER posli uporabnika $USER
  • squeue -p gridlong naloge v vrsti gridlong
  • squeue -t PD posli, ki čakajo v vrsti
  • squeue -j <jobid> --start predviden čas začetka izvajanja posla
  • sinfo status vrste/particije,sinfo -l -N podrobne informacije
  • sinfo -T prikaz rezervacij
  • scontrol show nodes podatki o vozliščih

Podroben pregled vseh poslov, ki so v vrsti: squeue -l:

JOBID PARTITION     NAME      USER    STATE      TIME    TIME_LIMIT  NODES  NODELIST(REASON)
948700  gridlong    <jobname> <user>  PENDING       0:00  22:03:00      1 (Priority)
932891  gridlong    <jobname> <user>  RUNNING 3-16:43:04 7-00:00:00      1 nsc-gsv005
933253  gridlong    <jobname> <user>  RUNNING 3-15:24:53 7-00:00:00      1 nsc-gsv004
933568  gridlong    <jobname> <user>  RUNNING 3-14:19:30 7-00:00:00      1 nsc-msv003
934391  gridlong    <jobname> <user>  RUNNING 3-10:27:51 7-00:00:00      1 nsc-gsv001
934464  gridlong    <jobname> <user>  RUNNING 3-08:41:19 7-00:00:00      1 nsc-msv005
934635  gridlong    <jobname> <user>  RUNNING 3-01:48:24 7-00:00:00      1 nsc-msv005
934636  gridlong    <jobname> <user>  RUNNING 3-01:48:07 7-00:00:00      1 nsc-msv003

Pregled poslov uporabnika: squeue -u $USER:

JOBID   PARTITION    NAME        USER    ST      TIME  NODES NODELIST(REASON)
948702  gridlong     <jobname>   <user>  R       0:03      1 nsc-gsv003

Prikaz ocenjenega časa do začetka izvajanja posla: squeue -j <jobid> --start:

JOBID   PARTITION    NAME        USER    ST     START_TIME  NODES SCHEDNODES      NODELIST(REASON)
948555  gridlong     <jobname>   <user>  PD       N/A           1 (null)               (Priority)

Pregled podatkov o vozliščih: sinfo - primer na gruči Maister:

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
grid*        up 2-00:00:00      3   resv gpu[01-02,04]
grid*        up 2-00:00:00     30    mix cn[01-17,20-27,34,41-45]
grid*        up 2-00:00:00      4  alloc cn[46-48],gpu[03,05-06]
grid*        up 2-00:00:00     45   idle cn[18-19,28-33,35-40],dpcn[01-28]
long         up 14-00:00:0      4    mix cn[42-45]
long         up 14-00:00:0      4  alloc cn[46-48]

Podroben pregled vseh vozlišč: scontrol show nodes. V primeru prikazano eno vozlišče.

NodeName=nsc-msv020 Arch=x86_64 CoresPerSocket=16
   CPUAlloc=20 CPUTot=64 CPULoad=21.24
   AvailableFeatures=AMD
   ActiveFeatures=AMD
   Gres=(null)
   NodeAddr=nsc-msv020 NodeHostName=nsc-msv020 Version=20.02.0
   OS=Linux 5.0.9-301.fc30.x86_64 #1 SMP Tue Apr 23 23:57:35 UTC 2019
   RealMemory=257920 AllocMem=254000 FreeMem=56628 Sockets=4 Boards=1
   State=MIXED ThreadsPerCore=1 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A
   Partitions=gridlong
   BootTime=2020-06-20T15:16:22 SlurmdStartTime=2020-06-20T16:26:53
   CfgTRES=cpu=64,mem=257920M,billing=64
   AllocTRES=cpu=20,mem=254000M
   CapWatts=n/a
   CurrentWatts=0 AveWatts=0
   ExtSensorsJoules=n/s ExtSensorsWatts=0 ExtSensorsTemp=n/s

Ukazi za upravljanje s posli

  • sacct: podatki o popisu porabe za končani posel in posel, ki je še v teku (sacct -j <jobid>)
  • sstat: statistika posla, ki se izvaja (sstat -j <jobid> --format=AveCPU,AveRSS,AveVMSize, MaxRSS,MaxVMSize)
  • scontrol show: npr. scontrol show job|partition
  • scontrol update: spremeni posel
  • scontrol hold: začasno zaustavi posel
  • scontrol release: sprosti posel
  • scancel: prekliči posel
  • sprio: prikaži prioriteto posla

Pregled podatkov in korakov za posel: sacct -j <jobid>:

       JobID    JobName  Partition    Account  AllocCPUS      State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
949849        <jobname>   gridlong    <user>          1    RUNNING      0:0
949849.batch      batch               <user>          1    RUNNING      0:0
949849.exte+     extern               <user>          1    RUNNING      0:0

Prikaz statistik dela: sstat -j <jobid> --format=AveCPU,AveRSS,AveVMSize – z možnostjo format lahko filtriramo prikazane podatke.

    AveCPU     AveRSS  AveVMSize
---------- ---------- ----------
 00:00.000     11164K    169616K

Podroben pregled particije: scontrol show partition:

PartitionName=gridlong
   AllowGroups=ALL AllowAccounts=ALL AllowQos=ALL
   AllocNodes=ALL Default=YES QoS=N/A
   DefaultTime=00:30:00 DisableRootJobs=NO ExclusiveUser=NO GraceTime=0 Hidden=NO
   MaxNodes=UNLIMITED MaxTime=14-00:00:00 MinNodes=0 LLN=NO MaxCPUsPerNode=UNLIMITED
   Nodes=nsc-msv0[01-20],nsc-gsv0[01-07],nsc-fp0[01-08]
   PriorityJobFactor=1 PriorityTier=1 RootOnly=NO ReqResv=NO OverSubscribe=NO
   OverTimeLimit=NONE PreemptMode=OFF
   State=UP TotalCPUs=1984 TotalNodes=35 SelectTypeParameters=NONE
   JobDefaults=(null)
   DefMemPerCPU=2000 MaxMemPerNode=UNLIMITED
   TRESBillingWeights=CPU=1.0,Mem=0.25G

Podroben pregled nastavitev posla: scontrol show job <jobid>:

JobId=950168 JobName=test
   UserId=<user> GroupId=<group> MCS_label=N/A
   Priority=4294624219 Nice=0 Account=nsc-users QOS=normal
   JobState=PENDING Reason=Priority Dependency=(null)
   Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0
   RunTime=00:00:00 TimeLimit=01:00:00 TimeMin=N/A
   SubmitTime=2020-07-10T12:41:14 EligibleTime=2020-07-10T12:41:14
   AccrueTime=2020-07-10T12:41:14
   StartTime=Unknown EndTime=Unknown Deadline=N/A
   SuspendTime=None SecsPreSuspend=0 LastSchedEval=2020-07-10T12:41:20
   Partition=gridlong AllocNode:Sid=ctrl:15247
   ReqNodeList=(null) ExcNodeList=(null)
   NodeList=(null)
   NumNodes=1 NumCPUs=1 NumTasks=1 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
   TRES=cpu=1,mem=100M,node=1,billing=1
   Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=*
   MinCPUsNode=1 MinMemoryCPU=100M MinTmpDiskNode=0
   Features=(null) DelayBoot=00:00:00
   OverSubscribe=OK Contiguous=0 Licenses=(null) Network=(null)
   Command=/home/$USER/dir/test.sh
   WorkDir=/home/$USER/dir
   StdErr=/home/$USER/dir/slurm-950168.out
   StdIn=/dev/null
   StdOut=/home/$USER/dir/slurm-950168.out
   Power=
   MailUser=(null) MailType=NONE

Spreminjanje nastavitev posla: scontrol update job <jobid> JobName=<jobname>:

JobId=950168 JobName=<jobname>
   UserId=<user> GroupId=<group> MCS_label=N/A
   Priority=4294624219 Nice=0 Account=nsc-users QOS=normal
   JobState=PENDING Reason=Priority Dependency=(null)
   Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0
   RunTime=00:00:00 TimeLimit=01:00:00 TimeMin=N/A
   SubmitTime=2020-07-10T12:41:14 EligibleTime=2020-07-10T12:41:14
   AccrueTime=2020-07-10T12:41:14
   StartTime=Unknown EndTime=Unknown Deadline=N/A
   SuspendTime=None SecsPreSuspend=0 LastSchedEval=2020-07-10T12:41:20
   Partition=gridlong AllocNode:Sid=ctrl:15247
   ReqNodeList=(null) ExcNodeList=(null)
   NodeList=(null)
   NumNodes=1 NumCPUs=1 NumTasks=1 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
   TRES=cpu=1,mem=1000M,node=1,billing=1
   Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=*
   MinCPUsNode=1 MinMemoryCPU=100M MinTmpDiskNode=0
   Features=(null) DelayBoot=00:00:00
   OverSubscribe=OK Contiguous=0 Licenses=(null) Network=(null)
   Command=/home/$USER/dir/test.sh
   WorkDir=/home/$USER/dir
   StdErr=/home/$USER/dir/slurm-950168.out
   StdIn=/dev/null
   StdOut=/home/$USER/dir/slurm-950168.out
   Power=
   MailUser=(null) MailType=NONE

Zamrzovanje posla: scontrol hold <jobid> – pri uporabi ukaza squeue -j <jobid> vidimo, da smo posel zamrznili.

JOBID PARTITION     NAME         USER   ST       TIME  NODES NODELIST(REASON)
950168  gridlong    <jobname>    <user> PD       0:00      1 (JobHeldUser)

Sprostitev zamrznjenega dela: scontrol release <jobid> – pri uporabi ukaza squeue -j <jobid> vidimo, da smo posel sprostili.

JOBID   PARTITION    NAME         USER   ST       TIME  NODES NODELIST(REASON)
950168  gridlong    <jobname>    <user>  R        0:19      1 nsc-gsv002

Ustavljanje posla: scancel <jobid> – primer squeue -u <userid> po ustavljanju posla:

JOBID   PARTITION    NAME         USER    ST       TIME  NODES NODELIST(REASON)
948702  gridlong     <jobname>    <user>  CG       0:31      1 nsc-gsv003

Podroben pregled prioritete poslov, ki čakajo na začetek izvajanja: sprio -l:

JOBID PARTITION     USER   PRIORITY       SITE        AGE      ASSOC  FAIRSHARE    JOBSIZE  PARTITION        QOS        NICE      TRES
959560 gridlong   gen0004    1178           0         174        0        213        145        0             0          50       cpu=50,mem=646
959561 gridlong   gen0004    1178           0         174        0        213        145        0             0          50       cpu=50,mem=646

Izbira programskega okolja za izvedbo posla

  • gruči Maister in NSC podpirata uporabo vsebnikov Singularity – vsebniki, ki so namenjeni splošni uporabi, so na voljo pod /ceph/sys/singularity na gruči Maister in pod /ceph/grid/singularity-images na gruči NSC.
  • programska oprema je na voljo tudi prek modulov (delo v teku): module avail
  • nekaj programske opreme je prevedene na lokalnih diskih, v /ceph/grid/software
  • gruči podpirata tudi CernVM-FS. Datotečni sistem je dostopen na /cvmfs
  • uporabnik ima več možnosti prilagajanja okolja za izvajanje, in sicer z uporabo Conde, vsebnikov Singularity, vsebnikov udocker

Izbira vozlišč za izvedbo posla

  • -w or --nodelist : določi vozlišča za izvedbo posla
  • -x or --exclude : izloči vozlišča pri izvajanju posla (srun --exclude=cn[01,04,08])
  • -C, --constraint=<list> : izberi tip vozlišča z določeno oznako (srun --constraint=infiniband)
  • srun -p grid ...: izbira particije
  • srun --exclusive: zagon posla v ekskluzivnem načinu

Pregled oznak vozlišč sinfo -o %n,%f

Imena vozlišč so odvisna od lokalne konvencije gruče.

Analiza napak

  • za pregled porabe virov uporabite sstat in sacct
  • -o output datoteka, kamor boste shranili stdout
  • -v verbose za vklop podrobnejšega besedilnega opisa
  • scontrol show job <jobid> za pregled statusa naloge
  • squeue -u $USER: statusi nalog

Dodatni viri: + SLURM Troubleshooting + SLURM Job Exit Codes

Tipi nalog

Zaporedne naloge

#!/bin/bash
#SBATCH --time=4:00:00
#SBATCH --job-name=steps
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=8
#SBATCH --output=job_output.%j.out
# %j bo zamenjan z ID-jem naloge
# Po privzetih nastavitvah bo srun uporabil vse vire
#(8 nalog za vsak posel)
srun ./posel.1
srun ./posel.2
srun ./posel.3

Oblike paralelizma

  • večnitni posli (angl. multithreaded jobs)
  • večjedrni posli (angl. multicore jobs)
  • nizi poslov (angl. array jobs)
  • posli čez več vozlišč (angl. multi node jobs)
  • hibridni posli (večnitni/večjedrni posli čez več vozlišč, angl. hybrid jobs)

Večnitni posli

Večnitni posli so posli, ki uporabljajo več niti na jedro. Več niti uporabimo z možnostjo --threads-per-core.

Primer večnitnega posla:

#!/bin/bash

#SBATCH --job-name=MultiThreadJob
#SBATCH --threads-per-core=2
#SBATCH --ntasks=2

srun hello.sh

Večjedrni posli

Za hitrejše izvajanje zahtevnejših poslov Slurm določi število jeder, ki jih bo uporabljal. Z možnostjo -c ali --cpus-per-task določimo, koliko procesorjev si želimo rezervirati za izvajanje posla.

Primer večjedrnega posla:

#!/bin/bash

#SBATCH --job-name=MultiCoreJob
#SBATCH --cpus-per-task=2
#SBATCH --ntasks=2

srun hello.sh

Nizi poslov

Posli čez več vozlišč

Vzporedne posle lahko izvajamo čez več vozlišč z možnostjo -N ali --nodes.

Primer posla čez več vozlišč:

#!/bin/bash

#SBATCH --job-name=MultiNodeJob
#SBATCH --nodes=2
#SBATCH --ntasks=4
#SBATCH --ntasks-per-node=2

srun hello.sh

Hibridni posli

Posli, za katere uporabljamo več jeder na različnih vozliščih, so hibridni posli.

Primer hibridnega posla:

#!/bin/bash

#SBATCH --job-name=HybridJob
#SBATCH --nodes=2
#SBATCH --ntasks=4
#SBATCH --ntasks-per-node=2
#SBATCH --cpus-per-task=3

srun hello.sh

Paralelne naloge

#!/bin/bash
#SBATCH --time=4:00:00
#SBATCH --job-name=parallel
#SBATCH --nodes=8
#SBATCH --output=job_output.%j.out
srun -N 2 -n 6 --cpu-bind=cores ./naloga.1 &
srun -N 4 -n 6 -c 2 --cpu-bind=cores ./naloga.2 &
srun -N 2 -n 6 --cpu-bind=cores ./naloga.3 &
wait

Interaktivne in grafične seje

Interaktivne seje

  • Na dodeljena vozlišča se lahko neposredno povežemo z ukazoma srun --pty bash in salloc.
  • Na vozlišča, ki nam niso bila dodeljena, se ne moremo povezati in izpiše se napaka Access denied by pam_slurm_adopt: you have no active jobs on this node.
  • Ukaz srun --pty bash nam dodeli delovna vozlišča, na katerih zažene novo lupino bash.
  • salloc deluje podobno kot srun --pty bash. Razlika je, da salloc zažene lupino bash na prijavnem vozlišču, kar je uporabno za izvajanje GUI programov, posli pa se še vedno izvajajo na dodeljenih delovnih vozliščih.
  • salloc ima tudi možnost začeti posel ob določenem času z zastavico salloc --begin.
  • Če interaktivne seje ne zaključimo, se bo izvajala do poteka časovne omejitve.

Primer na gruči NSC: srun --pty bash:

[$USER@nsc1 ~]$ srun --job-name "InteractiveJob" --cpus-per-task 1 --mem-per-cpu 1500 --time 10:00 --pty bash
srun: job <jobid> queued and waiting for resources
srun: job <jobid> has been allocated resources
bash-5.0$

Primer na gruči NSC: salloc:

[$USER@nsc1 ~]$ salloc --job-name "InteractiveJob" --cpus-per-task 1 --mem-per-cpu 1500 --time 10:00
salloc: Pending job allocation <jobid>
salloc: job <jobid> queued and waiting for resources
salloc: job <jobid> has been allocated resources
salloc: Granted job allocation <jobid>
salloc: Waiting for resource configuration
salloc: Nodes nsc-gsv001 are ready for job
bash-5.0$

Grafične seje X11

  • določeni programi zahtevajo interaktivnost in podporo za grafične vmesnike
  • SLURM neposredno podpira interaktivne seje z X11 od različice 17.11 naprej (prej je bilo treba improvizirati)
  • Gruči Maister in NSC imata možnost posredovanja X11 (angl. X11 forwarding) vključeno
  • nastavitev –x11=[batch|first|last|all] omogoča, da določimo, v kateri nalogi/koraku in na katerem vozlišču se bo aktiviralo posredovanje X11, kadar je alociranih več vozlišč in nalog (privzeta vrednost: first)

Primer na gruči Maister:

ssh -X rmaister.hpc-rivr.um.si
salloc -n1
srun -x11 ime_programa

Primer za programski paket Relion (v vsebniku Singularity):

srun --gres=gpu:4 --pty --x11=first
singularity exec --nv
/ceph/sys/singularity/relion-cuda92.sif relion

GPGPU, CUDA, OpenCL

  • Gruča Maister ima 6 vozlišč s 4 karticami Nvidia Tesla v100
  • Dve možnosti zagona poslov GPU:
    • sbatch --gres=gpu:4
    • sbatch --gpus=4 --gpus-per-node=4
  • CUDA je nameščena na sistemu in uporablja prevajalnik /usr/bin/cuda-gcc

Paralelni posli z MPI in InfiniBand

SLURM omogoča tri načine izvedbe poslov MPI:

  • Direktno z uporabo srun in API PMI2 ali PMIx
  • SLURM dodeli vire poslu, nato MPI posel zaženemo z mpirun znotraj skripte sbatch
  • SLURM dodeli vire poslu, mpirun pa zažene naloge prek SSH/RSH (teh nalog SLURM torej ne nadzira)

Nekaj možnosti:

  • #SBATCH --ntasks=16: zagnanih bo 16 MPI ranks
  • #SBATCH --cpus-per-task=1: za vsak MPI rank eno jedro
  • #SBATCH --ntasks-per-socket=8: vsako jedro 8 nalog
  • #SBATCH --nodes=1: vse bo zagnano na istem vozlišču

SLURM PMI/MPI

PMIx je razširjen vmesnik za upravljanje procesov

Različice OpenMPI Podprt PMI API
Open MPI <= 1.X PMI, ne pa PMIx
2.X <= Open MPI < 3.X PMIx 1.X
3.X <= Open MPI < 4.X PMIx 1.X in 2.X
Open MPI >= 4.X PMIx 3.X

Kateri API podpira SLURM? Preverite z srun --mpi=list.

Izbira ustrezne implementacije MPI

  • Na gruči Maister trenutno 2 modula za MPI:

  • mpi/openmpi-x86\_64: za naloge prek TCP

  • mpi/openmpi-4.0.2 (privzeti): za naloge prek IB

Ali se naloga zaganja na vozlišču s pravo strojno opremo? Pri uporabi MPI prek infinibanda je treba izbrati vozlišča, ki imajo strojno podporo za InfiniBand: --constraint=infiniband

Primeri poslov z MPI

(Lahko uporabimo tudi naslednji primer: MPI hello world.)

MPI hello world

Pripravimo čim bolj preprost program v jeziku C, ki uporablja knjižnico mpi, in ga imenujmo hello_mpi.c.

/* C Example */
#include <stdio.h>
#include <mpi.h>

int main (argc, argv)
     int argc;
     char *argv[];
{
  int rank, size;

  MPI_Init (&argc, &argv);      /* starts MPI */
  MPI_Comm_rank (MPI_COMM_WORLD, &rank);        /* get current process id */
  MPI_Comm_size (MPI_COMM_WORLD, &size);        /* get number of processes */
  printf( "Hello world from process %d of %d\n", rank, size );
  MPI_Finalize();
  return 0;
}
#!/bin/bash

#SBATCH --job-name=test-mpi
#SBATCH --output=result-mpi.txt
#SBATCH --ntasks=4
#SBATCH --time=10:00
#SBATCH --mem-per-cpu=1000

module load mpi
mpicc example.c -o hello_mpi.mpi
srun --mpi=pmix hello_mpi.mpi

mpiBench

Lahko pa uporabimo obstoječ primer, npr. mpiBench, da še preverimo, ali uporabljamo ustrezno knjižnico in strojno opremo.

Skripta sbatch, ki bo prenesla, prevedla in zagnala mpiBench v okviru posla:

#!/bin/bash
#SBATCH --job-name=test-mpi
#SBATCH --output=result-mpi.txt
#SBATCH --ntasks=4
#SBATCH --time=10:00
#SBATCH --mem-per-cpu=1000

module load mpi
git clone https://github.com/LLNL/mpiBench.git
cd mpiBench
make
srun --mpi=pmix --constraint=infiniband -n2 -N2 ./mpiBench

MPI, SLURM in Singularity

Singularity je rešitev za uporabo programske opreme v obliki vsebnikov, ki je prilagojena za uporabo v superračunalniškem okolju. Singularity omogoča uporabo prenosnih vsebnikov, ki lahko tečejo na namiznem ali prenosnem računalniku, a hkrati podpirajo napredne tehnologije, kot sta MPI in GPGPU, ter so primerni za uporabo s sistemom SLURM.

Več o vsebnikih, programski opremi in sistemu Singularity: Programska oprema na gručah

Kombinacijo Singularity in MPI lahko uporabljamo na dva načina: * če uporabljamo paralelizacijo v okviru enega vozlišča, lahko uporabimo MPI znotraj vsebnika * če posel paraleliziramo na več vozlišč, moramo uporabiti MPI na gostitelju

#MPI znotraj vsebnika
srun singularity exec centos7.sif mpirun ./hello
#MPI na več vozliščih
mpirun singularity exec centos7.sif ./hello

(Prenosljivost in soopravilnost s knjižnicami MPI in GPGPU sta deloma problematični.)

Zahtevnejši posli

SLURM podpira vrsto naprednih funkcij, s katerimi je mogoče avtomatizirati tokokrog, organizirati obdelavo podatkov, vzpostaviti medsebojne odvisnosti, omogočiti prekinitve ter ponovno zaganjanje poslov ipd.

Nizi poslov

  • Nizi poslov so uporabni, če želimo izvesti vrsto podobnih nalog.
  • Parametre lahko uporabimo za samodejno izbiranje podatkov, imen datotek ipd.
  • Uporaba je možna le z sbatch
sbatch --array=1-3 -N1 slurm_skripta.sh

 #npr., da bo ustvarjena naloga z ID 101

Zagnani bodo naslednji nizi:

 # array index 1
SLURM_<jobid>=101
SLURM_ARRAY_JOB_ID=42
SLURM_ARRAY_TASK_ID=1

# array index 2
SLURM_<jobid>=102
SLURM_ARRAY_JOB_ID=101
SLURM_ARRAY_TASK_ID=2

# array index 3
SLURM_<jobid>=103
SLURM_ARRAY_JOB_ID=102
SLURM_ARRAY_TASK_ID=3

Zagon naloge:

#!/bin/bash
#SBATCH --nodes=1
#SBATCH --output=program-%A_%a.out
#SBATCH --error=program-%A_%a.err
#SBATCH --time=00:30:00
#SBATCH --array=101-103

srun --ntasks-per-node=24 \
  ./program input_${SLURM_ARRAY_TASK_ID}.txt

Odvisnost poslov (dependencies)

  • koncept odvisnosti poslov omogoča preproste delotoke
  • odvisnosti omogočajo upravljanje s kapacitetami in posli v okviru alokacije
  • zagon z uporabo #SBATCH --dependency=<type> ima več možnosti
    • after:jobID: po tem, ko se začne naloga jobID
    • afterany:jobID: po tem, ko se konča jobID
    • afterok:jobID: po tem, ko se jobID konča uspešno
    • afternotok:jobID: po tem, ko se jobID konča neuspešno
    • singleton: po katerikoli nalogi z istim imenom

Druge zahtevnejše možnosti

SLURM omogoča še vrsto naprednih možnosti, kot so:

Dobre prakse

Med seboj povezane naloge je smiselno izvajati v isti alokaciji oz. kot del istega posla. Posamezne naloge/koraki so lahko različni, razporeditev bremena je bolj logična, obremenitev sistema manjša.

Naloge z identičnimi potrebami po virih in obliko klicanja je smiselno oblikovati kot nize nalog. Večina ukazov lahko upravlja s celotnim poslom ali posamezno nalogo v nizu.

Če uporabljate SLURM, se morate prilagoditi nastavitvam gruče ter prijavnega vozlišča ter slediti navodilom administratorjev gruče. (Pri uporabi ARC je dodatna stopnja abstrakcije, ki omogoča bolj primerljiv način uporabe.)

  • Gruča Maister:
    • Večji začasni prostor na zahtevo na /data1
    • Večji I/O: na zahtevo /ceph/grid/data (ali ARC)
    • Več krajših nalog je bolje od ene dolge (trenutno particija long)

Viri in povezave