Váš prvý batch skript¶
Na HPC clustroch sa príkazy zriedkakedy spúšťajú interaktívne vzhľadom na zdieľanie výpočtových zdrojov a pravidlá plánovania úloh. Namiesto toho sa pripravuje batch skript, ktorý definuje požiadavky úlohy a kroky jej vykonania. Tento skript sa odosiela plánovaču (Slurm), ktorý ho spustí po pridelení požadovaných zdrojov.
Najbežnejším spôsobom odoslania batch úlohy plánovaču je použitie príkazu
sbatch.
V nasledujúcom príklade sa odosiela skript s názvom my_script.sh:
sbatch my_script.sh
Slurm prečíta požiadavky úlohy definované v skripte, pridelí vhodné zdroje a následne spustí úlohu na vybraných výpočtových uzloch.
Vytváranie batch skriptov¶
Job Builder
Batch skript je možné vytvoriť pomocou nástroja Job Builder.
Batch skript je zvyčajne rozdelený na nasledujúce časti:
- Interpretér – program použitý na vykonanie skriptu (napr.
bash,python) - Smernice Slurm – definujúce parametre úlohy, ako sú požadované zdroje, čas behu a partition
- Príprava prostredia – napríklad načítanie modulov, nastavenie premenných prostredia alebo príprava vstupných súborov
- Vykonanie úlohy – spustenie požadovanej aplikácie
- Epilóg – voliteľné kroky vykonané po skončení úlohy, napríklad presun dát alebo upratanie pracovného adresára
Ako príklad je možné použiť nasledujúci jednoduchý batch skript:
#!/bin/bash
#SBATCH -J "slurm test" # Job name
#SBATCH -N 1 # Request 1 node
#SBATCH --ntasks-per-node=16 # Run 16 tasks (processes) on that node
#SBATCH -p short # Partition (Devana: short/medium/long; Perun: cpu_short/cpu_long/...)
#SBATCH -t 01:00:00 # Maximum runtime
#SBATCH -o test.%J.out # File to write standard output (%J = job ID)
#SBATCH -e test.%J.err # File to write standard error
module load intel/2022a OpenMPI/4.1.4-GCC-11.3.0 # Load the compiler and MPI environments
mpirun -np $SLURM_NTASKS /bin/hostname # Run hostname command 16 times (once per task)
exit
V tomto skripte sú definované základné požiadavky úlohy – počet uzlov a tasks, súbory pre štandardný výstup a chybový výstup – a následne sa paralelne spustí príkaz \(hostname\), ktorý zobrazí názov uzla.
sbatch my_script.sh
Submitted batch job 38678
ls -ltr
total 8
-rw-rw-r-- 1 user user 198 Sep 21 14:08 my_script.sh
-rw-rw-r-- 1 user user 0 Sep 21 14:08 test.38678.err
-rw-rw-r-- 1 user user 80 Sep 21 14:08 test.38678.out
cat test.38678.out
n079
n079
n079
n079
n079
n079
n079
n079
n079
n079
n079
n079
n079
n079
n079
n079
Po odoslaní úlohy bolo pridelené ID 38678, ktoré sa zobrazilo
vo výstupe príkazu sbatch. Toto ID sa následne použilo aj v názvoch
súborov STDERR a STDOUT. Keďže bolo požadovaných 16 tasks na jednom
uzle, výstupný súbor obsahuje 16 výstupov príkazu hostname. Z výstupu
je zároveň viditeľné, že skript bol skutočne vykonaný na uzle n079.
Ide iba o demonštračný skript. Na použitie so skutočnou HPC aplikáciou je potrebné skript upraviť podľa požiadaviek danej aplikácie. Ďalšie príklady pre konkrétne aplikácie sú uvedené v sekciách Softvér Devana a Softvér Perun portálu userdocs.
Bežné typy batch úloh¶
#!/bin/bash
#SBATCH -J serial_job # Job name
#SBATCH -N 1 # Use 1 node
#SBATCH -n 1 # Run 1 task (single-core)
#SBATCH -t 00:05:00 # Maximum runtime: 5 minutes
#SBATCH -o serial.out # Output file
#SBATCH -e serial.err # Error file
./my_serial_app
#!/bin/bash
#SBATCH -J openmp_job # Job name
#SBATCH -N 1 # 1 node
#SBATCH -n 1 # 1 task (OpenMP uses threads, not tasks)
#SBATCH -c 8 # Request 8 CPUs per task (i.e., 8 threads)
#SBATCH -t 00:10:00 # 10-minute wall time
#SBATCH -o openmp.out # Output file
#SBATCH -e openmp.err # Error file
export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK}
./my_openmp_app
#!/bin/bash
#SBATCH -J mpi_job # Job name
#SBATCH -N 2 # Use 2 nodes
#SBATCH --ntasks-per-node=8 # 8 tasks (processes) per node (total: 16)
#SBATCH -t 00:15:00 # 15-minute time limit
#SBATCH -o mpi.out # Output file
#SBATCH -e mpi.err # Error file
module load OpenMPI/4.1.4-GCC-11.3.0 # Load OpenMPI environment
mpirun -np $SLURM_NTASKS ./my_mpi_app
#!/bin/bash
#SBATCH -J hybrid_job # Job name
#SBATCH -N 2 # 2 nodes
#SBATCH --ntasks-per-node=4 # 4 MPI tasks per node
#SBATCH -c 4 # 4 CPUs (threads) per task
#SBATCH -t 00:30:00 # 30-minute limit
#SBATCH -o hybrid.out # Output file
#SBATCH -e hybrid.err # Error file
export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK} # OpenMP thread count
mpirun -np $SLURM_NTASKS ./my_hybrid_app
#!/bin/bash
#SBATCH -J gpu_job # Job name
#SBATCH -N 1 # 1 node
#SBATCH --gres=gpu:1 # Request 1 GPU
#SBATCH -t 00:20:00 # 20-minute limit
#SBATCH -o gpu.out # Output file
#SBATCH -e gpu.err # Error file
module load CUDA/12.0.0 # Load CUDA environment
./my_gpu_program
Príprava prostredia¶
Mnohé aplikácie vyžadujú pred spustením pripravené softvérové prostredie. Zvyčajne ide o načítanie softvérových modulov, aktiváciu Python prostredí alebo spustenie programov v kontajneroch.
Načítanie modulov
module purge
module load GCC/12.2.0 OpenMPI/4.1.4-GCC-11.3.0
Použitie Conda
conda activate myenv
Použitie kontajnerov
singularity exec my_container.sif ./my_program
Odoslanie úlohy¶
Batch skript by mal špecifikovať aspoň počet uzlov, časový limit
(-t) a partition (-p). Voliteľne je možné špecifikovať aj ďalšie
požiadavky, obmedzenia a vlastnosti uzlov. Ak niektoré parametre nie
sú uvedené, Slurm použije ich predvolené hodnoty.
Možnosti rozdeľovania zdrojov
| Možnosť | Popis |
|---|---|
-a, --array=<index> |
Špecifikácia array job-u (len sbatch) |
--cpu-bind=<type> |
Priviazanie tasks na konkrétne CPU (sbatch a srun) |
-c, --cpus-per-task=<count> |
Počet CPU potrebných na jednu task |
--gpus-per-task=<count> |
Počet GPU potrebných na jednu task |
--mem=<size>[units] |
Pamäť potrebná na každý pridelený uzol (napr. 16GB) |
--mem-per-cpu=<size>[units] |
Pamäť potrebná na každý pridelený CPU (napr. 2GB) |
-N, --nodes=<count> |
Počet uzlov, ktoré sa majú prideliť úlohe |
-n, --ntasks=<count> |
Celkový počet tasks, ktoré sa majú spustiť |
--ntasks-per-node=<count> |
Počet tasks, ktoré sa majú spustiť na jednom uzle |
V rámci úlohy sa definuje požadovaný počet tasks. Slurm zároveň umožňuje podrobne určiť spôsob pridelenia zdrojov, ktoré majú byť k dispozícii pre jednotlivé tasks.
Pozor na terminológiu Slurm v dokumente Multicore Architecture!
- Slurm Node = fyzický uzol, špecifikovaný pomocou
-N <#nodes>.- Odporúča sa vždy explicitne špecifikovať očakávaný počet tasks
na uzol pomocou
--ntasks-per-node <n>. Týmto spôsobom sa určuje rozsah zdrojov (footprint) úlohy na jednotlivých uzloch.
- Odporúča sa vždy explicitne špecifikovať očakávaný počet tasks
na uzol pomocou

