Hyppää sisältöön

Welcome to our weekly research support coffee hour on Zoom! Click here for more information.

Warning!

Puhti scratch disk is becoming very full (80+ % ) resulting in performance degradation. Everybody is advised to only keep actively processed data on scratch, all other data should be deleted, transferred to host institute or stored in Lumi-O. No new quota will be granted. Click here for a tool for examining your disk usage.

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:

#SBATCH option_name argument

Esimerkissämme

#SBATCH --job-name=myTest

asettaa työn nimeksi myTest. Nimeä voidaan käyttää työn tunnistamiseen jonossa ja muissa listauksissa.

#SBATCH --account=<project>

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:

sbatch: error: AssocMaxSubmitJobLimit
sbatch: error: Batch job submission failed: Job violates accounting/QOS policy (job submit limit, user's size and/or time limits)

Suoritusaikavaraus asetetaan valinnalla --time:

#SBATCH --time=02:00:00

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.

#SBATCH --mem-per-cpu=2G

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:

#SBATCH --partition=small

Käyttäjälle voidaan lähettää sähköposti-ilmoitus, kun työ alkaa, käyttämällä valintaa --mail-type

##SBATCH --mail-type=BEGIN          # Uncomment to enable mail

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.

module load myprog/1.2.3

Lopuksi käynnistämme sovelluksen pyydetyillä resursseilla komennolla srun:

srun myprog -i input -o output

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

export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK

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:

#SBATCH --ntasks=<number_of_mpi_tasks>

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 mpirun tai mpiexec. Käytä sen sijaan komentoa srun.
  • 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:

export OMP_NUM_THREADS=$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- ja gputest-osioiden GPU-solmuissa (enintään 3600 GB per solmu)
  • small-, large-, longrun- ja interactive-osioiden käyttämissä I/O-solmuissa (enintään 1490/3600 GB per solmu)
  • hugemem- ja hugemem_longrun-osioiden BigMem-solmuissa (enintään 5960 GB per solmu)

Pyydä paikallista tallennustilaa eräajotyöskriptissä --gres-lipulla:

#SBATCH --gres=nvme:<local_storage_space_per_node_in_GB>

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:

tar xf my-large-dataset.tar.gz -C $LOCAL_SCRATCH

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:

mv $LOCAL_SCRATCH/my-important-output.log $SLURM_SUBMIT_DIR

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:

#SBATCH --gres=gpu:v100:<number_of_gpus_per_node>

--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:

#SBATCH --gres=gpu:v100:<number_of_gpus_per_node>,nvme:<local_storage_space_per_node>

Esimerkiksi 1 GPU:n ja 10 GB NVMe-tallennustilan pyytämiseen valinta olisi --gres=gpu:v100:1,nvme:10.

Lisätietoja

Suomenkielinen tekoälykäännös

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

Klikkaa tästä antaaksesi palautetta