Käytännön harjoitus eräajoista Roihussa
Seuraavat harjoitukset opastavat sinut ensimmäisten eräajojen lähettämisessä Roihuun. 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 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
------------------------------------------------------------
$HOME-kansiossa!):
ja lataa syötetiedostot komennolla wget:
c) Pura harjoitustiedosto
Note
Varmista, että käytät samaa projektinumeroa kaikissa seuraavissa vaiheissa, joissa mainitaan projekti tai tili.
Yksinkertainen eräajon komentosarja
a) Luo eräajon komentosarja, joka tulostaa laskentasolmun, jolla se suoritetaan.
Käyttäen nano-editoria (voit käyttää mitä tahansa editoria):
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äajon komentosarja Roihuun:
b) Tarkista työn tila.
Korvaa seuraavassa komennossa <your username> omalla
CSC-käyttäjätunnuksellasi – tai sillä tunnuksella, jolla kirjauduit Roihuun. Jos
et ole varma mikä se on, voit tarkistaa sen komennolla whoami tai
tällä komennolla: echo $USER.
c) Mitä ja minne työ tulosti?
Note
Tässä sinun pitää korvata JOBID sillä tunnisteella, jonka työsi sai, kun lähetit sen.
Tulosteessa pitäisi näkyä sen solmun nimi (numero- ja kirjainyhdistelmä), jolla työ suoritettiin.
Jos työ epäonnistui, tarkista mikä projekti oli eräajon komentosarjassa kohdassa --account=???
Tyypillisiä syitä epäonnistuneeseen eräajoon UKK:ssamme
Yksinkertainen R-ajo
Suorita yksinkertainen R-ajo komentosarjasta. Komentosarja sovittaa suoran tiedostossa oleviin x,y-arvopareihin. Lisätietoja löytyy sivulta R:n ajaminen 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
--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:
Sinun pitäisi nähdä hieman aloitustekstiä, 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.
>
b) Luo komentosarja saman työn suorittamiseen.
Luo hakemistossa "r-job" R-komentosarja (suoritettavat R-komennot), jossa on samat komennot kuin
liitit R-komentokehotteeseen. Anna tiedostolle nimeksi fit.R
Voit käyttää esimerkiksi nano-editoria kuten yllä.
Varmista, että tiedosto on kunnossa komennolla:
Sinun pitäisi nähdä kolme riviä R-komentoja.c) Suorita komentosarja interaktiivisesti
d) Tarkista tulokset
- Onnistuiko ajo?
- Mitkä ovat sovituksen kertoimet?
Yksinkertainen R-ajo eräajona
Suorita nyt edellinen R-komentosarja eräajona.
a) Luo eräajon komentosarja, joka lähettää työn jonoon.
Kopioi sarjallisen eräajon komentosarjan mallipohja CSC:n R-env-sivulta tiedostoon nimeltä batch.sh
Laskentaresurssien määrittelyn lisäksi tämä komentosarja voi asettaa esimerkiksi sovelluskohtaisia ympäristömuuttujia. Tarkista aina ensin, onko sovelluksellesi olemassa mallieräajon komentosarja, ja käytä sitä oman komentosarjasi pohjana.
Tässä esimerkissä sinun pitää korvata paikkamerkki --account omalla laskentaprojektillasi. Lopuksi vaihda komentosarjan lopussa
(myscript.R) eli suoritettava R-komentosarja muotoon fit.R.
b) Lähetä eräajon komentosarja komennolla
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 lyhyille ajoille ei olisi järkevää käyttää erillisiä eräajoja, vaan voitaisiin käyttää silmukkaa yhdessä työssä tai mieluummin R-komentosarjan 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 sovituksen tekevä R-komentosarja.
Palaa takaisin kansioon r-array, luo komentosarja nimeltä modelscript.R
ja lisää siihen seuraavat komennot (voit kopioida edellisen komentosarjan
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. Sitten teemme sovituksen kuten edellisessä esimerkissä ja lopuksi kirjoitamme kertoimet tiedostoon.
c) Luo eräajon komentosarja työn lähettämistä varten.
Anna sille nimeksi R_array.sh. Kopioi sisältö edellisestä esimerkistä.
Lisää seuraava rivi muiden #SBATCH-rivien joukkoon:
Tämä pyytää SLURMia suorittamaan 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 Rscript..., seuraava rivi
Sinulla pitäisi nyt olla:
datanames.txt, jossa on data tiedostojesi nimetmodelscript.R, joka sisältää sovituksen tekevän R-koodinR_array.sh, joka on työn lähettämiseen käytettävä eräajon komentosarja- (sekä kansiot
out, err, data_dir, result_dir, jotka olivat siellä jo valmiiksi)
d) Suorita eräajon komentosarja komennolla
Koska suoritat nyt 20 työtä, ne voivat viipyä hetken jonossa. Sovituksen kertoimien pitäisi ilmestyä erillisiin tiedostoihin hakemistossaresult_dir. Tarkastellaan nyt tuloksia interaktiivisella R:llä.
e) Kerää tulokset ja piirrä ne.
Kätevin tapa näyttää R:n graafiset tulokset on käyttää RStudioa selainkäyttöliittymässä.
Aseta työhakemisto komennolla setwd() hakemistoon, jossa analyse.R sijaitsee, esimerkiksi
setwd("/scratch/project_20001234/r-array"). Kirjoita RStudion
konsoliin source("analyse.R"). Tämä
suorittaa (source) komentosarjan sisällön. Alkuperäinen data
luotiin laskemalla y-arvot kaavalla y=2x + satunnaista kohinaa.
Kuvaaja ilmestyy erilliseen ikkunaan.
Toinen vaihtoehto olisi muokata analyse.R-R-komentosarjaa niin, että kuvaaja tallennetaan tiedostoon
grafiikkalaitteilla tai esimerkiksi ggsave()-funktiolla paketissa ggplot2.
f) Mitä kuvaajassa näkyy?
Eräajo säierinnakkaistuksella
Joitakin sovelluksia voidaan ajaa 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 ajot.
HMMER käyttää tietokantaa, joka on jo asennettu, mutta tutkittavat proteiini- sekvenssit pitää ensin kopioida, jotta niitä voidaan käyttää syötteenä:
a) Sarjallinen HMMER-ajo
Ajetaan ensin työ vain yhdellä ytimellä. Kopioi jokin vanhoista eräajon komentosarjoista 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 - suorituskomento:
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 työn 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, jotta vältetään virheet
ja tarve muuttaa samaa arvoa monesta paikasta. Lisää tämä rivi eräajon
komentosarjaan:
Huomaa, että tämä pyytää vain jonotusjärjestelmältä lisää resursseja. Sinun täytyy kertoa siitä myös ajettavalle 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 komentosarja suoritetaan, ja
sinun tarvitsee muuttaa vain #SBATCH-rivin numeroa, jos haluat kokeilla myös muita
arvoja.
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ä voisi nopeuttaa?
Eräajon muistinkulutus
a) Ylitä muistivaraus tarkoituksella
Luo uusi R-komentosarja (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. Komentosarja kaksinkertaistaa
dim-arvon, kunnes se ylittää arvon dim_end. Tee uusi eräajon komentosarja R-
komentosarjan mem-test.R suorittamiseen. Resurssipyyntöjen lisäksi
komentosarjan pitää ladata R-ympäristö ja sitten suorittaa R-komentosarja (kuten
edellisessä harjoituksessa). Lähetä komentosarja 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
komentosarjasi muuttujan dim_end arvoa eli tee suurempi matriisi ja
aja työ uudelleen. Kirjaa myös ylös, kuinka kauan ajo 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 oletusmuistiraja?
Skaalaustesti MPI-rinnakkaisajolle
Ennen rinnakkaisajojen suorittamista on tärkeää selvittää, miten työ skaalautuu. Ei ole järkevää käyttää montaa ydintä, jos se ei nopeuta ajoa. 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 (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:
Luo sitten eräajon komentosarja ja lähetä se komennolla sbatch
Tip
Muista tarkistaa CSC:n ohjelmistosivuilta sovelluskohtaiset esimerkit eräajoille:
Ensimmäistä ajoa varten pyydä vähimmäisresurssit (kopioi loput eräajon komentosarjan 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
Kun olet ajanut työn yhdellä ytimellä, muokkaa eräajon komentosarjaa 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ä käytetään ajossa olleiden ytimien määrää
($SLURM_NPROCS). Pienen osion sijasta voit käyttää myös
test-osiota. Roihussa yhdessä solmussa on käytettävissä 384 ydintä.
Sitä suurempien töiden on vaihdettava large-osioon. Monisolmutöissä rajoita aina
solmujen määrää, jotta työ ei jakaudu
useammalle solmulle kuin on tarpeen, sillä 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
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)
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 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 tunnistamaan 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. Huono nopeutuminen kyllä huomataan 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 poikkeavat hieman "CPU TIME" -rivien summasta? - Ovatko kaikki solmut samanlaisia? Pitäisikö meidän rajoittaa, mitä resursseja SLURM saa antaa meille?
- Jos haluamme ajaa eri cp2k-järjestelmän, pitääkö skaalaustesti tehdä uudelleen?