-
Käytännön harjoitus eräajoista Puhdissa
Käytännön harjoitus eräajoista Puhdissa
Seuraavat harjoitukset opastavat sinua lähettämään ensimmäiset eräajosi Puhdissa. Esimerkkeinä on käytetty 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 sopiva mallipohja.
Hae harjoitustiedostot
a) Kirjaudu Puhtiin terminaalista
ssh your-username@puhti.csc.fi tai jos sinulla ei ole SSH-asiakasohjelmaa käytettävissä, voit kirjautua sisään 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
------------------------------------------------------------
$HOME-kansiossa!):
ja lataa syötetiedostot komennolla wget:
c) Pura harjoitustiedosto
Note
Kursivoitu teksti ei ole komento, ja voit itse valita, mitä siihen kirjoitat (mutta sinun pitää käyttää samaa valintaa myöhemmin).
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):
Lisää 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
b) Tarkista työn tila.
Korvaa seuraavassa komennossa <your username> omalla
CSC-käyttäjätunnuksellasi – tai sillä tunnuksella, jota käytit kirjautuessasi Puhtiin. Jos
et ole varma mikä se on, voit tarkistaa sen komennolla whoami tai
tällä komennolla echo $USER).
c) Mitä työ tulosti ja minne?
Note
Tässä sinun pitää korvata JOBID sillä tunnisteella, jonka työsi sai.
Jos työ epäonnistui, tarkista mikä projekti oli eräajoskriptissä kohdassa --account=???
Tyypillisiä syitä epäonnistuneeseen eräajoon UKK:ssamme
Yksinkertainen R-ajo
Aja yksinkertainen R-työ skriptistä. Skripti sovittaa suoran tiedostossa oleviin x,y-arvopareihin. 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ä):
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:
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.
>
b) Luo skripti saman työn ajamiseen.
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 pitää ensin alustaa
komennolla module load nano (interaktiivisella solmulla; kirjautumissolmulla
se on käytettävissä ilman module load -komentoa).
Varmista, että tiedosto on kunnossa komennolla:
Sinun pitäisi nähdä kolme riviä R-komentoja.c) Aja skripti interaktiivisesti
d) Tulokset
- Onnistuiko työ?
- Mitkä ovat sovituksen kertoimet?
Yksinkertainen R-ajo eräajona
Aja 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 myös nollaa 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 pitää tehdä kolme muutosta. Korvaa --account ja echo "TMPDIR=/scratch/...
omalla laskentaprojektillasi. Vaihda lopuksi skriptin lopussa
suoritettavan R-skriptin nimi (myscript.R) muotoon fit.R.
b) Lähetä eräajoskripti komennolla
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 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.
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 sovitus tehdään kuten edellisessä esimerkissä, ja lopuksi kertoimet kirjoitetaan 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:
Tämä pyytää SLURMia ajamaan 20 työn taulukon. Muokkaa tuloste- ja virhetiedostot
omiin hakemistoihinsa ja tiedostoihinsa lisäämällä/muokkaamalla seuraavat rivit
(%a korvataan taulukkotyön numerolla):
Vaihda käytettävä SLURM-osio (--partition=) arvosta test arvoon small.
Lisää ennen riviä, jolla on srun apptainer_wrapper..., seuraava rivi
Sinulla pitäisi nyt olla:
datanames.txt, jossa on datatiedostojesi nimetmodelscript.R, jossa on sovituksen tekevä R-koodiR_array.sh, joka on työn lähettämiseen käytettävä eräajoskripti- (sekä kansiot
out, err, data_dir, result_dir, jotka olivat siellä jo valmiiksi)
d) aja eräajoskripti komennolla
Koska ajat nyt 20 työtä, niiden pääsy jonosta ajoon voi kestää hetken. Sovituskertoimet pitäisi löytyä erillisistä tiedostoista hakemistossaresult_dir. Tarkastellaan nyt tuloksia interaktiivisessa R:ssä.
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ä ohjeessa keskeinen tavoite on havainnollistaa yleinen toimintatapa.
Kansiossa, jossa on analyse.R, käynnistä interaktiivinen R-komentotulkki komennolla
Kirjoita avautuvaan R-komentotulkkiin source("analyse.R"). Tämä
suorittaa skriptin sisällön. Alkuperäinen data luotiin
laskemalla y-arvot kaavalla y=2x + satunnaista kohinaa.
Kuvaaja avautuu erilliseen ikkunaan.
f) Miten 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 työt.
HMMER käyttää tietokantaa, joka on jo asennettu, mutta tutkittavat proteiinisekvenssit pitää ensin kopioida syötteeksi:
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ä):
- Tuloste tiedostoon
out_%j.txt - virhe tiedostoon
err_%j.txt - ajoaika 10 minuuttia
- lataa
hmmer-moduuli - poista R:lle ominaiset ympäristöasetukset
- ajokomento:
Lähetä työ komennolla: sbatch your-jobscript-name.sh
Työn lähettäminen tulostaa näytölle SLURM JOBID -numeron, 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 oman työsi JOBID-tunnisteella)
Kun työ on valmis, voit tarkistaa kuinka paljon muistia ja aikaa se käytti:
- Varasitko sopivan määrän muistia? (ei liikaa, mutta riittävästi niin, ettei muisti ole loppumassa ja työ keskeydy). Toinen tapa saada nopea yhteenveto käytetyistä resursseista on:
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 samaa arvoa ei tarvitse muuttaa monesta paikasta. Lisää tämä rivi eräajo-
skriptiin:
Huomaa, että tämä pyytää jonotusjärjestelmältä vain lisää resursseja. Sinun pitää kertoa siitä myös ajettavalle sovellukselle (miten, riippuu sovelluksesta). Muuta ajokomento 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 skriptin ajon aikana, ja
sinun tarvitsee muuttaa vain #SBATCH-rivillä olevaa numeroa, jos haluat kokeilla myös muita
arvoja.
Lähetä työ ja tarkista sacct-komennolla, kuinka kauan hmmer-työn
suoritus kesti, miten muistinkäyttö muuttui, ja yritä vastata
seuraaviin kysymyksiin:
- Onko järkevää käyttää 4 ydintä yhden sijaan?
- 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-
skriptin mem-test.R ajamiseen. Resurssipyyntöjen lisäksi skriptisi
pitää ladata R-ympäristö ja sitten ajaa R-skripti (kuten
edellisessä harjoituksessa). Lähetä skripti komennolla sbatch.
Kun työ on valmistunut (miten voit tarkistaa, onko se käynnissä tai
jonossa?), tarkista sacct- tai seff-komennolla, kuinka paljon muistia käytettiin,
kuten edellisessä harjoituksessa. Jos työ valmistui onnistuneesti, kasvata
skriptissä muuttujan dim_end arvoa eli tee suurempi matriisi ja
aja työ uudelleen. Kirjaa myös ylös työn suorittamiseen kulunut aika. 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 oletusmuistiraja?
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ä ohjeessa 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-työ
Kopioi ensin syötetiedosto työhakemistoosi:
Luo sitten eräajoskripti ja lähetä se komennolla sbatch
Tip
Muista tarkistaa CSC:n ohjelmistosivuilta sovelluskohtaiset esimerkit eräajoille:
Pyydä ensimmäiselle työlle minimiresurssit (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-valitsin)
ja aja työ uudelleen.
Tulostetiedostojen nimissä on niiden ajamiseen käytetty ydinmäärä
($SLURM_NPROCS). Pienen osion sijaan voit käyttää myös
test-osiota. Jos pyydät yli 40 ydintä (Puhdissa), sinun
pitää vaihtaa large-osioon. Monisolmutöissä rajoita aina
solmujen määrä, jotta työ ei jakaudu
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
sacct- ja seff-komentojen tulosteita!) ja täytä tiedot seuraavaan
taulukkoon. Jos ohjelmasi ei tulosta suorituskykyä tai käytettyä
aikaa, voit käyttää sacct-komentoa (sacct -j <JOBID> -o
elapsed,alloc,maxrss)
Nyrkkisääntönä hyväksyttävälle skaalautuvuudelle on, että kun resurssit kaksinkertaistetaan, 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 tulla järjestelmän kuormasta tai siitä, että koodi/järjestelmä ei rinnakkaistu hyvin tai ei pysty jakamaan laskentakuormaa tehokkaasti juuri 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ä pisteestä, jossa uskot koodin toimivan hyvin. Huomaat huonon nopeutumisen joka tapauksessa.
| # cores | Time [s] (Elapsed) | Speedup | Ideal speedup | Memory used |
|---|---|---|---|---|
c) Skaalaustestin tulokset
- Kuinka montaa ydintä voit käyttää tehokkaasti? (eli kuinka pitkälle työ skaalautuu)
- Miten tarvittava muisti riippuu ytimien määrästä?
- Miksi
sacct-komennon raportoimat kuluneet ajat eroavat hieman "CPU TIME" -rivien summasta? - Ovatko kaikki solmut samanlaisia? Pitäisikö meidän rajoittaa, mitä resursseja SLURM voi antaa?
- Jos haluamme ajaa eri CP2k-järjestelmän, pitääkö skaalaustesti tehdä uudelleen?