Skoči na vsebino

Zaganjanje poslov na gruči

V nadaljevanju si bomo ogledali ukaze srun, sbatch in salloc za zaganjanje poslov in ukaz scancel za prekinitev izvajanja posla.

Ukaz srun

Najenostavnejši način je z ukazom srun. Ukazu sledijo različna stikala, s katerimi določamo količino in tip strojnih virov, ki jih naš posel potrebuje ter razne druge nastavitve. Na povezavi (dokumentacija) je na voljo podrobna razlaga vseh možnosti, ki jih imamo na voljo. Pogledali si bomo nekaj najbolj osnovnih in najpogosteje uporabljanih.

Uporaba rezervacije

Za delavnico je začasno rezerviranih nekaj vozlišč, na katerih nihče drug ne more zaganjati svojih poslov. Rezervacijo izberemo s pomočjo stikala --reservation=fri. Če rezervacija ne obstaja, omenjenega stikala ne dodajamo.

Za začetek bomo kot naš posel pognali preprost sistemski program hostname, ki izpiše ime vozlišča, na katerem se je izvedel. Primer zagona programa hostname, na enem izmed računskih vozlišč:

$ srun --ntasks=1 hostname
nsc-msv002.ijs.si
srun --ntasks=1 hostname

V ukazni vrstici smo uporabili stikalo --ntasks=1. Z njim povemo, da je naš posel sestavljen iz ene same naloge; želimo, da se zažene en sam primerek programa hostname. Slurm nam samodejno dodeli eno izmed procesorskih jeder v gruči in na njem izvede posel. Stikalo --ntasks=1 lahko nadomestimo tudi s krajšim zapisom -n 1.

V naslednjem koraku lahko poskusimo znotraj našega posla pognati več nalog:

$ srun --ntasks=4 hostname
nsc-msv002.ijs.si
nsc-msv002.ijs.si
nsc-msv002.ijs.si
nsc-msv002.ijs.si
srun --ntasks=4 hostname   

Takoj opazimo razliko v izpisu. Sedaj so se znotraj našega posla izvedle štiri enake naloge. Izvedle so se na štirih različnih procesorskih jedrih, ki se nahajajo na istem računskem vozlišču (nsc-msv002.ijs.si).

Seveda lahko naše naloge razdelimo tudi med več vozlišč. To storimo na naslednji način:

$ srun --nodes=2 --ntasks=4 hostname
nsc-fp005.ijs.si
nsc-fp005.ijs.si
nsc-msv002.ijs.si
nsc-msv002.ijs.si
srun --nodes=2 --ntasks=4 hostname

Sedaj smo za naš posel zahtevali dve vozlišči in na njih zagnali 4 naloge. Iz izpisa vidimo, da je Slurm naše naloge enakomerno porazdelil med obe vozlišči.

Naš posel lahko med izvajanjem vedno prekinemo s kombinacijo tipk Ctrl+C.

Ukaz sbatch

Slabost ukaza srun je, da nam blokira ukazno vrstico, dokler se naš posel ne zaključi. Poleg tega je z njim nerodno zaganjati kompleksnejše posle z množico nastavitev. V takih primerih raje uporabimo ukaz sbatch, pri čemer nastavitve posla in posamezne naloge znotraj našega posla zapišemo v skriptno datoteko bash.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/bash
#SBATCH --job-name=my_job_name
#SBATCH --partition=gridlong
#SBATCH --ntasks=4
#SBATCH --nodes=1
#SBATCH --mem-per-cpu=100MB
#SBATCH --output=my_job.out
#SBATCH --time=00:01:00

srun hostname
job.sh

V zgornjem okvirčku imamo primer take skripte. Na vrhu skripte imamo komentar #!/bin/bash, ki ukazni vrstici pove, da gre za skriptno datoteko bash. Nato sledijo po vrsticah nanizane nastavitve našega posla, ki imajo vedno predpono #SBATCH. Kako določimo rezervacijo, število nalog in število vozlišč za naš posel (--reservation, --ntasks in --nodes) smo si pogledali že pri ukazu srun. Razložimo še ostale nastavitve:

  • --job-name=ime_mojega_posla: ime posla, ki se izpiše, ko naredimo poizvedbo s pomočjo ukaza squeue,
  • --partition=gridlong: particija, znotraj katere želimo naš posel zagnati (na gruči NSC je samo ena particija, zato lahko to nastavitev tudi izpustimo),
  • --mem-per-cpu=100MB: količina sistemskega pomnilnika, ki ga potrebuje naš posel za posamezno nalogo (gledano na procesorsko jedro),
  • --output=moj_posel.out: ime datoteke, v katero se zapiše vsebina, ki bi jo naš posel izpisal na standardni izhod (zaslon),
  • --time=00:01:00: časovno omejitev našega posla v formatu ure:minute:sekunde.

