Preskočiť na obsah

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:

  1. Rozsah indexov
  2. Explicitný zoznam indexov
  3. 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
Created by: Marek Štekláč