Array jobs¶
Array jobs poskytujú pohodlný spôsob, ako odosielať a spravovať veľké množstvo podobných a nezávislých úloh. Sú obzvlášť užitočné v prípadoch, keď je potrebné rovnakú aplikáciu spustiť viackrát s rôznymi vstupnými "súbormi alebo parametrami.
Namiesto odosielania veľkého počtu samostatných úloh je možné použiť jeden batch skript na spustenie viacerých úloh v rámci jedného array job-u.
Nasledujúci príklad ukazuje jednoduchý array job:
#!/bin/bash
#SBATCH --job-name=array_test
#SBATCH --partition=<partition> # Devana: short; Perun: cpu_short
#SBATCH --nodes=1
#SBATCH --ntasks=4
#SBATCH --cpus-per-task=2
#SBATCH --output=out_array_%A_%a.out
#SBATCH --error=err_array_%A_%a.err
#SBATCH --array=1-8
# Print the task index
echo "My SLURM_ARRAY_TASK_ID:" $SLURM_ARRAY_TASK_ID
srun ./myapp --input input_data_${SLURM_ARRAY_TASK_ID}.inp
V tomto príklade sa spustí 8 array tasks (--array=1-8). Každá
úloha v array job-e spustí 4 srun tasks (--ntasks=4), pričom každému
tasku sú pridelené **2 CPU** (--cpus-per-task=2`).
Premenná prostredia SLURM_ARRAY_TASK_ID jednoznačne identifikuje
každú úlohu v array job-e. Je možné ju použiť na výber rôznych
vstupných súborov alebo na odovzdanie parametrov aplikácii.
Ak sa má rovnaký batch skript opakovane používať s rôznymi rozsahmi
array job-u, možnosť --array je možné zo skriptu vynechať a zadať ju
pri odoslaní úlohy:
sbatch --array=1-8 array.job.sh
Definovanie rozsahu array job-u¶
Array job je možné definovať viacerými spôsobmi:
- Rozsah indexov
- Explicitný zoznam indexov
- Rozsah s veľkosťou kroku
Príklady definícií:
#SBATCH --array=0-15 # Tasks with indices 0–15
#SBATCH --array=1,2,9,22,31 # Tasks with indices 1, 2, 9, 22, 31
#SBATCH --array=1-7:2 # Tasks with indices 1, 3, 5, 7
#SBATCH --array=1-7:2,20 # Tasks with indices 1, 3, 5, 7, 20
Obmedzenie súbežného spúšťania array tasks¶
V predvolenom nastavení môže SLURM spustiť veľké množstvo array tasks naraz, ak sú k dispozícii potrebné zdroje. Pri veľkých array jobs je často vhodné obmedziť počet tasks, ktoré môžu bežať súčasne.
Obmedzenie je možné nastaviť pomocou modifikátora %:
#SBATCH --array=1-100%10
V tomto príklade array job obsahuje 100 tasks, pričom súčasne môže bežať najviac 10 tasks. Po dokončení jednej task sa môže spustiť ďalšia task z array job-u.
Toto je užitočné napríklad pri:
- spúšťaní veľkého množstva malých úloh,
- obmedzovaní záťaže súborového systému,
- kontrole využívania licencií alebo limitov externých zdrojov.
Limity veľkosti array job-u¶
Slurm obmedzuje maximálny počet tasks v jednom array job-e parametrom
MaxArraySize a maximálnou veľkosťou array job-u definovanou v QoS.
Na oboch clustroch je tento limit 1001. Odoslanie array job-u
s väčším počtom tasks zlyhá už pri odoslaní.
Závislosti tasks v array job-e¶
Tasks v array job-e môžu závisieť aj od iných tasks rovnakého array
job-u. S modifikátorom závislosti same sa každá task spustí až po
dokončení task s o jedno nižším indexom:
sbatch --dependency=same --array=1-8 array.job.sh
Použitie zoznamov súborov namiesto číselných indexov¶
Indexy array job-u nemusia priamo zodpovedať číselným názvom vstupných súborov. Bežným prístupom je namapovať index array task na zoznam vstupných súborov.
Príklad zoznamu vstupných súborov:
input_A.dat
input_B.dat
input_C.dat
input_D.dat
Batch skript:
#!/bin/bash
#SBATCH --array=1-4
INPUT=$(sed -n "${SLURM_ARRAY_TASK_ID}p" input_list.txt)
srun ./myapp --input ${INPUT}
V tomto prípade každá task z array job-u načíta jeden riadok zo súboru
input_list.txt. Takýmto spôsobom je možné spracovávať ľubovoľné
vstupné súbory bez potreby ich premenovania alebo číselného indexovania.
Správa array job-ov¶
Príkaz squeue je možné použiť na monitorovanie array jobs.
Tasks v stave pending sa často zobrazujú ako jeden agregovaný záznam, zatiaľ čo bežiace tasks sa zobrazujú ako samostatné záznamy s ID v tvare:
<jobid>_<arrayindex>
Príklad:
squeue -u username
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
123456_[4-8] short example user1 PD 0:00 1 (Resources)
123456_1 short example user1 R 0:17 1 n024
123456_2 short example user1 R 0:23 1 n025
123456_3 short example user1 R 0:29 1 n025
Na zrušenie vybraných tasks z array job-u je možné použiť scancel s príslušným rozsahom indexov:
scancel 123456_[1-3]
Tým sa zrušia tasks s indexmi 1–3 z array job-u 123456.
Na zrušenie celého array job-u stačí zadať jeho ID:
scancel 123456
Premenné prostredia¶
Okrem SLURM_ARRAY_TASK_ID poskytuje SLURM niekoľko premenných
prostredia opisujúcich array job:
| Premenná | Popis |
|---|---|
SLURM_ARRAY_TASK_ID |
Index aktuálnej task v array job-e |
SLURM_ARRAY_TASK_COUNT |
Celkový počet tasks v array job-e |
SLURM_ARRAY_TASK_MIN |
Najnižšia hodnota indexu array job-u |
SLURM_ARRAY_TASK_MAX |
Najvyššia hodnota indexu array job-u |