Hyppää sisältöön

Docs CSC now features an automatic Finnish translation. Click here for more information.

Warning!

Puhti and Mahti will be decommissioned after Roihu becomes available. Users should clean up unnecessary files and move any required data by the end of August 2026. See the Roihu data preparation instructions for details.

Puhti scratch is very full: keep only active data there and move or delete everything else. No new Puhti scratch quota will be granted.

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:

#SBATCH --gres=nvme:<local_storage_space_per_node>

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:

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

Mahdin gpusmall-osio tukee vain yhden tai kahden GPU:n töitä. Siksi enimmäismäärä on --gres=gpu:a100:2

#SBATCH --partition=gpusmall
#SBATCH --gres=gpu:a100:1

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:

#SBATCH --partition=gpusmall
#SBATCH --gres=gpu:a100_1g.5gb:1

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🇹🇦

#SBATCH --nodes=2
#SBATCH --partition=gpumedium
#SBATCH --gres=gpu:a100:4

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:

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

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.

Suomenkielinen tekoälykäännös

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

Klikkaa tästä antaaksesi palautetta