Namig

Nastavljanje časovne omejitve je dobra praksa, saj s tem olajšamo delo razvrščevalniku poslov. Kadar razvrščevalnik pozna trajanje našega posla, nam lažje in prej najde proste vire.

Sledi zagon naše naloge, ki je enaka kot v prejšnjih primerih (hostname).

Vsebino v zgornjem okvirčku shranimo v datoteko, na primer job.sh, in posel zaženemo:

$ sbatch ./job.sh
Submitted batch job 387508
sbatch ./job.sh  

Opazimo lahko, da nam je ukaz izpisal identifikator našega posla in nam takoj vrnil nadzor nad ukazno vrstico. Ko se posel zaključi (kdaj, lahko preverimo s pomočjo ukaza squeue), se nam bo v trenutni mapi ustvarila datoteka my_job.out, v kateri bo izpis rezultata izvajanja.

$ cat ./my_job.out
nsc-msv002.ijs.si
nsc-msv002.ijs.si
nsc-msv002.ijs.si
nsc-msv002.ijs.si
cat ./mmy_job.out 

Posebnost ukaza srun

Ukaz srun nastopa v dveh različnih vlogah. V zgornji skripti nam služi za zaganjanje posameznih nalog znotraj posla, v prejšnjih primerih pa smo z njim naredili celotno konfiguracijo in zagon posla.

Ukaz scancel

Posle, ki smo jih zagnali z ukazom sbatch, lahko med izvajanjem prekinemo z ukazom scancel. Navesti moramo le ustrezni identifikator posla (JOBID).

$ scancel 387508
scancel 387508

Ukaz salloc

Tretji način zaganjana poslov je s pomočjo ukaza salloc. Z njim naprej napovemo koliko računskih kapacitet bomo potrebovali za naše naloge, potem pa posle zaganjamo neposredno iz ukazne vrstice z ukazom srun. Prednost uporabe ukaza salloc je v tem, da nam ob zaganjanju poslov z srun, ni potrebno vsakič posebej čakati na proste kapacitete. Tudi pri ukazu salloc se uporabljajo enaka stikala za konfiguracijo kot pri ukazih srun in sbatch. Če rezervacijo virov naredimo z ukazom salloc, nam potem pri ukazu srun ni potrebno neprestano navajati vseh zahtev.

Primer zaganjanja dveh instanc programa hostname na enem vozlišču:

$ salloc --time=00:01:00 --ntasks=2
salloc: Granted job allocation 389035
salloc: Waiting for resource configuration
salloc: Nodes nsc-msv002 are ready for job
$ srun hostname
nsc-msv002.ijs.si
nsc-msv002.ijs.si
$ exit
salloc --time=00:01:00 --ntasks=2
srun hostname
exit

Pri uporabi ukaza salloc deluje srun podobno kot pri uporabi sbatch. Z njegovo pomočjo na že pridobljenih računskih kapacitetah zaganjamo naše naloge. Pridobljene računske kapacitete sprostimo tako, da po koncu izvajanja v ukazni vrstici zaženemo exit.

Ukaz salloc nam ponuja še eno zanimivo možnost izkoriščanja računskih vozlišč. Z njim lahko pridobimo kapacitete na nekem računskem vozlišču, se nanj povežemo preko protokola SSH in nato ukaze izvajamo neposredno na vozlišču.

$ salloc --time=00:05:00 --ntasks=1
salloc: Granted job allocation 389039
salloc: Waiting for resource configuration
salloc: Nodes nsc-fp005 are ready for job
$ ssh nsc-fp005
$ hostname
nsc-fp005.ijs.si
$ exit
$ exit
salloc --time=00:05:00 --ntasks=1
ssh nsc-fp005
hostname
exit
exit

Na vozlišču nsc-fp005 smo zagnali program hostname, ki izpiše ime vozlišča. Po končanem delu na računskem vozlišču se vrnemo nazaj na vstopno vozlišče s pomočjo ukaza exit. Tu potem še enkrat izvedemo exit, da sprostimo kapacitete, ki smo jih zasedli z ukazom salloc.

Vaja

Na povezavi najdete naloge za utrditev znanja o ukazih za zaganjanje poslov na gruči.