Preskočiť na obsah

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.

Slurm – podpora viacjadrých systémov

  • 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á.
  • 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
alebo v dokumentácii Slurm o \(sbatch\).

Bežné tipy

  • Vždy požadujte minimálne potrebné zdroje a čas.
  • Používajtemodule purge na predchádzanie konfliktom v softvérovom prostredí.
  • Používajte premenné prostredia Slurm, napríklad SLURM_NTASKS a SLURM_CPUS_PER_TASK.
  • Pri použití OpenMP správne nastavte OMP_NUM_THREADS.
  • Skontrolujte man sbatch alebo 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 .err vygenerovanom ú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.

Created by: Marek Štekláč