-
Mahti-erätyöskriptin luominen
Eräajotyöskriptin luominen Mahtiin
Katso yleinen johdanto eräajoskripteihin CSC:n superlaskentaympäristössä Puhdin dokumentaatiosta. Tällä sivulla keskitymme Mahtiin liittyviin erityisaiheisiin.
Note
Kokonaisia laskentasolmuja varataan töille, lukuun ottamatta small-, interactive- ja GPU-osioiden töitä,
katso myös alla.
Monet valinnat toimivat Mahtissa 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 solmujen määrä ja tehtävien määrä solmua kohden valinnoilla
--nodes ja --ntasks-per-node. Käytä solmun kaikkia 128 ydintä.
Note
- MPI-prosesseja ei pidä käynnistää komennoilla mpirun tai mpiexec. Käytä sen sijaan komentoa
srun. - asianmukainen ohjelmistomoduuli on ladattava eräajotyöskriptiin, jotta työn lähetys toimii oikein.
Hybridieräajot
Kuten Puhdin kohdalla on selitetty, hybridiparallelisointi
voi ajaa useita OpenMP-säikeitä MPI-tehtävää kohden. Valinnan
--ntasks-per-node=X lisäksi on asetettava --cpus-per-task=Y. Oletuksena on yksi cpu
(säie) tehtävää kohden. Jos haluat käyttää kaikkia Mahti-solmun fyysisiä ytimiä, valitse X * Y = 128,
kuten tässä esimerkissä.
Jos käytät samanaikaista monisäikeistystä (katso osio alla), tulee käyttää arvoa X * Y = 256
Optimaalinen suhde tehtävien määrän ja tehtävää kohden varattujen ytimien välillä vaihtelee ohjelman ja työn syötteen mukaan. Oikean yhdistelmän löytämiseksi sovelluksellesi tarvitaan testausta. Esimerkkejä löytyy ohjelmille CP2K ja NAMD.
Hybridieräajot samanaikaisella monisäikeistyksellä (SMT)
Mahti on määritetty siten, että se ei oletusarvoisesti 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ää valintoja --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.
Esimerkkieräajotyöskripti SMT:lle.
Paikallinen tallennustila
Mahti-solmuissa interactive-, small- ja GPU-osioissa 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:
Tilan määrä annetaan gigatavuina (enintään 3800 GB solmua kohden). 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, kun haluat käyttää kunkin solmun paikallista tallennustilaa.
GPU-eräajot
Mahtissa on 24 GPU-solmua, 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 valinnalla:
Mahtin gpusmall-osio tukee vain yhden tai kahden GPU:n töitä. Siksi enimmäismäärä on --gres=gpu:a100:2
Mahtin 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 kohden voit varata
enintään 4 CPU-ydintä, ja kutakin GPU-siivua kohden työlle varataan 17,5 GiB muistia. Huomaa myös, että voit varata
enintään yhden GPU-siivun työtä kohden. GPU-siivut ovat käytettävissä gpusmall-osiossa valinnoilla:
Mahtin gpumedium-osio tukee usean GPU:n töitä, joissa on neljä GPU:ta laskentasolmua kohden.
Alla oleva esimerkki varaa neljä GPU:ta laskentasolmua kohden, eli yhteensä kahdeksan GPU
gpumedium on ainoa GPU-osio, jossa on käytettävissä enemmän kuin yksi laskentasolmu (valinnan --nodes enimmäismäärä on kuusi).
gputest-osio on tarkoitettu lyhyisiin testiajoihin. Valinnan --time enimmäisarvo on 15 minuuttia, ja yhtä tiliä kohden voi olla käynnissä vain yksi työ RUNNING-tilassa.
Valinnan --nodes enimmäisarvo on yksi, mutta testityölle voidaan varata kaikki solmun neljä GPU:ta.
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äikeistysoperaatioita varten voidaan ottaa käyttöön CPU-ytimiä valinnalla --cpus-per-task. Alla olevassa esimerkissä käytetään yhtä GPU:ta, ja CPU-säikeistystä varten on käytettävissä 32 ydintä (32 on 1/4 yhden solmun CPU-ytimistä), sekä 950 GB nopeaa paikallista levytilaa (1/4 solmun paikallisen levyn kokonaismäärästä). Ampere A100 -GPU:ssa on myös oma 40 GB muisti (eikä sille muistille tarvita erillistä varausvalintaa). Oletusmäärä GPU:ta kohden varattua 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-solmun kaikista resursseista, joten samalla GPU-solmulla voisi ajaa neljä vastaavaa eräajotyötä.
Solmujen alikäyttö
Jos sovellus tarvitsee enemmän muistia ydintä kohden kuin mitä on käytettävissä täydellä solmulla (2 GB / ydin), on mahdollista käyttää myös vain osaa solmun ytimistä. Lisäksi jos sovellus on muistiväylärajoitteinen, muistiväylän kaistanleveyttä ja sovelluksen suorituskykyä voidaan parantaa käyttämällä vain yhtä ydintä NUMA-aluetta tai L3-välimuistia kohden (katso lisätietoja Mahtin teknisestä kuvauksesta. Huomaa kuitenkin, että laskutus perustuu aina kokonaisiin solmuihin.
Kun solmuja käytetään vajaasti, tulee aina asettaa
--ntasks-per-node=X ja --cpus-per-task=Y siten, että X * Y = 128,
myös puhtaissa MPI-töissä. Oletusarvoisesti Slurm hajauttaa MPI-tehtävät
etäisyydelle --cpus-per-task, eli valinnalla --cpus-per-task=8 MPI-tehtävä
0 sidotaan CPU-ytimeen 0, MPI-tehtävä 1 sidotaan CPU-ytimeen
7 jne. Muistikaistanleveys (ja sovelluksen suorituskyky) on
paras silloin, kun tehtävät suoritetaan mahdollisimman hajautetuilla ytimillä. Esimerkiksi
32 GB / ydin käyttämiseksi voidaan ajaa vain 8
tehtävällä solmua kohden 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ä NUMA-aluetta kohden ja yksi OpenMP-säie L3-välimuistia kohden,
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 Mahtin 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 Mahtin 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ällä sivulla olevan ensimmäisen MPI-esimerkkityön tuottaman 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-osion työt voivat varata 1–8 ydintä, ja jokainen 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 alkaa 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
Suurten pienten ei-MPI-töiden määrien suorittaminen
Mahtissa HyperQueue -meta-ajastinta voidaan käyttää suurten pienten ei-MPI-töiden määrien käsittelyyn.