Hyppää sisältöön

Docs CSC now features an automatic Finnish translation. Click here for more information.

Warning!

Puhti and Mahti are being decommissioned in stages, and their storage areas will become fully unavailable from 15 October 2026. Clean up unnecessary files and move any data you need to keep by 31 August 2026. See the Roihu data migration guide for instructions on transferring your data to Roihu.

Puhti scratch is very full: keep only active data there and move or delete everything else. No new Puhti scratch quota will be granted.

Taulukkotyöt

Taulukkotyöt ovat Slurmin natiivi 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 ajoaika on riittävän pitkä (yli noin 30 minuuttia), jolloin Slurmin ajastuksen yleiskustannus on merkityksetön. Kun ajoajat ovat hyvin lyhyitä, alitehtäviä on erittäin paljon tai tehtävillä on riippuvuuksia, katso suurteholaskenta ja työnkulut sopivammista työkaluista, kuten HyperQueuesta.

Taulukkotyön määrittely

Slurmissa taulukkotyö määritellään valinnalla --array tai -a, esimerkiksi

#SBATCH --array=1-100

ei käynnistä vain yhtä erätyötä, vaan 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ä jokainen 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

#SBATCH --array=4,7,22

käynnistäisi kolme työtä, joiden $SLURM_ARRAY_TASK_ID-arvot ovat 4, 7 ja 22.

Voit myös sisällyttää askelkoon työn alueen määrittelyyn. Taulukkotyön määrittely

#SBATCH --array=1-100:20

ajaisi viisi työtä seuraavilla $SLURM_ARRAY_TASK_ID-arvoilla: 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, että lisenssit eivät lopu kesken, käyttämällä määrittelyä

#SBATCH --array=1-100%5

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

my_prog inputfile outputfile

Jokainen alitehtävä tarvitsee 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 hyödyntää $SLURM_ARRAY_TASK_ID-muuttujaa syöte- ja tulostiedostojen määrittelyssä niin, että ensimmäinen alityö suorittaa komennon

my_prog data_1.inp data_1.out

toinen suorittaa komennon

my_prog data_2.inp data_2.out

ja niin edelleen.

Työ voidaan nyt käynnistää komennolla

sbatch job_script.sh

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

squeue -l -u <username>

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 erilliseen tiedostoon suositellaan, koska 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

cat data_*.out > all_data.out

Vakiotulosteen ja virhetiedostojen tapauksessa, jotka on määritelty #SBATCH-riveillä, voit käyttää määrittelyjä %A ja %a antaaksesi yksilölliset nimet kunkin alityön tulostiedostoille. Tiedostojen nimissä %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-muuttujaa 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 täytyy ensin tehdä luettelo analysoitavista tiedostoista. Tässä tapauksessa voisimme kerätä tiedostonimet tiedostoon namelist komennolla

ls data_*.inp > namelist

Komento

sed -n <row_number>p inputfile

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ä siinä luetaan analysoitavan tiedoston nimi 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, jokainen 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 jokainen rivi vastaa yksittäistä suoritettavaa alitehtävää. Katso lisätietoja HyperQueue-sivulta.

Puhdissa voit käyttää komentoa sbatch_commandlist komentoluettelon suorittamiseen taulukkotyönä. Tämä komento ottaa syötteenä tekstitiedoston. Komentoluettelo jaetaan useisiin osiin, jotka suoritetaan itsenäisinä alitehtävinä taulukkoerätyössä, jonka sbatch_commandlist luo automaattisesti. Näin yksi taulukkotyön alitehtävä voi käsitellä useita komentoja komentoluettelosta.

Tämän komennon syntaksi on:

sbatch_commandlist -commands commandlist

Valintoja -t ja -mem voidaan käyttää alitöiden aika- ja muistivarauksen muuttamiseen (oletus 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 gzip-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 täytyisi:

  1. purkaa ja avata my_data.tgz
  2. suorittaa md5sum jokaiselle tiedostolle ja lopuksi
  3. 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=workfow
#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ö.

Suomenkielinen tekoälykäännös

Sisällössä voi esiintyä virheellistä tietoa tekoälykäännöksestä johtuen.

Klikkaa tästä antaaksesi palautetta