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
wn111.arnes.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
wn111.arnes.si
wn111.arnes.si
wn111.arnes.si
wn111.arnes.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 (wn111.arnes.si
).
Seveda lahko naše naloge razdelimo tudi med več vozlišč. To storimo na naslednji način:
$ srun --nodes=2 --ntasks=4 hostname
wn111.arnes.si
wn111.arnes.si
wn112.arnes.si
wn112.arnes.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 |
|
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 ukazasqueue
,--partition=all
: particija, znotraj katere želimo naš posel zagnati,--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 formatuure: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
wn111.arnes.si
wn111.arnes.si
wn111.arnes.si
wn111.arnes.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 52936564
salloc: Waiting for resource configuration
salloc: Nodes wn111 are ready for job
$ srun hostname
wn111.arnes.si
wn111.arnes.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 52936565
salloc: Waiting for resource configuration
salloc: Nodes wn111 are ready for job
$ ssh wn11
$ hostname
wn111.arnes.si
$ exit
$ exit
salloc --time=00:05:00 --ntasks=1
ssh wn111
hostname
exit
exit
Na vozlišču wn111
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.