Hyppää sisältöön

Docs CSC now features an automatic Finnish translation. 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.

Käytännön harjoitus: eräajot Puhdissa

Seuraavat harjoitukset opastavat sinut ensimmäisten eräajojesi lähettämisessä Puhdissa. Olemme käyttäneet esimerkkeinä R:ää ja HMMERiä, mutta samat periaatteet pätevät myös muihin sovelluksiin. Tarkista kuitenkin aina sovelluskohtainen sivu, jos sellainen on olemassa. Sieltä voi löytyä juuri kyseiselle sovellukselle räätälöity mallipohja.

Hae harjoitustiedostot

a) Kirjaudu Puhtiin terminaalista

ssh your-username@puhti.csc.fi tai jos sinulla ei ole SSH-asiakasohjelma saatavilla, voit kirjautua Puhdin selainkäyttöliittymän kautta verkkoselaimella ja avata siellä terminaalin.

b) Siirry scratch-hakemistoon ja lataa harjoitustiedosto

Komento csc-workspaces näyttää, minkä projektien jäsen olet.

csc-workspaces
...
Project: project_20001234 "Great science with HPC tools"

/projappl/project_20001234        16G/54G         38K/100K
/scratch/project_20001234         56G/1.1T       107K/1.0M
------------------------------------------------------------
Kirjoita muistiin projektin nimi (tässä: project_20001234). Valitse se, jonka kanssa haluat työskennellä, ja siirry sen scratch-hakemistoon (älä työskentele $HOME-kansiossa!):

cd /scratch/project_20001234

ja lataa syötetiedostot komennolla wget:

wget https://a3s.fi/docs-files/input-data.tar

c) Pura harjoitustiedosto

tar xvf input-data.tar

Note

Kursivoitu teksti ei ole komento, vaan voit valita siihen itse sopivan arvon (mutta sinun täytyy käyttää samaa arvoa johdonmukaisesti myöhemmin).

Yksinkertainen eräajoskripti

a) Luo eräajoskripti, joka tulostaa sen laskentasolmun nimen, jolla se suoritetaan.

Käyttäen nano-editoria (voit käyttää mitä tahansa haluamaasi editoria):

nano test_hostname.sh

Laita tiedostoon seuraava sisältö.

#!/bin/bash -l
#SBATCH --job-name=print_hostname
#SBATCH --time=00:01:00
#SBATCH --partition=test
#SBATCH --ntasks=1
#SBATCH --mem-per-cpu=1G
#SBATCH --account=project_20001234

sleep 30
echo "This job runs on the host: "; hostname

Poistu nano-editorista näin:

CTRL+O (enter); CTRL+X (confirm save)

Lähetä eräajoskripti Puhtiin

sbatch test_hostname.sh

b) Tarkista työn tila.

Korvaa seuraavassa komennossa <your username> omalla CSC-käyttäjätunnuksellasi – tai sillä tunnuksella, jolla kirjauduit Puhtiin. Jos et ole varma mikä se on, voit tarkistaa sen komennolla whoami tai tällä komennolla echo $USER).

squeue -u your_username

c) Mitä työ tulosti ja minne?

Note

Tässä sinun täytyy korvata JOBID sillä tunnisteella, jonka työsi sai.

less slurm-JOBID.out (type q to quit)

Jos työ epäonnistui, tarkista mikä projekti sinulla oli eräajoskriptissä kohdassa --account=??? Tyypillisiä syitä epäonnistuneeseen eräajoon UKK:ssamme

Yksinkertainen R-ajo

Suorita yksinkertainen R-ajo skriptistä. Skripti sovittaa suoran tiedostossa olevien x,y-arvoparien läpi. Lisätietoa R:n ajamisesta CSC:n ympäristössä

a) Käynnistä interaktiivinen eräajo ja alusta R-ympäristö

Koska aiomme nyt ajaa sovellusta interaktiivisesti, pyydämme interaktiivisen eräajon ja työskentelemme siellä kirjautumissolmun sijaan. Seuraava komento käynnistää sen (käytä samaa project-arvoa kuin yllä olevassa eräajoskriptissä):

sinteractive --account <project> --mem 4000 --tmp 10 --time 2:00:00

Anna komento module load r-env alustamaan R-ympäristö.

  • Mistä tiedät, onko se jo ladattu?

Siirry hakemistoon r-job, jossa data sijaitsee (tiedosto nimeltä data.csv) ja käynnistä R:

start-r

