-
Mahti-erätyöskriptin luominen
Eräajotyöskriptin luominen Mahdille
Katso yleinen johdanto CSC:n superlaskentaympäristön eräajoskripteihin Puhdin dokumentaatiosta . Tällä sivulla keskitymme Mahti-kohtaisiin aiheisiin.
Note
Täydet noodit varataan töille lukuun ottamatta small-osion,
interactive-osion ja GPU-osioiden töitä,
katso myös alla.
Monet valinnat toimivat Mahdissa myös eri tavalla kuin Puhdissa, joten
skriptien kopioimista Puhdista Mahtiin ilman asianmukaisia
muutoksia ei suositella.
Perus-MPI-eräajot
Esimerkki yksinkertaisesta MPI-eräajotyöskriptistä:
#!/bin/bash
#SBATCH --job-name=myTest
#SBATCH --account=<project>
#SBATCH --time=02:00:00
#SBATCH --partition=medium
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=128
module load myprog/1.2.3
srun myprog -i input -o output
Määritä tarkka noodien määrä ja tehtävien määrä per noodi
vaihtoehdoilla --nodes ja --ntasks-per-node. Käytä noodin
kaikkia 128 ydintä.
Note
- MPI-prosesseja ei pidä käynnistää komennoilla mpirun tai mpiexec. Käytä sen sijaan
srun. - asianmukainen ohjelmistomoduuli on ladattava eräajotyöskriptissä, jotta työn lähetys toimii oikein.
Hybridieräajot
Kuten Puhdin kohdalla on selitetty, hybridirinnakkaistus
voi ajaa useita OpenMP-säikeitä per MPI-tehtävä. Vaihtoehdon
--ntasks-per-node=X lisäksi on asetettava --cpus-per-task=Y. Oletuksena on yksi cpu
(säie) per tehtävä. Jotta kaikki Mahdin noodin fyysiset ytimet saadaan käyttöön, valitse X * Y = 128,
kuten tässä esimerkissä.
Jos käytät samanaikaista monisäikeistystä (katso osio alla), sinun tulee käyttää arvoa X * Y = 256
Optimaalinen suhde tehtävien määrän ja tehtävää kohti varattujen ytimien välillä vaihtelee ohjelman ja työn syötteen mukaan. Oikean yhdistelmän löytämiseksi sovelluksellesi tarvitaan testausta. Löydät esimerkkejä ohjelmille CP2K ja NAMD.
Hybridieräajot samanaikaisella monisäikeistyksellä (SMT)
Mahti on määritetty siten, että oletuksena se ei sijoita säikeitä loogisille ytimille.
SMT-tuki voidaan ottaa käyttöön valinnalla --hint=multithread.
Kun tätä valintaa käytetään, on tärkeää käyttää asetuksia --ntasks-per-node=X ja
--cpus-per-task=Y siten, että X * Y = 256. Jos näin ei tehdä, osa
todellisista fyysisistä ytimistä jää varaamatta ja suorituskyky on heikompi.
Esimerkki SMT:tä käyttävästä eräajotyöskriptistä.
Paikallinen tallennustila
Mahdin interactive-, small- ja GPU-osioiden noodeilla on myös nopea paikallinen tallennustila, joka sopii hyvin paljon I/O:ta käyttäville sovelluksille.
Pyydä paikallista tallennustilaa työn lähetyksessä --gres-valinnalla:
Tallennustilan määrä annetaan gigatavuina (enintään 3800 GB per noodi). Esimerkiksi 100 GB:n tallennustilan pyytämiseen käytä valintaa --gres=nvme:100. Paikallisen tallennustilan varaus tehdään noodikohtaisesti. Käytä ympäristömuuttujaa $LOCAL_SCRATCH eräajotyöskripteissäsi päästäksesi käsiksi kunkin noodin paikalliseen tallennustilaan.
GPU-eräajot
Mahdissa on 24 GPU-noodia, ja jokaisessa niistä on neljä Nvidia Ampere A100 GPU:ta sekä paikallinen 3,8 TB:n Nvme-asema.
GPU:t ovat käytettävissä gputest-, gpusmall- ja gpumedium-osioissa seuraavalla valinnalla:
Mahdin gpusmall-osio tukee vain yhden tai kahden GPU:n töitä. Siksi enimmäismäärä on --gres=gpu:a100:2
Mahdin gpusmall-osiossa on myös A100-GPU:ita, jotka on pilkottu pienemmiksi a100_1g.5gb-GPU:iksi,
joissa on yksi seitsemäsosa täyden A100-GPU:n laskenta- ja muistiresursseista. Kutakin GPU-siivua kohti voit varata
enintään 4 CPU-ydintä, ja kutakin GPU-siivua kohti työlle varataan 17,5 GiB muistia. Huomaa myös, että voit varata
enintään yhden GPU-siivun per työ. GPU-siivut ovat käytettävissä gpusmall-osiossa seuraavilla valinnoilla:
Mahdin gpumedium-osio tukee usean GPU:n töitä, joissa on neljä GPU:ta per laskentanoodi.
Alla oleva esimerkki varaa neljä GPU:ta per laskentanoodi, eli yhteensä kahdeksan GPU
gpumedium on ainoa GPU-osio, jossa on käytettävissä enemmän kuin yksi laskentanoodi (vaihtoehdon --nodes enimmäismäärä on kuusi).
gputest-osio on tarkoitettu lyhyisiin testiajoihin. Vaihtoehdon --time enimmäisarvo on 15 minuuttia, ja yhtä tiliä kohti voi olla käynnissä yksi työ RUNNING-tilassa.
Vaihtoehdon --nodes enimmäisarvo on yksi, mutta noodin kaikki neljä GPU:ta voidaan varata testityölle.
Useita resursseja voidaan pyytää pilkuilla erotetulla listalla. Pyydä sekä GPU että paikallinen tallennustila:
Monet GPU-sovellukset tukevat myös CPU-monisäikeistystä, mutta eivät kaikki. Jos CPU-säikeistystä tuetaan, sovelluksen säikeistysoperaatioihin voidaan ottaa käyttöön CPU-ytimiä valinnalla --cpus-per-task. Alla oleva esimerkki käyttää yhtä GPU:ta, ja CPU-säikeistykseen on käytettävissä 32 ydintä (32 on 1/4 yhden noodin CPU-ytimistä), sekä 950 GB nopeaa paikallista levytilaa (1/4 noodin paikallisen levyn kokonaismäärästä). Ampere A100 GPU:lla on myös oma 40 GB:n muistinsa (eikä tälle muistille tarvitse erillistä varausvalintaa). Oletusmäärä GPU:ta kohti varattavaa keskusmuistia on 122,5 GB
#SBATCH --partition=gpusmall
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=32
#SBATCH --gres=gpu:a100:1,nvme:950
# If multithreading is OpenMP implementation then define also OMP_NUM_THREADS environment variable
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
Yllä oleva esimerkki käyttää siis 1/4 GPU-noodin kaikista resursseista, joten samalla GPU-noodilla voisi ajaa neljä samanlaista eräajotyötä.
Noodien alivaraus
Jos sovellus tarvitsee enemmän muistia ydintä kohti kuin mitä on saatavilla täydellä noodilla (2 GB / ydin), on mahdollista käyttää myös vain osaa noodin ytimistä. Lisäksi jos sovellus on muistiväylärajoitteinen, muistin kaistanleveyttä ja sovelluksen suorituskykyä voidaan parantaa käyttämällä vain yhtä ydintä per NUMA-alue tai L3-välimuisti (katso lisätietoja Mahdin teknisestä kuvauksesta. Huomaa kuitenkin, että laskutus perustuu aina täysiin noodeihin.
Kun noodeja alivarataan, tulee aina asettaa
--ntasks-per-node=X ja --cpus-per-task=Y siten, että X * Y = 128,
myös puhtaissa MPI-töissä. Oletuksena Slurm hajauttaa MPI-tehtävät
etäisyydelle --cpus-per-task, eli asetuksella --cpus-per-task=8 MPI-tehtävä
0 sidotaan CPU-ytimeen 0, MPI-tehtävä 1 sidotaan CPU-ytimeen
7 jne. Muistin kaistanleveys (ja sovelluksen suorituskyky) on
paras silloin, kun tehtävät suoritetaan mahdollisimman hajautetuilla ytimillä. Esimerkiksi
jotta voidaan käyttää 32 GB / ydin, voidaan ajaa vain 8
tehtävällä per noodi seuraavasti
#SBATCH --ntasks-per-node=8
#SBATCH --cpus-per-task=16
module load myprog/1.2.3
export OMP_NUM_THREADS=1
srun myprog -i input -o output
Hybridisovelluksissa tulisi käyttää
OpenMP-ajonaikaista ympäristömuuttujaa OMP_PROC_BIND
OpenMP-säikeiden sijoitteluun. Esimerkiksi jotta voidaan ajaa
yksi MPI-tehtävä per NUMA-alue ja yksi OpenMP-säie per L3-välimuisti,
voidaan asettaa
#SBATCH --ntasks-per-node=8
#SBATCH --cpus-per-task=16
export OMP_NUM_THREADS=4
export OMP_PROC_BIND=spread
module load myprog/1.2.3
srun myprog -i input -o output
Katso myös sivumme Mahdin eräajoskriptiesimerkit.
Interactive-osion käyttäminen ei-rinnakkaiseen esi- tai jälkikäsittelyyn
Monissa tapauksissa laskentatehtäviin kuuluu esi- tai jälkikäsittelyvaiheita, jotka eivät pysty hyödyntämään rinnakkaislaskentaa.
Näissä tapauksissa on suositeltavaa, jos mahdollista, jakaa tehtävä useisiin ketjutettuihin eräajotöihin ja suorittaa ei-rinnakkainen
käsittely Mahdin interactive-osiossa.
Interactive-osiossa työt voivat varata vain muutaman ytimen, jolloin ei-rinnakkaiset tehtävät voidaan suorittaa ilman resurssien hukkaamista.
Huomaa, että interactive-osiota voi käyttää myös ei-interaktiivisiin töihin ja että voit linkittää kaksi eräajotyötä niin, että toinen työ käynnistyy
vasta kun ensimmäinen on päättynyt.
Oletetaan esimerkiksi, että haluamme jälkikäsitellä tämän sivun aivan ensimmäisessä MPI-esimerkkityössä tuotetun output-tiedoston. Jälkikäsittelykomento
python post-proc.py output käyttää vain sarjalaskentaa ja vaatii noin 40 minuuttia sekä 3 GB muistia. Sen sijaan, että jälkikäsittely
sisällytettäisiin päätyöhön, se on järkevää suorittaa erillisenä työnä interactive-osiossa.
Interactive-osiossa työt voivat varata 1–8 ydintä, ja kukin ydin varaa 1,875 GB muistia. Tässä tapauksessa varaamme siis 2 ydintä --cpus-per-task=2, jotta muistia on riittävästi käytettävissä (3,75 GB). Lisäksi --dependency=afterok:<slurm-jobid> määrittää, että työ voi käynnistyä vasta, kun aiemmin lähetetty työ on päättynyt onnistuneesti. Tässä <slurm-jobid> korvataan sen eräajotyön tunnistenumerolla, joka tuottaa output-tiedoston (saat tunnistenumeron, kun lähetät työn).
#!/bin/bash
#SBATCH --job-name=post-process-myTest
#SBATCH --account=<project>
#SBATCH --time=00:50:00
#SBATCH --partition=interactive
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=2
#SBATCH --dependency=afterok:<slurm-jobid>
python post-proc.py output
Suuren pienten ei-MPI-töiden määrän suorittaminen
Mahdissa HyperQueue -meta-ajastinta voidaan käyttää suuren pienten ei-MPI-töiden määrän käsittelyyn.