-
Slurm CPU = fyzické jadro (CORE).
- Na špecifikovanie počtu CPU rezervovaných pre jednu task sa
používa
-c <threads>alebo--cpus-per-task <threads>. - Technológia Hyper-Threading (HT) je na clustri Devana vypnutá.
- Na špecifikovanie počtu CPU rezervovaných pre jednu task sa
používa
-
Predpokladá sa jadro = vlákno (thread). Pri použití
-c <threads>je preto možné nastaviť:
OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK:-1}
Týmto spôsobom sa nastavenie počtu OpenMP vlákien automaticky prispôsobí kontextu úlohy.
Celkový počet tasks definovaných v danej úlohe je uložený v premennej
prostredia SLURM_NTASKS.
Možnosť --cpus-per-task príkazu srun
Vo verziách Slurm používaných na clustroch srun dedične preberá
hodnotu --cpus-per-task požadovanú pomocou salloc alebo sbatch
prostredníctvom premennej SLURM_CPUS_PER_TASK, rovnako ako pri
iných možnostiach.
Ak sa má v rámci jednej alokácie alebo batch skriptu spustiť viacero
programov, zdroje je možné rozdeliť ich explicitným pridelením pomocou
srun pri spúšťaní jednotlivých procesov:
srun --cpus-per-task <some of the SLURM_CPUS_PER_TASK> --ntasks <some of the SLURM_NTASKS> [...] <program>
Základné možnosti accounting a plánovania
| Možnosť | Popis |
|---|---|
-A, --account=<account> |
Priradenie zdrojov použitých touto úlohou k určenému projektu používateľa. |
-e, --error=<filename> |
Súbor, do ktorého sa ukladajú chybové správy úlohy (len sbatch a srun) |
--exclusive |
Rezervovanie všetkých CPU a GPU na pridelených uzloch |
-J, --job-name=<name> |
Názov úlohy |
--mail-user=<address> |
E-mailová adresa |
-o, --output=<filename> |
Súbor, do ktorého sa ukladá výstup úlohy (len sbatch a srun) |
-p, --partition=<names> |
Partition, v ktorej sa má úloha spúšťať |
-t, --time=<time> |
Časový limit úlohy |
Úplný zoznam možností príkazu sbatch je možné zobraziť pomocou príkazu
man sbatch
Bežné tipy
- Vždy požadujte minimálne potrebné zdroje a čas.
- Používajte
module purgena predchádzanie konfliktom v softvérovom prostredí. - Používajte premenné prostredia Slurm, napríklad
SLURM_NTASKSaSLURM_CPUS_PER_TASK. - Pri použití OpenMP správne nastavte
OMP_NUM_THREADS. - Skontrolujte
man sbatchalebo navštívte oficiálnu dokumentáciu Slurm.
Ladenie zlyhaných úloh¶
Ak úloha zlyhá, nasledujúce kroky môžu pomôcť pri identifikácii problému.
- Skontrolujte chybové správy v súbore
.errvygenerovanom úlohou. - Podrobnosti o úlohe je možné získať pomocou:
sacct -j <jobid>
scontrol show job <jobid>
- Je možné nastaviť e-mailové notifikácie, pomocou ktorých sa zobrazia informácie o dokončení alebo zlyhaní úlohy:
#SBATCH --mail-user=your@email.com
#SBATCH --mail-type=END,FAIL
- Pri ladení je vhodné odosielať krátke testovacie úlohy, aby sa skrátil čas čakania vo fronte:
#SBATCH -t 00:01:00
- Na rýchle testovanie je možné použiť interaktívnu alokáciu:
salloc -N 1 -n 4 --time=00:10:00
mpirun -np $SLURM_NTASKS ./my_program
- Ak sa úloha ukončí s nenulovým exit kódom, zvýšenie úrovne podrobnosti (verbosity) skriptu môže pomôcť pri identifikácii problému:
#!/bin/bash -x
Bežné problémy s úlohami¶
Nasledujúca tabuľka zhŕňa niekoľko bežných problémov, ktoré sa môžu vyskytnúť pri spúšťaní úloh na clustri, a možné spôsoby ich riešenia.
| Problém | Možná príčina | Odporúčaný postup |
|---|---|---|
Úloha zostáva v stave PD (pending) |
Nie sú k dispozícii požadované zdroje alebo je vyčerpaná kvóta projektu | Spustite squeue -j <jobid> a skontrolujte dôvod. Alokáciu projektu overte pomocou sprojects. |
| Úloha okamžite zlyhá | Chyba v batch skripte alebo v príkaze aplikácie | Skontrolujte chybové správy v súbore .err vygenerovanom úlohou. |
| Úloha prekročí časový limit | Čas behu je dlhší ako požadovaný čas | Zvýšte parameter --time v batch skripte. |
| Úloha bola ukončená kvôli limitu pamäte | Bola požadovaná nedostatočná pamäť | Zvýšte požadovanú pamäť pomocou --mem alebo --mem-per-cpu. |
| Úloha beží, ale nevytvára žiadny výstup | Nesprávne vstupné súbory alebo cesty | Overte cesty k vstupným súborom a pracovný adresár. |
| Aplikácia zlyhá počas vykonávania | Prostredie nie je správne nastavené | Skontrolujte, či sú pred spustením aplikácie načítané potrebné moduly alebo aktivované potrebné prostredia. |
Na detailné skúmanie úlohy je možné použiť vyššie uvedené príkazy
sacct a scontrol.