Taulukkotyöt
Taulukkotyöt ovat Slurmin oma mekanismi useiden samankaltaisten, toisistaan riippumattomien alitehtävien lähettämiseen yhdellä komennolla, esimerkiksi useiden aineistojen analysointiin samalla tavalla tai saman simulaation ajamiseen useilla eri parametreilla.
Taulukkotyöt sopivat hyvin tilanteisiin, joissa kunkin alitehtävän suoritusaika on riittävän pitkä (yli noin 30 minuuttia), jolloin Slurmin ajastuksen aiheuttama kuormitus on merkityksetön. Kun suoritusajat ovat hyvin lyhyitä, alitehtäviä on erittäin paljon tai tehtävillä on riippuvuuksia, katso suurteholaskenta ja työnkulut sopivampien työkalujen, kuten HyperQueuen, löytämiseksi.
Taulukkotyön määrittely
Slurmissa taulukkotyö määritellään valinnalla --array tai -a, esimerkiksi
käynnistää yhden erätyön sijaan 100 erätyötä, joissa alityökohtaisen ympäristömuuttujan
$SLURM_ARRAY_TASK_ID arvo vaihtelee välillä 1–100. Tätä muuttujaa voidaan sitten hyödyntää
varsinaisissa työn käynnistyskomennoissa niin, että kukin alitehtävä tulee käsitellyksi. Kaikki
alityöt käynnistetään erätyöjärjestelmään kerralla, ja ne suoritetaan käyttäen niin monta
suoritinta kuin on saatavilla.
Työalueen määrittelyn lisäksi voit antaa myös luettelon työn indeksiarvoista, esimerkiksi
käynnistäisi kolme työtä arvoilla $SLURM_ARRAY_TASK_ID 4, 7 ja 22.
Voit myös sisällyttää askelkoon työn alueen määrittelyyn. Taulukkotyön määrittely
ajaisi viisi työtä arvoilla $SLURM_ARRAY_TASK_ID: 1, 21, 41, 61 ja 81.
Joissakin tapauksissa voi olla järkevää rajoittaa samanaikaisesti käynnissä olevien prosessien
määrää. Tämä tehdään merkinnällä %max_number_of_jobs. Esimerkiksi tilanteessa, jossa sinulla on
100 työtä mutta lisenssi vain viidelle samanaikaiselle prosessille, voit varmistaa, ettei lisenssi
lopu kesken, käyttämällä määrittelyä
Yksinkertainen esimerkki taulukkotyöstä
Ensimmäisessä taulukkotyöesimerkissä oletetaan, että meillä on 50 aineistoa (data_1.inp, data_2.inp
... data_50.inp), jotka haluamme analysoida ohjelmalla my_prog, joka käyttää syntaksia
Kukin alitehtävä vaatii alle kaksi tuntia laskenta-aikaa ja alle 4 Gt muistia. Voimme suorittaa kaikki 50 analyysitehtävää seuraavalla erätyöskriptillä:
#!/bin/bash -l
#SBATCH --job-name=array_job
#SBATCH --output=array_job_out_%A_%a.txt
#SBATCH --error=array_job_err_%A_%a.txt
#SBATCH --account=<project>
#SBATCH --partition=small
#SBATCH --time=02:00:00
#SBATCH --ntasks=1
#SBATCH --mem-per-cpu=4000
#SBATCH --array=1-50
# run the analysis command
my_prog data_${SLURM_ARRAY_TASK_ID}.inp data_${SLURM_ARRAY_TASK_ID}.out
Erätyöskriptissä rivi #SBATCH --array=1-50 määrittelee, että 50 alityötä lähetetään.
Muut #SBATCH-rivit viittaavat yksittäisiin alitöihin. Tässä tapauksessa yksi alityö käyttää
enintään yhtä suoritinta (--ntasks=1), 4 Gt muistia (--mem-per-cpu=4000) ja voi kestää
enintään kaksi tuntia (--time=02:00:00). Kaikkien 50 tehtävän käsittelyyn tarvittavaa
kokonaisseinäkelloaikaa ei kuitenkaan ole rajoitettu.
Työn suorituskomennoissa skripti käyttää muuttujaa $SLURM_ARRAY_TASK_ID syöte- ja
tulostiedostojen määrittelyssä niin, että ensimmäinen alityö suorittaa komennon
toinen suorittaa komennon
ja niin edelleen.
Työ voidaan nyt käynnistää komennolla
Tyypillisesti kaikkia töitä ei suoriteta kerralla. Jonkin ajan kuluttua suuri määrä töitä voi
kuitenkin olla käynnissä samanaikaisesti. Kun erätyö on valmis, hakemisto data_dir sisältää 50
tulostiedostoa.
Taulukkotyön lähettämisen jälkeen komento
paljastaa, että sinulla on yksi odottava työ ja mahdollisesti useita muita töitä käynnissä
erätyöjärjestelmässä. Kaikilla näillä töillä on jobid, joka koostuu kahdesta osasta:
taulukkotyön jobid-numerosta ja alityön numerosta. Kunkin alityön tulosteen ohjaamista omaan
tiedostoonsa suositellaan, sillä tiedostojärjestelmä voi epäonnistua, jos useat kymmenet prosessit
yrittävät kirjoittaa samaan tiedostoon samanaikaisesti. Jos tulostiedostot täytyy yhdistää yhdeksi
tiedostoksi, se voidaan usein tehdä helposti taulukkotyön valmistuttua. Esimerkiksi yllä olevassa
tapauksessa voisimme kerätä tulokset yhteen tiedostoon komennolla
Vakiotulosteen ja virhetulosteen tiedostoissa, jotka on määritelty #SBATCH-riveillä, voit käyttää
määreitä %A ja %a antaaksesi yksilölliset nimet kunkin alityön tulostiedostoille. Tiedostonimissä
%A korvataan taulukkotyön tunnuksella ja %a korvataan arvolla
$SLURM_ARRAY_TASK_ID.
Tiedostonimiluettelon käyttäminen taulukkotyössä
Yllä olevassa esimerkissä pystyimme käyttämään $SLURM_ARRAY_TASK_ID:tä viittaamaan syötetiedostojen
järjestysnumeroihin. Jos tällainen lähestymistapa ei ole mahdollinen, voidaan käyttää ennen erätyön
lähettämistä luotua tiedosto- tai komentoluetteloa. Oletetaan, että meillä on yllä määritellyn
kaltainen tehtävä, mutta tiedostonimet eivät sisällä numeroita vaan ovat muodossa data_aa.inp,
data_ab.inp, data_ac.inp ja niin edelleen. Tällöin meidän on ensin tehtävä luettelo
analysoitavista tiedostoista. Tässä tapauksessa voisimme kerätä tiedostonimet tiedostoon namelist
komennolla
Komento
lukee tietyn rivin nimiluettelotiedostosta. Tässä tapauksessa varsinainen komentokomentoskripti voisi olla
#!/bin/bash -l
#SBATCH --job-name=array_job
#SBATCH --output=array_job_out_%A_%a.txt
#SBATCH --error=array_job_err_%A_%a.txt
#SBATCH --account=<project>
#SBATCH --partition=small
#SBATCH --time=02:00:00
#SBATCH --ntasks=1
#SBATCH --mem-per-cpu=4000
#SBATCH --array=1-50
# set the input file to process
name=$(sed -n ${SLURM_ARRAY_TASK_ID}p namelist)
# run the analysis
my_prog ${name} ${name}.out
Tämä esimerkki on muuten samanlainen kuin ensimmäinen, paitsi että se lukee analysoitavan tiedoston
nimen tiedostosta namelist. Tämä arvo tallennetaan muuttujaan ${name}, jota käytetään työn
suorituskomennossa. Koska luettava rivinumero määritellään muuttujalla $SLURM_ARRAY_TASK_ID,
kukin tiedostossa namelist lueteltu datatiedosto käsitellään eri alityönä. Huomaa, että koska
käytämme nyt myös ${name}-muuttujaa tulosteen määrittelyssä, tulostiedoston nimi on muodossa
data_aa.inp.out, data_ab.inp.out, data_ac.inp.out ja niin edelleen.
Taulukkotöiden käyttäminen työnkuluissa komennolla sbatch_commandlist
sbatch-hq
Tehokkaampi vaihtoehto komennolle sbatch_commandlist on CSC:n apuohjelma sbatch-hq,
joka on käytännössä kääre HyperQueuelle. sbatch-hq
mahdollistaa samankaltaisten, toisistaan riippumattomien ei-MPI-rinnakkaistehtävien joukon
lähettämisen komentoluettelosta eli tiedostosta, jossa kukin rivi vastaa yksittäistä
suoritettavaa alitehtävää. Katso lisätietoja HyperQueue-sivulta.
Puhti computing services have been retired
Puhti computing services have been retired and no new jobs are accepted or executed on its compute nodes. Any jobs sent through Slurm will be stuck in a pending state.
Puhti login nodes and storage services are planned to remain available until 15 October 2026.
Puhdissa voit käyttää komentoa sbatch_commandlist komentoluettelon suorittamiseen
taulukkotyönä. Tämä komento ottaa syötteekseen tekstitiedoston. Komentoluettelo jaetaan useisiin
osiin, jotka suoritetaan taulukkoerätyön riippumattomina alitehtävinä, ja jotka
sbatch_commandlist luo automaattisesti. Näin yksi taulukkotyön alitehtävä voi käsitellä useita
komentoluettelon komentoja.
Tämän komennon syntaksi on:
Valintoja -t ja -mem voidaan käyttää alitöiden aika- ja muistivarauksen muuttamiseen
(oletuksena 12 h, 8 Gt). Oletuksena laskutusprojekti asetetaan sen scratch-hakemiston nimen
perusteella, jossa tämä komento suoritetaan, mutta tarvittaessa se voidaan määrittää valinnalla
-project. Komentoluettelo jaetaan enintään 200 alitehtävään. Jos yksittäiset tehtävät ovat
hyvin lyhyitä, voit käyttää valintaa --max_jobs vähentämään jakoa niin, että kukin taulukkotyön
tehtävä kestäisi käsitellä vähintään noin puoli tuntia.
Taulukkotyön lähettämisen jälkeen sbatch_commandlist alkaa seurata työn etenemistä.
Jos käytät sbatch_commandlist-komentoa interaktiivisesti kirjautumissolmuilla, et yleensä
halua pitää seurantaa käynnissä tuntikausia. Näissä tapauksissa voit vain sulkea
seurantaprosessin painamalla Ctrl-c. Varsinaista taulukkotyötä ei poisteta, vaan se pysyy
aktiivisena erätyöjärjestelmässä, ja voit hallita sitä tavallisilla Slurm-komennoilla.
Interaktiivisen käytön lisäksi sbatch_commandlist-komentoa voidaan hyödyntää erätöissä ja
automaattisissa työnkuluissa, joissa vain tietyt työnkulun vaiheet voivat hyödyntää
taulukkotöihin perustuvaa rinnakkaislaskentaa. Esimerkkinä oletetaan, että meillä on gzipillä
pakattu tar-arkistotiedosto my_data.tgz, joka sisältää hakemiston, jossa on suuri määrä
tiedostoja. Luodaksemme uuden pakatun arkiston, joka sisältää myös md5-tarkistussummatiedoston
jokaiselle tiedostolle, meidän pitäisi:
- purkaa ja avata
my_data.tgz - suorittaa
md5sumjokaiselle tiedostolle ja lopuksi - pakata ja pakata uudelleen hakemisto
my_data.
Työnkulun toinen vaihe voitaisiin suorittaa for-silmukalla, mutta voisimme myös käyttää
silmukkaa vain md5sum-komentojen luettelon luomiseen, joka voidaan käsitellä komennolla sbatch_commandlist .
#!/bin/bash -l
#SBATCH --job-name=workflow
#SBATCH --output=workflow_out_%j.txt
#SBATCH --error=workflow_err_%j.txt
#SBATCH --account=<project>
#SBATCH --time=12:00:00
#SBATCH --mem=4000
#SBATCH --ntasks=1
#SBATCH --partition=small
#open the tgz file
tar zxf my_data.tgz
cd my_data
#generate a list of md5sum commands
for my_file in *
do
echo "md5sum $my_file > $my_file.md5" >> md5commands.txt
done
#execute the md5commands as an array job
sbatch_commandlist -commands md5commands.txt
#remove the command file and compress the directory
rm -f md5commands.txt
cd ..
tar zcf my_data_with_md5.tgz my_data
rm -rf my_data
Huomaa, että yllä oleva erätyöskripti ei ole taulukkotyö, vaan se käynnistää toisen erätyön, joka on taulukkotyö.