Sinun pitäisi nähdä hieman aloitustekstiä, ja komentokehotteen pitäisi nyt näyttää tältä:

...
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

>
Sovita nyt interaktiivisesti suora tiedoston data.csv datapisteisiin. Kirjoita (tai kopioi/liitä) seuraavat komennot komentokehotteeseen (paina enteriä jokaisen rivin jälkeen, ja tarkkaile virheilmoituksia):
mydata <- read.csv("data.csv")
fit <- lm(y~x,mydata)
fit$coefficients
Sinun pitäisi nähdä jotakin tämän kaltaista:
(Intercept)           x
  0.8289352   3.1440282
Poistu sitten R:n komentokehotteesta komennolla
q()

b) Luo skripti saman työn suorittamiseen.

Luo hakemistossa "r-job" R-skriptitiedosto (suoritettavat R-komennot), jossa on samat komennot kuin liitit R:n komentokehotteeseen. Anna tiedostolle nimeksi fit.R

Voit käyttää esimerkiksi nano-editoria, joka täytyy alustaa ensin komennolla module load nano (interaktiivisessa solmussa; kirjautumissolmussa se on käytettävissä ilman module load -komentoa).

Varmista, että tiedosto on kunnossa komennolla:

cat fit.R
Sinun pitäisi nähdä kolme riviä R-komentoja.

c) Suorita skripti interaktiivisesti

apptainer_wrapper exec Rscript --no-save --no-restore -f fit.R

d) Tulokset

  • Onnistuiko työ?
  • Mitkä ovat sovituksen kertoimet?

Yksinkertainen R-ajo eräajona

Suorita nyt edellinen R-skripti eräajona.

a) Luo eräajoskripti, joka lähettää työn jonoon.

Kopioi sarjallisen eräajoskriptin mallipohja CSC:n R-env-sivulta tiedostoon nimeltä batch.sh

Laskentaresurssien määrittelyn lisäksi tämä skripti nollaa myös joitakin ylimääräisiä R-ympäristömuuttujia. Näitä ei tarvita, jos ajat jotakin muuta sovellusta. Tarkista aina ensin, onko sovelluksellesi olemassa mallieräajoskripti, ja käytä sitä oman skriptisi pohjana.

Tätä esimerkkiä varten sinun täytyy tehdä kolme muutosta. Korvaa paikkamerkki riveillä --account ja echo "TMPDIR=/scratch/... omalla laskentaprojektillasi. Vaihda lopuksi skriptin lopussa (myscript.R) eli suoritettava R-skripti muotoon fit.R.

b) Lähetä eräajoskripti komennolla

sbatch batch.sh

c) Onnistuiko työ? Missä sovituksen vakiot ovat?

Aja kymmeniä R-eräajoja taulukkotyönä

Tässä esimerkissä toistamme edellisen sovitustyön 20 aineistolle käyttäen SLURMin taulukkotyötoiminnallisuutta. Huomaa, että näin lyhyille töille ei olisi järkevää käyttää erillisiä eräajoja, vaan ne voisi käydä läpi silmukassa yhdessä työssä tai mieluummin R-skriptin sisällä.

a) Valmistele käsiteltävien tiedostojen lista.

Siirry kansioon nimeltä r-array. Luo sinne tiedosto nimeltä datanames.txt. Tämä tiedosto sisältää kaikkien niiden tiedostojen nimet, joita käytetään sovituksen syötteenä. Suorita seuraavat komennot sen luomiseksi.

cd data_dir
ls 
ls > ../datanames.txt

b) Kirjoita R-skripti, joka tekee sovituksen.

Palaa takaisin kansioon r-array, luo skripti nimeltä modelscript.R ja lisää siihen seuraavat komennot (voit kopioida edellisen skriptin ja muokata sitä tai aloittaa alusta).

dataname <- commandArgs(trailingOnly = TRUE)
mydata <- read.csv(paste0("data_dir/",dataname))
fit <- lm(y~x,mydata)
write(fit$coefficients,
file=paste0("result_dir/",dataname,"_result.txt"))

Ensimmäinen rivi poimii eräajokomennosta sovitettavan aineiston nimen. Seuraava rivi lukee datan muuttujaan mydata. Sen jälkeen teemme sovituksen kuten edellisessä esimerkissä ja lopuksi kirjoitamme kertoimet tiedostoon.

c) Luo eräajoskripti työn lähettämistä varten.

