Introduction
To schedule and manage jobs on the Parachute computer cluster, PBS (Portable Batch System) is used, which performs job scheduling within the cluster. Its primary task is the distribution of computer tasks, i.e. batch jobs, among the available computer resources.
This document describes the use of the PBS 22.05.11 version
Running jobs
User applications (hereinafter jobs) that are started using the PBS system must be described by a start shell script (sh, bash, zsh...). Within the startup script above the standard commands, the PBS parameters are listed. These parameters can also be specified when submitting a job.
Basic job submission:
qsub my_job.pbs
Job submission with parameters:
qsub -q cpu -l walltime=10:00:00 -l select=1:ncpus=4:mem=10GB my_job.pbs
More information about qsub parameters:
qsub --help
After submitting the job, it is possible to view the standard output and error of the job that is in execution state with the commands:
qcat jobID qcat -e jobID qtail jobID qtail -e jobID
Job submission
There are several ways jobs can be submitted:
- by interactive submission
- using a script
- in an interactive session
- job array
In the case of interactive submission, directly calling the qsub command will open a text editor in the terminal, through which the commands for execution are submitted:
# qsub [korisnik@padobran:~] $ qsub Job script will be read from standard input. Submit with CTRL+D. echo "Hello world" # print directory contents [korisnik@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 # print the contents of the output file [korisnik@padobran:~] $ cat STDIN.o14571 Hello world
In the case of script submission, we can specify the commands to be executed in the input file that we submit:
# print the file hello.sh [korisnik@padobran:~] $ cat hello.sh #!/bin/bash #PBS -N hello echo "Hello world" # job script submission [korisnik@padobran:~] $ qsub hello.sh # print directory content [korisnik@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 # print file content [korisnik@padobran:~] $ cat hello.o14572 Hello world
In the case of an interactive session, using the qsub -I option without an input script will open a terminal on the main working node within which we can run commands:
# hostname on access server [korisnik@padobran:~] $ hostname padobran.srce.hr # starting interactive session [korisnik@padobran:~] $ qsub -I -N hello-interactive qsub: waiting for job 106.admin to start qsub: job 106.admin ready # hostname on the main worker node [korisnik@node034:~] $ hostname node034.padobran
In the case of an array of jobs, using the qsub -J X-Y[:Z] option we can submit a given number of identical jobs in the range X to Y with step Z:
# submission of job array [korisnik@padobran:~] $ qsub -J 1-10:2 hello.sh 107[].admin # print files content [korisnik@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
Polja poslova
This method is preferred over multiple submissions (e.g. with a for loop) because:
- reduces job queue load - each job will compete for resources simultaneously with everyone else in the queue, instead of one after the other
- easier management - modification of all jobs is possible by calling the main (e.g. 14575[]) or individual (e.g. 14575[3]) job identifier
The environment variables defined by PBS during their execution are:
- PBS_ARRAY_INDEX - number of sub-jobs in the job field (e.g. one to nine in the example above)
- PBS_ARRAY_ID - identifier of the main job field
- PBS_JOBID - subjob identifier in the job field
Job description
The PBS system language is used to describe jobs, while the job description file is a standard shell script. In the header of each script, PBS parameters are listed to describe the job in detail, followed by commands to execute the desired application.
Structure of the startup script:
#!/bin/bash #PBS -<parameter1> <value> #PBS -<parameter2> <value> <command>
Konkretni primjer startne skripte:
#!/bin/bash #PBS -P test example #PBS -e /home/my_directory #PBS -q cpu #PBS -l walltime=00:01:00 #PBS -l select=1:ncpus=10 module load mpi/openmpi-x86_64 mpicc --version
Osnovni PBS parametri
Opcija | Option argument | The meaning of the option |
-N | name | Setting the job name |
-q | destination | Specifying the job queue and/or server |
-l | resource_list | Specifying the resources required to perform the job |
-M | user_list | Setting up a list of mail recipients |
-m | mail_options | Setting the email notification type |
-o | path/to/desired/directory | Setting the name/path where standard output is saved |
-e | path/to/desired/directory | Setting the name/path where the standard error is saved |
-j | oe | Concatenation of standard output and error in the same file |
-Wgroup_list | project_code | Selection of the project under which the job will be performed |
Options for sending notifications by mail option -m:
a | Mail is sent when the batch system terminates the job |
b | Mail is sent when the job starts executing |
e | The mail is sent when the job is finished |
j | Mail is sent for sub jobs. Must be combined with one or more sub-options a, b or e |
#!/bin/bash #PBS -q cpu #PBS -l walltime=00:01:00 #PBS -l select=1:ncpus=2 #PBS -M <name>@srce.hr,<name2>@srce.hr #PBS -m be echo $PBS_JOBNAME > out echo $PBS_O_HOST
Two emails were received
PBS Job Id: 110.admin Job Name: pbs.pbs Begun execution
PBS Job Id: 110.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
Options for requesting resources with the -l option
-l select=3:ncpus=2 | Requesting 3 chunks with 2 cores each (6 cores in total) |
-l select=1:ncpus=10:mem=20GB | Requesting 1 chunk with 10 cores and 20GB of working memory |
-l ngpus=2 | Requesting 2 gpus |
-l walltime=00:10:00 | Maximum job execution time |
PBS environmental variables
Name | Description |
---|---|
PBS_JOBID | Job identifier provided by PBS when a job is submitted. Created after executing the qsub command |
PBS_JOBNAME | The name of the job provided by the user. The default name is the name of the submitted script |
PBS_NODEFILE | List of work nodes, or processor cores on which the job is executed |
PBS_O_WORKDIR | The working directory in which the job was submitted, i.e. in which qsub command was called |
OMP_NUM_THREADS | An OpenMP variable that PBS exports to the environment, which is equal to the value of the ncpus option from the PBS script header |
NCPUS | Number of cores requested. Matches the value from the ncpus option from the PBS script header |
TMPDIR | Path to temporary directory |
Određivanje radnog direktorija
Dok je u PBS 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 nema opciju određivanja izvođenja posla u trenutnom direktoriju u kojem se nalazimo stoga je potrebno ručno promijeniti direktorij.
Ako se želite prebaciti u direktorij u kojem je pokrenuta skripta, poslije zaglavlja potrebno je napisati:
cd $PBS_O_WORKDIR
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:
-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.
#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.
#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):
#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)
Memorija
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>).
Privremeni direktorij se briše automatski po završetku izvođenja posla!
Primjeri korištenja
- Primjer jednostavnog korištenja $TMPDIR varijable:
#!/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:
#!/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.
OpenMP aplikacije zahtjevaju definiranje varijable
OMP_NUM_THREADS
.
PBS sustav vodi računa o tome umjesto Vas, te joj pridružuje vrijednost varijable ncpus
, definirane u zaglavlju PBS skripte.
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).
#!/bin/bash #PBS -q cpu #PBS -l walltime=10:00:00 #PBS -l ncpus=8:mem=28GB cd ${PBS_O_WORKDIR} xtb 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 pozvati na način kako je prikazano u primjeru 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.
Vrijednost varijable
select
iz zaglavlja PBS skripte odgovara broju MPI procesa.
#!/bin/bash #PBS -q cpu #PBS -l walltime=10:00:00 #PBS -l select=16 module load mpi/openmpi-x86_64 cd ${PBS_O_WORKDIR} mpiexec 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:
OpenMP aplikacije zahtijevaju definiranje varijable
OMP_NUM_THREADS
. PBS sustav joj automatski pridružuje vrijednost varijable ncpus
, definirane u zaglavlju PBS skripte.
Vrijednost varijable
select
iz zaglavlja PBS skripte odgovara broju MPI procesa.
#!/bin/bash #PBS -q cpu #PBS -l walltime=10:00:00 #PBS -l select=8:ncpus=4:mem=14GB module load 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
Praćenje posla
Za prikaz stanja poslova koristi se PBS-ova naredba qstat. Osnovna sintaksa naredbe je:
qstat <opcije> <ID_posla>
Izvršavanjem naredbe qstat bez dodatnih opcija dobiva se ispis svih trenuthi poslova svih korisnika:
Job id Name User Time Use S Queue ---------------- ---------------- ---------------- -------- - ----- 111.admin mpi+omp_s kmrkalj 00:36:09 R cpu
Neke od korištenijih opcija su:
-E | Grupira poslove prema poslužitelju i prikazuje poslove poredane prema uzlaznom ID-u. Kada se qstat prikaže s popisom poslova, poslovi su grupirani po poslužitelju i svaka grupa je prikazana uzlaznim ID-om. Ova opcija također poboljšava performanse qstata. |
-t | Prikazuje informacije o statusu za poslove, nizove poslova i podposlove. |
-p | Prikaz stupca za Iskorišteno vrijeme zamjenjuje se postotkom obavljenog posla. Za posao niza ovo je postotak završenih podposlova. Za normalan posao, to je postotak iskorištenog dodijeljenog CPU vremena. |
-x | Prikazuje informacije o statusu za dovršene i premještene poslove uz poslove u čekanju i pokrenute poslove. |
-Q | Prikazuje status redova u standardnom formatu. |
-q | Prikazuje status redova u alternativnom formatu. |
-f | Prikazuje status posla u alternativnom formatu |
Primjeri korištenja:
Detaljan prikaz posla:
qstat -fxw 2648
Tracejob naredba vadi i prikazuje log poruke za PBS posao po kronološkom redu.
tracejob <ID_posla>
Primjer:
$ tracejob 111 Job: 111.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@node034, owner = mhrzenja@node034, job name = mapping, queue = cpu 03/30/2023 11:23:24 S Job Run at request of Scheduler@node034 on exec_vnode (node034: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@node034 03/30/2023 11:24:22 S Holds u released at request of mhrzenja@node034
Upravljanje poslovima
Poslom se može upravljati i nakon pokretanja.
Dok je posao u redu čekanja, moguće je privremeno zaustaviti njegovo izvršavanje naredbom:
qhold <ID_posla>
Vraćanje natrag na red čekanja:
qrls <ID_posla>
Posao se u potpunosti zaustavlja ili miče iz reda čekanja naredbom:
qdel <ID_posla>
Za zaglavljene poslove treba koristiti prisilno zaustavljanje:
qdel -W force -x <ID_posla>
Odgađanje izvođenja
PBS pruža mogućnost izvođenja poslova u ovisnosti o drugima, što je korisno u slučajevima poput:
- izvršavanje poslova ovisi o izlazu ili stanju prethodno izvršenog
- aplikacija zahtijeva sekvencijalno izvođenje raznih komponenata
- ispis podataka jednog posla može ugroziti izvođenje drugog
Direktiva koja omogućuje ovu funkcionalnost pri trenutnom podnošenju posla je:
qsub -W depend=<tip>:<ID_posla>[:<ID_posla>] ...
Gdje < tip>
može biti:
-
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 trenutnog nakon greške u završetku navedenih -
afterany
- izvršavanje trenutnog nakon završetka navedenih
-
-
before*
- pokretanje ostalih s obzirom na trenutni-
before
- pokretanje navedenih nakon početka trenutnog -
beforeok
- pokretanje navedenih nakon usprešnog završetka trenutnog -
beforenotok
- pokretanje navedenih nakon greške u izvršavanju trenutnog -
beforeany
- pokretanje navedenih nakon završetka trenutnog
-
-
on:<broj>
- izvršavanje posla koji će ovisiti o naknadno navedenom brojubefore*
tipa poslova
Posao s direktivom -W depend=...
neće biti podnesen ako navedeni ID-ovi poslova ne postoje (iliti, ako nisu u redu čekanja)
Primjeri
Ako želimo da posao1
započne nakon uspješnog završetka posao0
:
[korisnik@padobran] $ qsub posao0 1000.admin [korisnik@padobran] $ qsub -W depend=afterok:1000 posao1 1001.admin [korisnik@padobran] $ qstat 1000 1001 Job id Name User Time Use S Queue --------------------- ---------------- ---------------- -------- - ----- 1000.admin posao0 korisnik 00:00:00 R cpu 1001.admin posao1 korisnik 0 H cpu
Ako želimo da posao0
započne tek nakon uspješnog završetka posao1
:
[korisnik@padobran] $ qsub -W depend=on:1 posao0 1002.admin [korisnik@padobran] $ qsub -W depend=beforeok:1002 posao1 1003.admin [korisnik@padobran] $ qstat 1002 1003 Job id Name User Time Use S Queue --------------------- ---------------- ---------------- -------- - ----- 1002.admin posao0 korisnik 0 H cpu 1003.admin posao1 korisnik 00:00:00 R cpu