Hyppää sisältöön

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

Warning!

Puhti and Mahti are being decommissioned in stages, and their storage areas will become fully unavailable from 15 October 2026. Clean up unnecessary files and move any data you need to keep by 31 August 2026. See the Roihu data migration guide for instructions on transferring your data to Roihu.

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

Käytännön eräajot Roihu-oppaassa

Seuraavat harjoitukset opastavat sinua lähettämään ensimmäiset eräajosi Roihussa. Olemme käyttäneet esimerkkeinä R:ää ja HMMERiä, mutta periaatteet ovat samat myös muiden sovellusten kohdalla. Tarkista kuitenkin aina sovelluskohtainen sivu, jos sellainen on olemassa. Sieltä voi löytyä juuri sinulle sopiva mallipohja.

Hae harjoitustiedostot

a) Kirjaudu Roihuun terminaalista

Ennen SSH-kirjautumista allekirjoita julkinen SSH-avaimesi ja lataa varmenne näiden ohjeiden mukaisesti: Julkisten SSH-avainten allekirjoittaminen.

Kirjaudu sitten komennolla

ssh your-username@roihu-cpu.csc.fi

Jos sinulla ei ole käytettävissä SSH-asiakasohjelmaa, voit kirjautua sisään [selainkäyttöliittymän] (../../computing/webinterface/index.md) 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 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

Varmista, että käytät samaa projektinumeroa kaikissa seuraavissa vaiheissa, joissa mainitaan projekti tai tili.

Yksinkertainen eräajoskripti

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

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

nano test_hostname.sh

Laita tiedostoon seuraava sisältö. Muista korvata project_20011234 omalla projektinumerollasi kohdassa --account´.

#!/bin/bash
#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 Roihuun:

sbatch test_hostname.sh

b) Tarkista työn tila.

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

squeue -u <your_username>

c) Mitä ja minne työ tulosti?

Note

Tässä sinun täytyy korvata JOBID sillä tunnuksella, jonka työsi sai, kun lähetit sen.

less slurm-JOBID.out #type q to quit

Tulosteen pitäisi näyttää sen solmun nimi (numero- ja kirjainyhdistelmä), jolla työ suoritettiin.

Jos työ epäonnistui, tarkista mikä projekti 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-ympäristössä.

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

Koska aiomme nyt suorittaa sovellusta interaktiivisesti, pyydämme interaktiivisen eräajon ja työskentelemme siellä kirjautumissolmun sijaan. Seuraava komento käynnistää sen (korvaa samalla projektilla kuin yllä olevassa eräajoskriptissä):

sinteractive --account <project> --time 2:00:00
Oletuksena tämä komento varaa Roihussa 2 ydintä, joissa kummassakin on 1.875 Gt muistia. Lisää ytimiä ja siten myös enemmän muistia voidaan varata valitsimella --cores, esimerkiksi --cores 4.

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 johdantotekstiä, ja kehotteen 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 kehotteeseen (paina enteriä jokaisen rivin jälkeen, ja tarkkaile virheitä):
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-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-komentokehotteeseen. Nimeä tiedosto fit.R

Voit käyttää esimerkiksi nano-editoria kuten yllä.

Varmista komennolla, että tiedosto on kunnossa:

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

c) Suorita skripti interaktiivisesti

Rscript fit.R

d) Tarkista tulokset

  • Onnistuiko ajo?
  • 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 voi asettaa esimerkiksi sovelluskohtaisia ympäristömuuttujia. Tarkista aina ensin, onko sovelluksellesi olemassa mallieräajoskripti, ja käytä sitä oman skriptisi pohjana.

Tässä esimerkissä sinun täytyy korvata paikkamerkki kohdassa --account omalla laskentaprojektillasi. Lopuksi skriptin lopussa korvaa suoritettava R-skripti (myscript.R) tiedostolla fit.R.

b) Lähetä eräajoskripti komennolla

sbatch batch.sh

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

Vihje: etsi tiedostoja nimeltä errors_JOBID.txt ja output_JOBID.txt kansiosta, josta lähetit eräajon.

Suorita 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 lyhyiden töiden kohdalla ei olisi järkevää suorittaa niitä erillisinä eräajoina, vaan voitaisiin käyttää silmukkaa 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 sovituksen tekevä R-skripti.

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 kyseisen 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.

Nimeä se R_array.sh. Kopioi sisältö edellisestä esimerkistä. Lisää seuraava rivi muiden #SBATCH-rivien joukkoon:

#SBATCH --array=1-20

Tämä pyytää SLURMia suorittamaan 20 työn taulukon. Muokkaa tuloste- ja virhe- tiedostot menemään omiin hakemistoihinsa ja tiedostoihinsa muokkaamalla/lisäämällä (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 Rscript..., seuraava rivi

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

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

Sinulla pitäisi nyt olla:

  1. datanames.txt, jossa on datatiedostojesi nimet
  2. modelscript.R, joka sisältää sovituksen tekevän R-koodin
  3. R_array.sh, joka on työn lähettämiseen käytettä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 suoritat nyt 20 työtä, ne voivat viipyä hetken jonossa. Sovituskertoimet pitäisi tulla erillisiin tiedostoihin hakemistossa result_dir. Käytetään nyt interaktiivista R:ää tulosten tarkasteluun.

e) Kerää tulokset ja piirrä ne.