Anna sille nimeksi R_array.sh. Kopioi sisältö edellisestä esimerkistä. Lisää seuraava rivi muiden #SBATCH-alkuisten rivien joukkoon:

#SBATCH --array=1-20

Tämä pyytää SLURMia ajamaan 20 työn taulukon. Muokkaa tulos- ja virhetiedostot omiin hakemistoihinsa ja tiedostoihinsa lisäämällä/muokkaamalla (sekä %a korvataan taulukkotyön numerolla):

#SBATCH --output=out/output%a.txt
#SBATCH --error=err/errors%a.txt

Vaihda käytettävä SLURM-osio (--partition=) arvosta test arvoon small.

Lisää ennen riviä, jolla on srun apptainer_wrapper..., seuraava rivi

dataname=$(sed -n "$SLURM_ARRAY_TASK_ID"p datanames.txt)
ja muokkaa R-komennon suorittava rivi muotoon:

srun apptainer_wrapper exec Rscript --no-save modelscript.R $dataname

Sinulla pitäisi nyt olla:

  1. datanames.txt, jossa ovat datatiedostojesi nimet
  2. modelscript.R, joka sisältää sovituksen tekevän R-koodin
  3. R_array.sh, joka on työn lähettävä eräajoskripti
  4. (sekä kansiot out, err, data_dir, result_dir, jotka olivat siellä jo valmiiksi)

d) suorita eräajoskripti komennolla

sbatch R_array.sh
Koska ajat nyt 20 työtä, niiden pääsy jonosta ajoon voi kestää hetken. Sovituskertoimet pitäisi tulla erillisiin tiedostoihin hakemistossa result_dir. Tarkastellaan nyt tuloksia interaktiivisella R:llä.

e) Kerää tulokset ja piirrä ne.

Huomaa, että piirtäminen toimii vain, jos käytössäsi on etä-X11-välitys. R:lle on itse asiassa olemassa myös erikseen räätälöity etäkäyttöratkaisu RStudio Server, ja voit hyvin käyttää sitä, mutta tässä harjoituksessa keskeinen tavoite on havainnollistaa yleistä toimintatapaa.

Kansiossa, jossa on analyse.R, käynnistä interaktiivinen R-komentotulkki komennolla

start-x

Aukeavassa R-komentotulkissa kirjoita source("analyse.R"). Tämä suorittaa (source) skriptin sisällön. Alkuperäinen data oli luotu laskemalla y-arvot kaavalla y=2x + satunnaista kohinaa. Kuvaaja ilmestyy erilliseen ikkunaan.

f) Kuinka hyvin sovituskertoimet vastaavat tätä?

Eräajo säierinnakkaistuksella

Joitakin sovelluksia voidaan ajaa rinnakkain niiden nopeuttamiseksi. Tässä esimerkissä ajat HMMER-ohjelmistoa kuvaamaan ja analysoimaan toisiinsa liittyviä tai samankaltaisia proteiinisekvenssialueita sekä sarjallisesti että rinnakkain nähdäksesi, nopeutuvatko ajot.

HMMER käyttää tietokantaa, joka on jo asennettu, mutta tutkittavat proteiinisekvenssit täytyy ensin kopioida käytettäväksi syötteenä:

wget https://a3s.fi/docs-files/example.fasta

a) Sarjallinen HMMER-ajo

Ajetaan ensin työ vain yhdellä ytimellä. Kopioi jokin vanhoista eräajo- skripteistä nykyiseen hakemistoon ja muuta / lisää siihen seuraavat kohdat (tai katso näitä esimerkkejä):

  1. tuloste tiedostoon out_%j.txt
  2. virheet tiedostoon err_%j.txt
  3. ajoaika 10 minuuttia
  4. lataa hmmer-moduuli
  5. poista R:lle ominaiset ympäristöasetukset
  6. suorituskomento:
hmmscan $PFAMDB/pfam_a.hmm example.fasta > example_1.result

Lähetä työ komennolla: sbatch your-jobscript-name.sh

Työn lähettäminen tulostaa SLURM JOBID -numeron näytölle, mutta se näkyy myös tulos- ja virhetiedostojen nimissä (out_<SLURM_JOBID>.out). Tarkista, onko työ käynnissä komennolla

squeue -u <your username> (käytä omaa käyttäjätunnustasi)

Tai

squeue -j <SLURM_JOBID> (korvaa oman työsi JOBID:llä)

Kun työ on valmis, voit tarkistaa kuinka paljon muistia ja aikaa se käytti:

