...
Za raspoređivanje i upravljanje poslovima na računalnom klasteru SupekPadobran, koristi se PBS Pro (Portable Batch System Professional) koji obavlja raspoređivanje poslova unutar klastera. Njegova primarna zadaća je raspodjela računalnih zadataka, tj. paketnih poslova, među dostupnim računalnim resursima.
U ovom dokumentu opisano je korištenje PBS Pro 202222.105.1 verzije.
...
title | Korištenje GPU-a |
---|
...
11 verzije
Izvođenje poslova
Korisničke aplikacije (u nastavku poslovi) koji se pokreću pomoću sustava PBS moraju biti opisani startnom shell skritpom (sh, bash, zsh...). Unutar startne skripte iznad normalnih naredbi, navode se PBS parametri. Te parametre moguće je navesti i prilikom podnošenja posla.
...
Code Block | ||
---|---|---|
| ||
qsub -q cpu -l walltime=10:00:00 -l select=1:ncpus=4:mem=10GB moj_posao.pbs |
...
Code Block | ||
---|---|---|
| ||
# pokreni qsub [korisnik@x3000c0s25b0n0korisnik@padobran:~] $ qsub Job script will be read from standard input. Submit with CTRL+D. echo "Hello world" 14571.x3000c0s25b0n0.hsn.hpc.srce.hr # ispiši sadržaj direktorija [korisnik@x3000c0s25b0n0korisnik@padobran:~] $ ls -l total 5140716 -rw------- 1 korisnik hpc 0 Jun 1 07:44 STDIN.e14571 -rw------- 1 korisnik hpc 12 Jun 1 07:44 STDIN.o14571 # ispiši sadržaj izlazne datoteke [korisnik@x3000c0s25b0n0korisnik@padobran:~] $ cat STDIN.o14571 Hello world |
...
Code Block | ||
---|---|---|
| ||
# ispiši datoteku hello.sh [korisnik@x3000c0s25b0n0korisnik@padobran:~] $ cat hello.sh #!/bin/bash #PBS -N hello echo "Hello world" # podnošenje skripte posla [korisnik@x3000c0s25b0n0korisnik@padobran:~] $ qsub hello.sh 14572.x3000c0s25b0n0.hsn.hpc.srce.hr # ispis sadržaja direktorija [korisnik@x3000c0s25b0n0korisnik@padobran:~] $ ls -l total 5140721 -rw------- 1 korisnik hpc 0 Jun 1 07:44 STDIN.e14571 -rw------- 1 korisnik hpc 12 Jun 1 07:44 STDIN.o14571 -rw------- 1 korisnik hpc 0 Jun 1 08:02 hello.e14572 -rw------- 1 korisnik hpc 12 Jun 1 08:02 hello.o14572 -rw-r--r-- 1 korisnik hpc 46 Jun 1 07:55 hello.sh # ispis sadržaja datoteke [korisnik@x3000c0s25b0n0korisnik@padobran:~] $ cat hello.o14572 Hello world |
...
Code Block | ||
---|---|---|
| ||
# hostname na pristupnom poslužitelju [korisnik@x3000c0s25b0n0korisnik@padobran:~] $ hostname x3000c0s25b0n0padobran.srce.hr # otvaranje interaktivne sjednice [korisnik@x3000c0s25b0n0korisnik@padobran:~] $ qsub -I -N hello-interactive qsub: waiting for job 14574.x3000c0s25b0n0.hsn.hpc.srce.hr106.admin to start qsub: job 14574.x3000c0s25b0n0.hsn.hpc.srce.hr106.admin ready # hostname na glavnom radnom čvoru [korisnik@x8000c0s3b0n0korisnik@node034:~] $ hostname x8000c0s3b0n0node034.padobran |
U slučaju polja poslova, korištenjem opcije qsub -J X-Y[:Z]
možemo podnijeti zadani broj identičnih poslova u rangu X
do Y
s korakom Z
:
Code Block | ||
---|---|---|
| ||
# podnošenje polja poslova [korisnik@x3000c0s25b0n0korisnik@padobran:~] $ qsub -J 1-10:2 hello.sh sh 14575107[].x3000c0s25b0n0.hsn.hpc.srce.hradmin # ispis sadržaja datoteke [korisnik@x3000c0s25b0n0korisnik@padobran:~] $ ls -l total 5140744 -rw------- 1 korisnik hpc 0 Jun 1 07:44 STDIN.e14571 -rw------- 1 korisnik hpc 12 Jun 1 07:44 STDIN.o14571 -rw------- 1 korisnik hpc 0 Jun 1 08:02 hello.e14572 -rw------- 1 korisnik hpc 0 Jun 1 08:21 hello.e14575.1 -rw------- 1 korisnik hpc 0 Jun 1 08:21 hello.e14575.3 -rw------- 1 korisnik hpc 0 Jun 1 08:21 hello.e14575.5 -rw------- 1 korisnik hpc 0 Jun 1 08:21 hello.e14575.7 -rw------- 1 korisnik hpc 0 Jun 1 08:21 hello.e14575.9 -rw------- 1 korisnik hpc 12 Jun 1 08:02 hello.o14572 -rw------- 1 korisnik hpc 12 Jun 1 08:21 hello.o14575.1 -rw------- 1 korisnik hpc 12 Jun 1 08:21 hello.o14575.3 -rw------- 1 korisnik hpc 12 Jun 1 08:21 hello.o14575.5 -rw------- 1 korisnik hpc 12 Jun 1 08:21 hello.o14575.7 -rw------- 1 korisnik hpc 12 Jun 1 08:21 hello.o14575.9 -rw-r--r-- 1 korisnik hpc 46 Jun 1 07:55 hello.sh |
...
Code Block | ||||
---|---|---|---|---|
| ||||
#!/bin/bash #PBS -P testni_primjer #PBS -e /home/moj_direktorij #PBS -q cpu #PBS -e /home/moj_direktorijl walltime=00:01:00 #PBS -l select=21:ncpus=10 module load gcc/12.1.0mpi/openmpi-x86_64 gccmpicc --version |
Osnovni PBS parametri
...
Code Block | ||||
---|---|---|---|---|
| ||||
#!/bin/bash
#PBS -q cpu
#PBS -l walltime=00:01:00
#PBS -l select=1:ncpus=2
#PBS -M <ime>@srce.hr,<ime2>@srce.hr
#PBS -m be
echo $PBS_JOBNAME > out
echo $PBS_O_HOST |
...
Code Block | ||||
---|---|---|---|---|
| ||||
PBS Job Id: 2686.x3000c0s25b0n0.hsn.hpc.srce.hr110.admin Job Name: pbs.pbs Begun execution |
...
Code Block | ||||
---|---|---|---|---|
| ||||
PBS Job Id: 2686.x3000c0s25b0n0.hsn.hpc.srce.hr110.admin Job Name: pbs.pbs Execution terminated Exit_status=0 resources_used.cpupercent=0 resources_used.cput=00:00:00 resources_used.mem=0kb resources_used.ncpus=2 resources_used.vmem=0kb resources_used.walltime=00:00:01 |
...
-l select=3:ncpus=2 | Traženje 3 komada(chunk-a) čvora po 2 jezgre (ukupno 6 jezgri) |
-l select=1:ncpus=10:mem=20GB | Traženje 1 komada(chunka-a) čvora sa 10 jezgri i 20GB radne memorije |
-l ngpus=2 | Traženje 2 gpu-a |
-l walltime=00:10:00 | Maksimalno vrijeme izvršenja posla. Više na redovi poslova |
PBS varijable okoline
Ime | Opis |
---|---|
PBS_JOBID | Identifikator posla koji daje PBS kada se posao preda. Stvoreno nakon izvršenja naredbe qsub. |
PBS_JOBNAME | Naziv posla koji je dao korisnik. Zadani naziv je naziv podnešene skripte. |
PBS_NODEFILE | Popis radnih čvorova, odnosno procesorskih jezgri na kojima se izvršava posao |
PBS_O_WORKDIR | Radni direktorij u kojem je podnesen posao, odnosno u kojem je pozvana naredba qsub. |
OMP_NUM_THREADS | OpenMP varijabla koju PBS izvozi u okolinu, a koja je jednaka vrijednosti opcije ncpus iz zaglavlja PBS skripte |
NCPUS | Broj zatraženih jezgara. Odgovara vrijednosti iz opcije ncpus iz zaglavlja PBS skripte. |
TMPDIR | Putanja do scratch privremenog direktorija. |
Tip | ||
---|---|---|
| ||
Dok je u PBS pro određena putanja za output i error datoteke u direktoriju u kojem se izvode, input i output datoteke samog programa se zadano učitavaju/spremaju u $HOME direktorij. PBS Pro nema opciju određivanja izvođenja posla u trenutnom direktoriju u kojem se nalazimo stoga je potrebno ručno promijeniti direktorij. Poslije Ako se želite prebaciti u direktorij u kojem je pokrenuta skripta, poslije zaglavlja potrebno je napisati: cd $PBS_O_WORKDIR Prebacit će izvođenje posla u direktorij u kojem je pokrenuta skripta. |
Paralelni poslovi
OpenMP paralelizacija
Ukoliko Vaša aplikacija koristi paralelizaciju isključivo na razini OpenMP dretvi (engl. threads) i ne može se širiti van jednog radnog čvora (odnosno radi s dijeljenom memorijom), posao možete pozvati na način kako je prikazano u primjeru xTB aplikacije niže.
Tip |
---|
OpenMP aplikacije zahtjevaju definiranje varijable PBS sustav vodi računa o tome umjesto Vas, te joj pridružuje vrijednost varijable |
Code Block | ||||
---|---|---|---|---|
| ||||
#!/bin/bash
#PBS -q cpu
#PBS -l ncpus=8
cd ${PBS_O_WORKDIR}
xtb C2H4BrCl.xyz --chrg 0 --uhf 0 --opt vtight |
MPI paralelizacija
Ukoliko Vaša aplikacija koristi paralelizaciju isključivo na razini MPI procesa i može se širiti van jednog radnog čvora (odnosno radi s raspodijeljenom memorijom), posao možete pozvati na način kako je prikazano u primjeru Quantum ESPRESSO aplikacije niže.
Ako želite pokretati poslove visokog opterećenja spremišta (I/O zahtjevni) izvođenje posla ne preporuča se pokretanje iz $PBS_O_WORKDIR-a već sa $TMPDIR lokacije čime će se iskoristiti brzo spremište. U nastavku pročitajte više o korištenju brzog spremišta i privremenim rezultatima. |
Dodjeljivanje resursa poslovima
PBS omogućava definiranje potrebnih resursa na nekoliko načina. Glavna jednica za dodjeljivanje resursa je takozvani "Chunk" ili komad čvora. Chunk se definira s opcijom select. Broj procesorskih jezgri po chunk-u moguće je definirati s ncpus, broj mpi procesa s mpiprocs i količinu radne memorije s mem. Također moguće je definirati walltime (maksimalno vrijeme izvođenja posla) i place (način raspoređivanje chunk-ova po čvorovima).
Ako neki od parametara nisu definirani koristiti će se defaultne vrijednost:
Parametar | Defaultna vrijednost |
---|---|
select | 1 |
ncpus | 1 |
mpiprocs | 1 |
mem | 3500 MB |
walltime | 48:00:00 |
place | pack |
Kontrola memorije pomoću cgrupa
Osim za kontrolu korištenja procesora, cgrupe postavljene su da kontroliraju i potrošnju memorije. To znači da su poslovi koje korisnik pokreće ograničeni na traženu količinu memorije. Ako posao pokuša iskoristiti više memorije nego je to zatraženo u opisu posla, sustav će prekinuti taj posao i u izlaznu error datoteku zapisati:
Code Block | ||||
---|---|---|---|---|
| ||||
-bash: line 1: PID Killed /var/spool/pbs/mom_priv/jobs/JOB_ID.SC
Cgroup mem limit exceeded: oom-kill:constraint=CONSTRAINT_MEMCG,nodemask=(null),cpuset=_JOB_ID,mems_allowed=0,oom_memcg=/pbs_jobs.service/jobid/JOB_ID,task_memcg=/pbs_jobs.service/jobid/JOB_ID,task=JOB_ID,pid=PID,uid=UID
|
Kod svakog posla ova poruka bit će malo drugačija, jer sadrži podatke kao što su UID (jedinstvena brojčana oznaka korisnika), PID( brojčana oznaka procesa koji je ubijen), JOB_ID (ID posla koji dodijeljuje PBS).
Dodjeljivanje po traženom chunku
Primjeri:
Korisnik traži dva chunka od kojih se svaki sastoji od 10 procesorskih jezgara i 10GB RAM-a, s time da korisnik nije specificirao na koliko čvorova već će sustav optimizirati dodijelu. U ovom slučaju korisnik će na korištenje dobiti 20 procesorskih jezgara i 20 GB radne memorije.
Code Block | ||||
---|---|---|---|---|
| ||||
#PBS -l select=2:ncpus=10:mem=10GB |
Korisnik traži 10 chunkova od kojih se svaki sastoji od jedne procesorske jezgre i 1 GB RAM-a, ali s uvjetom na jednom čvoru, pa će korisnik dobiti ukupno 10 procesorskih jezgara i 10 GB RAM-a.
Code Block | ||||
---|---|---|---|---|
| ||||
#PBS -l select=10:ncpus=1:mem=1GB:place=pack |
U gornjim primjerima poslovi su definirani kroz količinu chunkova, jezgara i memorije, ali sustav dozvoljava da se poslovima dodjeljuju resursi ako oni nisu zatraženi (default resursi):
Code Block | ||||
---|---|---|---|---|
| ||||
#PBS -l ncpus=4
#PBS -l mem=14GB |
U ovom slučaju korisnik dobiva 4 procesorske jezgre i ukupno 14GB memorije na jednom chunku. Kad se poslovi opisuju bez opcije select, nije moguće "ulančavanje resursa" (odvajanje traženih resursa dvotočkom, potrebno je za svaki resurs staviti u novi red -l opciju)
Tip | ||
---|---|---|
| ||
Ako definirate poslove koristeći ncpus bez opcije select, poželjno je definirati i količinu memorije, jer će u suprotnom dostupna radna memorija iznositi 3500 MB. |
Spremanje privremenih rezultata
Za spremanje privremenih rezultata koji se generiraju tijekom izvođenja može se koristiti $TMPDIR direktorij umjesto $HOME direktorija. Korištenjem $TMPDIR-a iskorištava se brzo spremište (BeeGFS-fast) rezervirano za pohranu privremenih datoteka.
PBS za svaki pojedini posao kreira privremeni direktorij na adresi pohranjenoj u varijabli $TMPDIR (/beegfs-fast/scratch/<jobID>).
Warning |
---|
Privremeni direktorij se briše automatski po završetku izvođenja posla! |
Primjeri korištenja
- Primjer jednostavnog korištenja $TMPDIR varijable:
Code Block #!/bin/bash #PBS -q cpu #PBS -l walltime=00:00:05 cd $TMPDIR pwd > test cp test $PBS_O_WORKDIR
- Primjer kopiranja ulaznih podataka u $TMPDIR, pokretanje aplikacije, i kopiranje u radni direktorij:
Code Block #!/bin/bash #PBS -q cpu #PBS -l walltime=00:00:05 # Stvaranja direktorija za ulazne podatke u privremenom direktoriju mkdir -p $TMPDIR/data # Kopirati sve potrebne inpute u privremeni direktorij cp -r $HOME/data/* $TMPDIR/data # Pokrenuti aplikaciju i preusmjeriti outpute u "aktualni" (privremeni) direktorij cd $TMPDIR <izvršna naredba aplikacije> 1>output.log 2>error.log # Kopirati željeni output u radni direktorij cp -r /$TMPDIR/output $PBS_O_WORKDIR
Paralelni poslovi
OpenMP paralelizacija
Ako Vaša aplikacija koristi paralelizaciju isključivo na razini OpenMP dretvi (engl. threads) i ne može se širiti van jednog radnog čvora (odnosno radi s dijeljenom memorijom), posao možete pozvati na način kako je prikazano u primjeru xTB aplikacije niže.
Tip |
---|
OpenMP aplikacije zahtjevaju definiranje varijable PBS sustav vodi računa o tome umjesto Vas, te joj pridružuje vrijednost varijable Ako definirate poslove koristeći ncpus bez opcije select, poželjno je definirati i količinu memorije, jer će u suprotnom dostupna radna memorija iznositi 3500 MB (select x mem → 1 x 3500 MB) |
Tip |
Vrijednost varijable |
Code Block | ||||
---|---|---|---|---|
| ||||
#!/bin/bash #PBS -q cpu #PBS -l walltime=10:00:00 #PBS -l select=16ncpus=8:mem=28GB cd ${PBS_O_WORKDIR} mpiexecxtb pw.x -i calcite.in |
MPI + OpenMP (hibridna) paralelizacija
C2H4BrCl.xyz --chrg 0 --uhf 0 --opt vtight |
MPI paralelizacija
Ako Vaša aplikacija koristi paralelizaciju isključivo na razini MPI procesa i može se širiti van jednog radnog čvora (odnosno radi s raspodijeljenom memorijom), posao možete Ukoliko se Vaša aplikacije može paralelizirati hibridno, odnosno dijeliti svoje MPI procese u OpenMP threadove, možete posao pozvati na način kako je prikazano u primjeru GROMACS aplikacije niže:Quantum ESPRESSO aplikacije niže. Za izvođenje aplikacija koje koriste paralelizaciju MPI (ili hibridno MPI+OMP) potrebno je učitati mpi modul prije pozivanja naredbe mpiexec ili mpirun.
Tip |
---|
Tip |
Vrijednost varijable |
...
Code Block | ||||
---|---|---|---|---|
| ||||
#!/bin/bash #PBS -q cpu-q cpu #PBS -l walltime=10:00:00 #PBS -l select=8:ncpus=416 module load mpi/openmpi-x86_64 cd ${PBS_O_WORKDIR} mpiexec -d ${OMP_NUM_THREADS} --cpu-bind depth gmx mdrun -v -deffnm md |
cray-pals
Za izvođenje aplikacija koje koriste paralelizaciju MPI (ili hibridno MPI+OMP) potrebno je podignuti modul cray-pals
prije pozivanja naredbe mpiexec
, čime se osigurava ispravna integracija aplikacije sa sustavom za podnošenje poslova PBS Pro i Crayevom inačicom aplikacije MPI mpiexec
baziranoj na implementaciji MPICH.
...
pw.x -i calcite.in |
MPI + OpenMP (hibridna) paralelizacija
Ako se Vaša aplikacije može paralelizirati hibridno, odnosno dijeliti svoje MPI procese u OpenMP threadove, možete posao pozvati na način kako je prikazano u primjeru GROMACS aplikacije niže:
Tip |
---|
OpenMP aplikacije zahtijevaju definiranje varijable Vrijednost varijable |
Code Block | ||||
---|---|---|---|---|
| ||||
#!/bin/bash #PBS -q cpu #PBS -l walltime=10:00:00 #PBS -l select=8:ncpus=2=4:mem=14GB module load cray-pals mpiexec -np 2 moja_aplikacija_MPI |
Varijable okoliša koje će naredba mpiexec podesiti na svakom od rangova MPI biti će:
...
Note | ||
---|---|---|
| ||
Znanstvene aplikacije koje su dostupne na Supeku putem modulefiles alata u sebi već pozivaju ovaj modul, stoga ga nije potrebno opet podizati.mpi/openmpi-x86_64
cd ${PBS_O_WORKDIR}
mpiexec -d ${OMP_NUM_THREADS} --cpu-bind depth gmx mdrun -v -deffnm md |
Praćenje i upravljanje izvođenja posla
...
Izvršavanjem naredbe qstat bez dodatnih opcija dobiva se ispis svih trenuthi trenutnih poslova svih korisnika:
Code Block | ||
---|---|---|
| ||
Job id Name User Time Use S Queue ---------------- ---------------- ---------------- -------- - ----- 2663.x3000c0s25b*111.admin mpi+omp_s kmrkalj 00:36:09 R cpu |
...
Code Block | ||
---|---|---|
| ||
$ tracejob 2670111 Job: 2670.x3000c0s25b0n0.hsn.hpc.srce.hr111.admin 03/30/2023 11:23:24 L Considering job to run 03/30/2023 11:23:24 S Job Queued at request of mhrzenja@x3000c0s25b0n0.hsn.hpc.srce.hrmhrzenja@node034, owner = mhrzenja@x3000c0s25b0n0.hsn.hpc.srce.hrmhrzenja@node034, job name = mapping, queue = cpu 03/30/2023 11:23:24 S Job Run at request of Scheduler@x3000c0s25b0n0.hsn.hpc.srce.hrScheduler@node034 on exec_vnode (x8000c0s0b0n0node034:ncpus=40:mem=104857600kb) 03/30/2023 11:23:24 L Job run 03/30/2023 11:23:24 S enqueuing into cpu, state Q hop 1 03/30/2023 11:23:56 S Holds u set at request of mhrzenja@x3000c0s25b0n0.hsn.hpc.srce.hrmhrzenja@node034 03/30/2023 11:24:22 S Holds u released at request of mhrzenja@x3000c0s25b0n0.hsn.hpc.srce.hrmhrzenja@node034 |
Upravljanje poslovima
Poslom se može upravljati i nakon pokretanja.
...
-
after*
- pokretanje trenutnog s obzirom na ostale-
after
- izvršavanje trenutnog nakon početka izvršavanja navedenih -
afterok
- izvršavanje trenutnog nakon uspješnog završetka navedenih -
afternotok
-izvršavanje trenutnognakon greške u završetku navedenih -
afterany
- izvršavanje trenutnog nakon završetka navedenih
-
-
before*
- pokretanje ostalih s obzirom na trenutni-
before
- pokretanjenavedenih nakon početka trenutnog -
beforeok
- pokretanjenavedenih nakon usprešnog uspješnog završetka trenutnog -
beforenotok
- pokretanjenavedenih nakon greške u izvršavanju trenutnog -
beforeany
- pokretanjenavedenih nakon završetka trenutnog
-
-
on:<broj>
- izvršavanje posla koji će ovisiti o naknadno navedenom brojubefore*
tipa poslova
...
Ako želimo da posao1
započne nakon uspješnog završetka posao0
:
Code Block |
---|
[korisnik@x3000c0s25b0n0korisnik@padobran] $ qsub posao0 1000.x3000c0s25b0n0.hsn.hpc.srce.hradmin [korisnik@x3000c0s25b0n0korisnik@padobran] $ qsub -W depend=afterok:1000 posao1 1001.x3000c0s25b0n0.hsn.hpc.srce.hr.admin [korisnik@x3000c0s25b0n0korisnik@padobran] $ qstat 1000 1001 Job id Name User Time Use S Queue --------------------- ---------------- ---------------- -------- - ----- 1000.x3000c0s25b0n0admin posao0 korisnik 00:00:00 R cpu 1001.x3000c0s25b0n0admin posao1 korisnik 0 H cpu |
Ako želimo da posao0
započne tek nakon uspješnog završetka posao1
:
Code Block |
---|
[korisnik@x3000c0s25b0n0korisnik@padobran] $ qsub -W depend=on:1 posao0 1002.x3000c0s25b0n0.hsn.hpc.srce.hr [korisnik@x3000c0s25b0n0admin [korisnik@padobran] $ qsub -W depend=beforeok:1002 posao1 1003.x3000c0s25b0n0.hsn.hpc.srce.hradmin [korisnik@x3000c0s25b0n0korisnik@padobran] $ qstat 1002 1003 Job id Name User Time Use S Queue --------------------- ---------------- ---------------- -------- - ----- 1002.x3000c0s25b0n0admin posao0 korisnik 0 H cpu 1003.x3000c0s25b0n0admin posao1 korisnik 00:00:00 R cpu |
...