-
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.
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
Laskutusprojektin argumentti on pakollinen. Jos sitä ei aseteta, seurauksena on virhe:
Suoritusaikavaraus asetetaan valinnalla --time:
Aika annetaan muodossa hh:mm:ss (vaihtoehtoisesti d-hh:mm:ss, missä d tarkoittaa päiviä). Enimmäissuoritusaika 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 suoritusaikansa mukaan.
asettaa vaaditun muistimäärän pyydettyä CPU-ydintä kohden. Jos pyydetty muistimäärä ylittyy, työ lopetetaan.
Osio (jono) tulee 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 on ladattava 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 on suoritettava yhden laskentasolmun sisällä. Siksi töitä rajoittavat solmuissa उपलब्ध olevat laitteistoresurssit. 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 kohden. Huomaa, että jos käytät sen sijaan valintaa --mem-per-cpu, työn kokonaismuistipyyntö on CPU-ydintä kohden 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ä tulee aina käyttää, jotta ohjelmisto toimii odotetusti. Jotkin sovellukset käyttävät oletuksena vain yhtä ydintä, vaikka useampia olisi varattu.
Toiset sovellukset taas saattavat yrittää käyttää kaikkia solmun ytimiä, vaikka vain osa niistä olisi varattu. Ympäristömuuttujaa $SLURM_CPUS_PER_TASK, joka sisältää --cpus-per-task-valinnan 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 asettaaksesi sovelluksen käyttämien säikeiden määrän. 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:
Jos tarvitaan tarkempaa hallintaa, solmujen tarkka määrä ja tehtävien määrä solmua kohden voidaan määrittää valinnoilla --nodes ja --ntasks-per-node. Tätä suositellaan yleensä, jotta tehtävät eivät leviä tarpeettoman monelle solmulle, katso suorituskyvyn tarkistuslista.
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 on ladattava 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 rinnakkaistamismenetelmää 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ää kohden, käytä argumenttia --cpus-per-task. Oletusarvo on yksi ydin tehtävää kohden.
Tehtävien määrän ja tehtävää kohden varattujen ytimien optimaalinen suhde vaihtelee sovelluksittain. Oikean yhdistelmän löytämiseksi sovelluksellesi tarvitaan testausta.
Säikeitä tehtävää kohden hybridi-MPI/OpenMP-töissä
Aseta OpenMP-säikeiden määrä MPI-tehtävää kohden eräajotyöskriptissäsi käyttäen ympäristömuuttujia OMP_NUM_THREADS ja SLURM_CPUS_PER_TASK:
Lisäresurssit eräajotöissä
Paikallinen tallennustila
Joissakin Puhdin solmuissa on töille käytettävissä 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- jagputest-osioiden GPU-solmuissa (enintään 3600 GB per solmu)small-,large-,longrun- jainteractive-osioiden käyttämissä I/O-solmuissa (enintään 1490/3600 GB per solmu)hugemem- jahugemem_longrun-osioiden BigMem-solmuissa (enintään 5960 GB per solmu)
Pyydä paikallista tallennustilaa eräajotyöskriptissä --gres-lipulla:
Tilamäärä annetaan gigatavuina (tarkista enimmäiskoot yllä olevasta luettelosta). Esimerkiksi 100 GB tallennustilan pyytämiseen käytä valintaa --gres=nvme:100. Paikallisen tallennustilan varaus tehdään solmukohtaisesti.
Käytä eräajotyöskripteissäsi ympäristömuuttujaa $LOCAL_SCRATCH päästäksesi käsiksi kunkin solmun paikalliseen tallennustilaan. Esimerkiksi suuren aineistopaketin purkamiseen paikalliseen tallennustilaan:
Muista ottaa data talteen
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ä yhteiselle levyalueelle työn lopussa. 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 tulostiedostojen kopioimiseksi takaisin hakemistoon, josta eräajotyö lähetettiin:
GPU:t
Puhdissa on 320 Nvidia Tesla V100 -GPU:ta. GPU:t ovat käytettävissä gpu- ja gputest-osioissa, 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 1 GPU:n ja 10 GB NVMe-tallennustilan pyytämiseen valinta olisi --gres=gpu:v100:1,nvme:10.