sacct -j <SLURM_JOBID> -o elapsed,reqmem,maxrss
  • Varasitko sopivan määrän muistia? (ei liikaa, mutta riittävästi niin, ettei muisti ole loppumassa ja keskeytä työtä). Toinen tapa saada nopea yhteenveto käytetyistä resursseista on:
seff <SLURM_JOBID>

b) Rinnakkainen HMMER-ajo

Kokeillaan nyt 4 ytimellä. Tässä vaiheessa siirrymme myös käyttämään ympäristömuuttujaa $SLURM_CPUS_PER_TASK, jotta vältetään virheet ja tarve muuttaa samaa arvoa monesta paikasta. Lisää tämä rivi eräajo- skriptiin:

#SBATCH --cpus-per-task=4

Huomaa, että tämä pyytää jonotusjärjestelmältä vain lisää resursseja. Sinun täytyy kertoa siitä myös ajamallesi sovellukselle (miten, riippuu sovelluksesta). Muuta suorituskomento muotoon:

hmmscan --cpu $SLURM_CPUS_PER_TASK $HMMERDB/Pfam-A.hmm example.fasta > example_$SLURM_CPUS_PER_TASK.result

Koska pyysit 4 cpus-per-task-arvoa, ympäristömuuttuja $SLURM_CPUS_PER_TASK saa arvon 4, kun skripti suoritetaan, ja sinun tarvitsee muuttaa vain #SBATCH-rivillä olevaa numeroa, jos haluat kokeilla myös muita arvoja.

Lähetä työ ja tarkista komennolla sacct, kuinka kauan hmmer-työn suorittaminen kesti, miten muistin käyttö muuttui, ja yritä vastata seuraaviin kysymyksiin:

  • Onko järkevää käyttää 4 ydintä yhden sijasta?
  • Oliko muistivaraus sopiva?
  • Onko järkevää käyttää enemmän kuin 4 ydintä?
  • Miten työtä voisi nopeuttaa?

Eräajon muistinkulutus

a) Ylitä muistivaraus tarkoituksella

Luo uusi R-skripti (kuten edellisessä harjoituksessa) nimeltä mem-test.R. Sen sisällön tulee olla seuraava:

dim=10
dim_end=1000
while (dim < dim_end) {
mat <- matrix(rnorm(dim*dim), dim)
print("passed dimension")
print(dim)
dim=dim*2
}
print("all done")

Muuttuja dim on neliömatriisin dimensio, joka täytetään normaalijakautuneilla satunnaisluvuilla. Skripti kaksinkertaistaa dim-arvon, kunnes se ylittää arvon dim_end. Tee uusi eräajoskripti R-skriptisi mem-test.R suorittamiseen. Resurssipyyntöjen lisäksi skriptisi täytyy ladata R-ympäristö ja sitten suorittaa R-skripti (kuten edellisessä harjoituksessa). Lähetä skripti komennolla sbatch.

Kun työ on valmistunut (miten voit tarkistaa, onko se käynnissä tai jonossa?), tarkista komennolla sacct tai seff, kuinka paljon muistia käytettiin, kuten edellisessä harjoituksessa. Jos työ valmistui onnistuneesti, kasvata skriptissäsi muuttujan dim_end arvoa eli tee suurempi matriisi ja aja työ uudelleen. Kirjaa myös ylös, kuinka kauan työn suorittaminen kestää. Miten työn tarvitsema aika ja muisti riippuvat taulukon alkioiden määrästä?

max(dim) alkioiden määrä Aika [s] (Elapsed) Käytetty muisti (MaxRSS)
  • Kuinka suuri matriisi tarvitaan ylittämään eräajon oletuksena sallittu muisti?

Skaalaustesti MPI-rinnakkaiselle työlle

Ennen rinnakkaisten töiden ajamista on tärkeää selvittää, miten työ skaalautuu. Ei ole järkevää käyttää montaa ydintä, jos se ei nopeuta työtä. Nopeutuminen riippuu sovelluksesta mutta myös syötteestä. Tässä harjoituksessa käytämme CP2K:ta, joka voi käyttää tuhansia ytimiä tietyissä työtyypeissä ja mallijärjestelmissä (mutta ei tässä tapauksessa). Siksi on tärkeää testata skaalautuvuus jokaiselle eri työtyypille (tai mallijärjestelmätyypille). Tarkoitus ei ole ajaa tuotantosimulaatioita, vaan nopeita lyhyitä simulaatioita (ts. käyttäen varsinaista tuotantojärjestelmää), mutta vain noin 1–5 minuutin ajan, mikä riittää paljastamaan suorituskyvyn.

