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.)
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 preksbatch
, 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
alisbatch
- 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
alisrun/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 virigres
, 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 $USERsqueue -p gridlong
naloge v vrsti gridlongsqueue -t PD
posli, ki čakajo v vrstisqueue -j <jobid> --start
predviden čas začetka izvajanja poslasinfo
status vrste/particije,sinfo -l -N
podrobne informacijesinfo -T
prikaz rezervacijscontrol 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 poselscontrol hold
: začasno zaustavi poselscontrol release
: sprosti poselscancel
: prekliči poselsprio
: 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 particijesrun --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
insacct
-o output
datoteka, kamor boste shranili stdout-v verbose
za vklop podrobnejšega besedilnega opisascontrol show job <jobid>
za pregled statusa nalogesqueue -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
insalloc
. - 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 kotsrun --pty bash
. Razlika je, dasalloc
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 zastavicosalloc --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
- Najprej potrebujemo knjižnice MPI:
- Pregled modulov:
module avail
- Naložimo modul MPI:
module load mpi
- Pregled modulov:
- Primer MPI
hellompi
lahko prenesete iz Wikipedije: http://en.wikipedia.org/wiki/Message_Passing_Interface#Example_program - In ga prevedete z:
mpicc wiki-mpi-example.c -o hello.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žnostiafter:jobID
: po tem, ko se začne naloga jobIDafterany:jobID
: po tem, ko se konča jobIDafterok:jobID
: po tem, ko se jobID konča uspešnoafternotok:jobID
: po tem, ko se jobID konča neuspešnosingleton
: po katerikoli nalogi z istim imenom
Druge zahtevnejše možnosti
SLURM omogoča še vrsto naprednih možnosti, kot so:
- heterogeni posli, pri katerih lahko z eno alokacijo upravljate z različnimi nalogami ter tako izboljšate izkoristek virov: https://slurm.schedmd.com/heterogeneous_jobs.html
- nadzor nad nitenjem, distribucijo med jedri, vmesnim pomnilnikom in procesorji ter drugimi opcijami, s katerimi lahko močno izboljšate delovanje večnitnih in pomnilniško intenzivnih aplikacij (zahteva natančno razumevanje arhitekture gruče ter konfiguracije sistema): https://slurm.schedmd.com/mc_support.html
- možnosti za vezanje virov (resource binding): https://slurm.schedmd.com/resource_binding.html
- alternativne možnosti za podporo paralelizacije in MPI: https://slurm.schedmd.com/mpi_guide.html
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)
- Večji začasni prostor na zahtevo na