Kätevin tapa näyttää graafisia tuloksia R:llä on käyttää RStudioa selainkäyttöliittymässä.

Aseta työhakemisto komennolla setwd() hakemistoon, joka sisältää tiedoston analyse.R, esimerkiksi setwd("/scratch/project_20001234/r-array"). Kirjoita RStudion konsoliin 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.

Toinen vaihtoehto olisi muokata analyse.R-R-skriptiä niin, että kuvaaja tallennetaan tiedostoon grafiikkalaitteilla tai esimerkiksi ggsave()-funktiolla paketissa ggplot2.

f) Mitä kuvaajassa näkyy?

Eräajo säieparallelisoinnilla

Joitakin sovelluksia voidaan suorittaa rinnakkain niiden nopeuttamiseksi. Tässä esimerkissä suoritat HMMER-ohjelmiston kuvaamaan ja analysoimaan toisiinsa liittyviä tai samankaltaisia proteiinisekvenssialueita sekä sarjallisesti että rinnakkain nähdäksesi, nopeutuvatko työt.

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

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

a) Sarjallinen HMMER-ajo

Suoritetaan 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. virhe tiedostoon err_%j.txt
  3. ajoaika 10 minuuttia
  4. lataa hmmer-moduuli
  5. 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 tuloste- 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 työsi JOBID-tunnuksella)

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 virheiden välttämiseksi ja jotta sitä ei tarvitse muuttaa monesta paikasta. Lisää tämä rivi eräajo- skriptiin:

#SBATCH --cpus-per-task=4

Huomaa, että tämä pyytää vain jonotusjärjestelmältä lisää resursseja. Sinun täytyy kertoa siitä myös suorittamallesi 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 CPU:ta tehtävää kohti, ympäristömuuttujan $SLURM_CPUS_PER_TASK arvoksi tulee 4, kun skripti suoritetaan, ja sinun tarvitsee muuttaa vain #SBATCH-rivin numeroa, jos haluat kokeilla myös muita määriä.

Lähetä työ ja tarkista komennolla sacct, kuinka kauan HMMER-ajo 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ä voi 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 muuttujan dim, kunnes se ylittää arvon dim_end. Tee uusi eräajoskripti R- skriptin mem-test.R suorittamista varten. Resurssipyyntöjen lisäksi skriptin täytyy ladata R-ympäristö ja suorittaa sitten 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ä muuttujan dim_end arvoa eli tee suurempi matriisi ja suorita työ uudelleen. Huomioi myös, kuinka kauan työn suorittaminen kestää. Miten työn tarvitsema aika ja muisti riippuvat taulukon alkioiden määrästä?

max(dim) # of elements Time [s] (Elapsed) Memory used (MaxRSS)
  • Kuinka suuri matriisi tarvitaan ylittämään eräajon oletuksena sallittu muisti?

Skaalaustesti MPI-rinnakkaisajolle

Ennen rinnakkaistöiden suorittamista 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ä oppaassa 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 (eli käyttäen varsinaista tuotantojärjestelmää) mutta vain noin 1–5 minuutin ajan, mikä riittää paljastamaan suorituskyvyn.

a) Valmistele CP2k-ajo

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) Suorita sama työ kasvavilla resursseilla ja kirjaa suorituskyky muistiin

Kun olet suorittanut 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 valitsin --ntasks tai --ntasks-per-node) ja suorita se uudelleen. Tulostetiedostot nimetään niiden suorittamiseen käytettyjen ytimien määrällä ($SLURM_NPROCS). Pienen osion sijasta voit käyttää myös test-osiota. Roihussa yhdessä solmussa on käytettävissä 348 ydintä. Sitä suurempien töiden täytyy vaihtaa large-osioon. Monisolmutöissä rajoita aina solmujen määrää, jotta työ ei leviä useammalle solmulle kuin on tarpeen, sillä se aiheuttaa ei-toivottua 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 komentojen sacct ja seff tulosteita!) ja täytä tiedot seuraavaan taulukkoon. Jos koodisi ei tulosta suorituskykyä tai käytettyä aikaa, voit käyttää komentoa sacct (sacct -j <JOBID> -o elapsed,alloc,maxrss)

Hyvä nyrkkisääntö hyväksyttävälle skaalautuvuudelle on, että kun resurssit kaksinkertaistetaan, työn pitäisi nopeutua vähintään 1,5-kertaisesti. Ihannetapauksessa se nopeutuisi lineaarisesti resurssien mukana eli 2-kertaisesti, joten usein on parempi ajaa monta pienempää simulaatiota samaan aikaan kuin muutama hyvin suurella ydinmäärällä – jos sinulla on tämä mahdollisuus.

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

# cores Time [s] (Elapsed) Speedup Ideal speedup Memory used

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