a) Valmistele CP2k-työ

Kopioi ensin syötetiedosto työhakemistoosi:

module load cp2k`
cp $CP2K_DATA_DIR/tests/QS/benchmark/H2O-32.inp .

Luo sitten eräajoskripti ja lähetä se komennolla sbatch

Tip

Muista tarkistaa CSC:n ohjelmistosivuilta sovelluskohtaiset esimerkit eräajoille:

Ensimmäistä työtä varten pyydä vähimmäisresurssit (kopioi loput eräajoskriptin sisällöstä CSC:n CP2k-sivulta):

#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1

# submit the job
srun cp2k.popt H2O-32.inp > H2O-32_$SLURM_NPROCS.out

b) Aja sama työ kasvavilla resursseilla ja kirjaa suorituskyky

Kun olet ajanut työn yhdellä ytimellä, muokkaa eräajoskriptiä käyttämään enemmän ytimiä/MPI-tehtäviä (esim. 2,4,8,16, ... tämä on --ntasks- tai --ntasks-per-node-asetus) ja aja se uudelleen. Tulostiedostot nimetään niiden ajamiseen käytettyjen ytimien määrän mukaan ($SLURM_NPROCS). Pienen osion sijasta voit käyttää myös test-osiota. Jos pyydät enemmän kuin 40 ydintä (Puhdissa), sinun täytyy vaihtaa large-osioon. Monisolmutöissä rajoita aina solmujen määrä, jotta työ ei jakaudu useammalle solmulle kuin on tarpeen, koska se aiheuttaa tarpeetonta viestintäylikuormaa ja pirstoo järjestelmän allokaatioita.

Seuraavalla komennolla voit summata eri vaiheisiin kuluneen ajan jokaiselle työlle.

grep "CPU TIME" H2O-32_1.out | awk '{a+=$5;print a}'

Tarkista komennolla seff JOBID, kuinka paljon muistia simulaatio käytti (vertaa sacct- ja seff-tulosteita!) ja täytä tiedot seuraavaan taulukkoon. Jos ohjelmasi ei tulosta suorituskykyä tai käytettyä aikaa, voit käyttää komentoa sacct (sacct -j <JOBID> -o elapsed,alloc,maxrss)

Nyrkkisääntönä hyväksyttävälle skaalautuvuudelle on, että kun kaksinkertaistat resurssit, työn pitäisi nopeutua vähintään 1,5-kertaisesti. Ihannetapauksessa nopeutuminen olisi lineaarista resurssien suhteen eli 2-kertaista, joten usein on parempi ajaa monta pienempää simulaatiota samaan aikaan kuin muutama hyvin monella ytimellä – jos sinulla on tämä mahdollisuus.

Nopeutuminen joillakin ydinmäärillä voi poiketa trendistä. Vaihtelua voi olla järjestelmän kuormituksen vuoksi tai siksi, että koodi/järjestelmä ei rinnakkaistu hyvin tai pysty jakamaan laskentakuormaa kyseisellä ydinmäärällä. Joskus uudelleensuoritus auttaa tunnistamaan poikkeavan tuloksen. Jos tiedät, että koodi rinnakkaistuu hyvin, ei ole tarpeen aloittaa testausta yhdestä ytimestä, vaan siitä kohdasta, jossa uskot koodin toimivan hyvin. Huomaat huonon nopeutumisen joka tapauksessa.

# ytimiä Aika [s] (Elapsed) Nopeutuminen Ihanteellinen nopeutuminen Käytetty muisti

c) Skaalaustestin tulokset

  • Kuinka monta ydintä voit käyttää tehokkaasti? (eli kuinka pitkälle työ skaalautuu)
  • Miten tarvittava muisti riippuu ytimien määrästä?
  • Miksi sacct:n raportoimat kuluneet ajat eroavat hieman "CPU TIME" -rivien summasta?
  • Ovatko kaikki solmut samanlaisia? Pitäisikö meidän rajoittaa, mitä resursseja SLURM voi antaa meille?
  • Jos haluamme ajaa eri cp2k-järjestelmän, täytyykö skaalaustesti tehdä uudelleen?

Suomenkielinen tekoälykäännös

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

Klikkaa tästä antaaksesi palautetta