-
Puhti-erätyöskriptin luominen
Eräajotyöskriptin luominen Puhdissa
Eräajotyöskripti sisältää määrittelyt työlle varattavista resursseista sekä komennot, jotka käyttäjä haluaa suorittaa.
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.
Yksinkertainen eräajotyöskripti
Esimerkki yksinkertaisesta eräajotyöskriptistä:
#!/bin/bash
#SBATCH --job-name=myTest # Job name
#SBATCH --account=<project> # Billing project, has to be defined!
#SBATCH --time=02:00:00 # Max. duration of the job
#SBATCH --mem-per-cpu=2G # Memory to reserve per core
#SBATCH --partition=small # Job queue (partition)
##SBATCH --mail-type=BEGIN # Uncomment to enable mail
module load myprog/1.2.3 # Load required modules
srun myprog -i input -o output # Run program using requested resources
Ensimmäinen rivi #!/bin/bash kertoo, että tiedosto tulee tulkita Bash-skriptinä.
Rivit, jotka alkavat merkinnällä #SBATCH, ovat eräajojärjestelmän argumentteja (direktiivejä). Näissä esimerkeissä käytetään vain pientä osaa valinnoista. Luettelo kaikista mahdollisista valinnoista löytyy Slurmin dokumentaatiosta.
#SBATCH-valinnan yleinen syntaksi on:
Esimerkissämme
asettaa työn nimeksi myTest. Nimeä voidaan käyttää työn tunnistamiseen jonossa ja muissa listauksissa.
asettaa työn laskutusprojektin. Korvaa <project> projektisi Unix-ryhmällä. Löydät sen MyCSC:stä välilehdeltä Projects. Lisätietoja laskutuksesta.
Muista määrittää laskutusprojekti
Laskutusprojektiargumentti on pakollinen. Jos sitä ei aseteta, seurauksena on virhe:
Ajoaikavaraus asetetaan valinnalla --time:
Aika annetaan muodossa hh:mm:ss (vaihtoehtoisesti d-hh:mm:ss, missä d tarkoittaa päiviä). Enimmäisajoaika riippuu valitusta jonosta. Kun aikavaraus päättyy, työ lopetetaan riippumatta siitä, onko se valmistunut vai ei, joten aikavarauksen tulee olla riittävän pitkä. Huomaa, että työ kuluttaa laskutusyksiköitä (BUs) todellisen ajoaikansa mukaan.
asettaa vaaditun muistin jokaista pyydettyä CPU-ydintä kohti. Jos pyydetty muistimäärä ylittyy, työ lopetetaan.
Osio (jono) täytyy asettaa työn vaatimusten mukaisesti. Esimerkiksi:
Saatavilla olevat osiot
Käyttäjälle voidaan lähettää sähköposti-ilmoitus, kun työ alkaa, käyttämällä valintaa --mail-type
Muita hyödyllisiä argumentteja (useat argumentit erotetaan pilkulla) ovat END ja FAIL. Oletuksena sähköposti lähetetään CSC-käyttäjätiliisi liitettyyn sähköpostiosoitteeseen. Tämän voi ohittaa valinnalla --mail-user=.
Kun kaikki tarvittavat resurssit on määritelty eräajotyöskriptissä, määritä tarvittava ympäristö lataamalla sopivat moduulit. Huomaa, että jotta moduulit ovat käytettävissä eräajotöissä, ne täytyy ladata eräajotyöskriptissä. Lisätietoja ympäristömoduuleista.
Lopuksi käynnistämme sovelluksen pyydetyillä resursseilla komennolla srun:
Sarjalliset ja jaetun muistin eräajotyöt
Sarjalliset ja jaetun muistin työt täytyy suorittaa yhden laskentasolmun sisällä. Siksi töitä rajoittavat solmuissa उपलब्ध olevat laitteistomääritykset. Puhdissa jokaisessa solmussa on kaksi prosessoria, joissa kummassakin on 20 ydintä, eli yhteensä 40 ydintä. Katso lisää Puhdin teknisiä tietoja.
#SBATCH-valintaa --cpus-per-task käytetään määrittämään, kuinka monta laskentaydintä eräajotyön tehtävä käyttää. Valinta --nodes=1 varmistaa, että kaikki varatut ytimet sijaitsevat samassa solmussa, ja --ntasks=1 osoittaa kaikki varatut laskentaytimet samalle tehtävälle.
Säiepohjaisissa töissä muistivaraukseen suositellaan valintaa --mem. Tämä valinta määrittää tarvittavan muistimäärän solmua kohti. Huomaa, että jos käytät sen sijaan valintaa --mem-per-cpu, työn kokonaismuistipyyntö on CPU-ydintä kohti pyydetty muistimäärä (--mem-per-cpu) kerrottuna varattujen ytimien määrällä (--cpus-per-task). Siksi, jos muutat ytimien määrää, tarkista myös, että muistivaraus on sopiva.
Yleensä tehokkain käytäntö on sovittaa varattujen ytimien määrä (--cpus-per-task) vastaamaan sovelluksen käyttämien säikeiden tai prosessien määrää. Tarkista kuitenkin aina sovelluskohtaiset tiedot.
Jos sovelluksessa on komentorivivalinta säikeiden/prosessien/ytimien määrän asettamiseen, sitä tulisi aina käyttää, jotta ohjelmisto toimii odotetusti. Jotkin sovellukset käyttävät oletuksena vain yhtä ydintä, vaikka useampia olisi varattu.
Toiset sovellukset saattavat yrittää käyttää kaikkia solmun ytimiä, vaikka vain osa niistä olisi varattu. Ympäristömuuttujaa $SLURM_CPUS_PER_TASK, joka sisältää valinnan --cpus-per-task arvon, voidaan käyttää numeron sijasta määritettäessä käytettävien ytimien määrää. Tämä on hyödyllistä, koska komentoa ei tarvitse muuttaa, jos --cpus-per-task muuttuu myöhemmin.
Lopuksi käytä ympäristömuuttujaa OMP_NUM_THREADS asettamaan sovelluksen käyttämien säikeiden määrä. Esimerkiksi
MPI-pohjaiset eräajotyöt
MPI-töissä jokaisella tehtävällä on oma muistivarauksensa. Siksi tehtävät voidaan jakaa useille solmuille.
Aseta MPI-tehtävien määrä seuraavasti:
Muistin pyytämiseen suositellaan valintaa --mem-per-cpu.
MPI-ohjelmien suorittaminen
- MPI-ohjelmia ei pidä käynnistää komennoilla
mpiruntaimpiexec. Käytä sen sijaan komentoasrun. - MPI-moduuli täytyy ladata eräajotyöskriptissä, jotta ohjelma toimii oikein.
Hybridieräajotyöt
Hybriditöissä jokaiselle tehtävälle varataan useita ytimiä. Kukin tehtävä käyttää sitten työn suorittamiseen jotakin muuta rinnakkaistusta kuin MPI:tä. Yleisin strategia on, että jokainen MPI-tehtävä käynnistää useita säikeitä OpenMP:n avulla. Jos haluat pyytää enemmän ytimiä MPI-tehtävää kohti, käytä argumenttia --cpus-per-task. Oletusarvo on yksi ydin tehtävää kohti.
Tehtävien määrän ja tehtävää kohti varattujen ytimien optimaalinen suhde vaihtelee sovelluksittain. Oikean yhdistelmän löytämiseksi sovelluksellesi tarvitaan testausta.
Säikeitä tehtävää kohti hybridi MPI/OpenMP -töissä
Aseta OpenMP-säikeiden määrä MPI-tehtävää kohti eräajotyöskriptissäsi käyttämällä ympäristömuuttujia OMP_NUM_THREADS ja SLURM_CPUS_PER_TASK:
Lisäresurssit eräajotöissä
Paikallinen tallennustila
Joissakin Puhdin solmuissa on töille saatavilla nopeaa paikallista tallennustilaa (NVMe). Paikallisen tallennustilan käyttöä suositellaan I/O-intensiivisille sovelluksille eli töille, jotka esimerkiksi lukevat ja kirjoittavat paljon pieniä tiedostoja. Katso lisätietoja.
Paikallista tallennustilaa on saatavilla:
- GPU-solmuissa osioissa
gpujagputest(enintään 3600 GB per solmu) - I/O-solmuissa, joita käyttävät osiot
small,large,longrunjainteractive(enintään 1490/3600 GB per solmu) - BigMem-solmuissa osioissa
hugememjahugemem_longrun(enintään 5960 GB per solmu)
Pyydä paikallista tallennustilaa eräajotyöskriptissä lipulla --gres:
Tilamäärä annetaan gigatavuina (tarkista enimmäiskoot yllä olevasta listasta). Esimerkiksi pyytääksesi 100 GB tallennustilaa käytä valintaa --gres=nvme:100. Paikallisen tallennustilan varaus tehdään solmukohtaisesti.
Käytä ympäristömuuttujaa $LOCAL_SCRATCH eräajotyöskripteissäsi päästäksesi käsiksi kunkin solmun paikalliseen tallennustilaan. Esimerkiksi suuren aineistopaketin purkamiseen paikalliseen tallennustilaan:
Muista palauttaa datasi
Työllesi varattu paikallinen tallennustila tyhjennetään työn päätyttyä. Siksi, jos kirjoitat dataa paikalliselle levylle työn aikana, muista siirtää kaikki säilytettäväksi haluamasi tiedot työn lopussa jaetulle levyalueelle. Erityisesti datan siirtämiseen tarvittavat komennot on annettava eräajotyöskriptissä, koska et voi enää käyttää paikallista tallennustilaa eräajotyön päätyttyä. Esimerkiksi joidenkin tulostietojen kopioimiseksi takaisin hakemistoon, josta eräajotyö lähetettiin:
GPU:t
Puhdissa on 320 Nvidia Tesla V100 GPU:ta. GPU:t ovat saatavilla osioissa gpu ja gputest, ja niitä voidaan pyytää seuraavasti:
--gres-varaus tehdään solmukohtaisesti. Kussakin GPU-solmussa on 4 GPU:ta.
Useita resursseja voidaan pyytää pilkuilla erotetulla listalla. Jos haluat pyytää sekä GPU:n että paikallista tallennustilaa:
Esimerkiksi yhden GPU:n ja 10 GB NVMe-tallennustilan pyytämiseen valinta olisi --gres=gpu:v100:1,nvme:10.