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.

Johdatus rinnakkaisiin töihin R:llä

Tämän oppaan tavoitteena on käsitellä joitakin keskeisiä käsitteitä ja termejä, jotka liittyvät analyysin rinnakkaistamiseen R:ssä, sekä tarjota käytännön vinkkejä rinnakkaisten R-analyysien suunnitteluun CSC:n supertietokoneilla (Puhti, Mahti ja Roihu). Mukana on myös linkkejä lisälukemiseen. Esimerkkieräajotiedostoja varten katso mallit rinnakkaisille R-eräajotöille.

Termi rinnakkaistaminen on laaja, ja analyysin rinnakkaistamiseen on monia tapoja. Esimerkiksi voidaan:

  • Hyödyntää useita CPU-ytimiä R-funktion nopeuttamiseen. Tämä on yleensä helpoin vaihtoehto, ja se voi perustua
    • R-paketteihin, joissa on sisäänrakennettu tuki useille ytimille, tai
    • R-pakettien, kuten future ja parallel, käyttöön täysin riippumattomien tehtävien rinnakkaistamiseksi
  • Lähettää useita samanaikaisesti käynnissä olevia Slurm-töitä
    • Taulukkotyöt mahdollistavat saman analyysin ajamisen useilla syötetiedostoilla tai eri asetuksilla
  • Jakaa työn useille laskenta-solmuille
    • Kun yhden solmun ytimet eivät riitä, useat solmut tarjoavat enemmän resursseja

Useiden ytimien käyttö

Rinnakkaiset R-analyysit voivat hyödyntää moniprosessointia, monisäikeisyyttä tai molempia. Monet R-paketit mainitsevat tuen multicore-rinnakkaisuudelle – tämä on yleistermi, joka kattaa sekä moniprosessoinnin että monisäikeisyyden. Tarkka tapa, jolla useita ytimiä käytetään, riippuu R-paketista.

Moniprosessointi

Moniprosessointi viittaa analyyseihin, joissa käytetään useita toisistaan riippumattomia R-prosesseja. Toisin sanoen käynnistetään useita R:n kopioita, jotka yhdessä suorittavat työn. Moniprosessoinnissa jokainen R-prosessi sijoitetaan omalle CPU-ytimelleen. Tämä on ehkä yleisin tapa rinnakkaistaa analyysi R:ssä.

Moniprosessointiin perustuvat analyysit sisältävät usein klusterin määrittämisen R-skriptissä. Tässä yhteydessä termi klusteri tarkoittaa R-prosessien ryhmää:

  • Esimerkiksi cl <- makeCluster(parallelly::availableCores(omit = 1)) paketissa parallel
  • Paketti future tekee määrityksen taustalla: plan(multicore), plan(multisession)

Klusteria määritettäessä voidaan määrittää, miten riippumattomien R-prosessien tulee kommunikoida keskenään. Klusterityyppejä on kaksi:

  • fork-klusterissa nykyinen R-prosessi kopioidaan ja sijoitetaan uudelle ytimelle. Fork-klustereita käyttävät analyysit ovat usein nopeampia ja muistitehokkaampia kuin socket-klustereita käyttävät analyysit, mutta niiden tuki rajoittuu POSIX-järjestelmiin (mukaan lukien Linux ja Mac). Forkkausta ei tule käyttää RStudiossa (katso alla).
  • socket-klusterissa jokaiselle ytimelle sijoitetaan täysin uusi R-prosessi, ja jokainen prosessi aloittaa tyhjästä ympäristöstä. Vaikka socket-klusterit ovat hitaampia kuin fork-klusterit, niitä tukevat myös Windows ja RStudio.

Lisäksi R-prosessit jaetaan usein master-prosessiin ja worker-prosesseihin. Master-worker-mallissa master-prosessi vastaa työn jakamisesta ja jälkikäsittelystä, kun taas varsinainen suoritus tapahtuu worker-prosesseissa.

Monisäikeisyys

R:n oletustoiminta on käyttää yhtä säiettä kerrallaan. R voidaan kuitenkin erikseen määrittää käyttämään BLAS/LAPACK-kirjastoja, jotka voivat hyödyntää useita ytimiä monisäikeisyyden avulla. Monisäikeisyys voi auttaa nopeuttamaan tiettyjä rutiineja (esimerkiksi lineaarialgebraa). r-env:n R-asennus on linkitetty Intel® oneAPI Math Kernel Libraryyn (oneMKL), jotta monisäikeisyyttä voidaan tukea.

Vaikka r-env on linkitetty OneMKL:ään, moduuli on määritetty käyttämään yhtä säiettä, ellei käyttäjä määritä toisin. Monisäikeisissä analyyseissä säikeiden määrä sovitetaan yleensä ytimien määrään ympäristömuuttujalla OMP_NUM_THREADS. Lisätietoja löytyy r-env:n rinnakkaisten eräajotöiden esimerkeistä.

Tietyt R-paketit (kuten data.table, mgcv ja ranger) tarjoavat suoran tuen monisäikeisyydelle. Myös muuntyyppisiä R-paketteja käyttävät työt voivat hyötyä monisäikeisyydestä analyysistä riippuen. On kuitenkin aina suositeltavaa tarkistaa työ yhdellä säikeellä verrattuna useisiin säikeisiin, jotta voidaan varmistaa, saadaanko nopeutusta ja että tulokset pysyvät oikeina monisäikeisyyttä käytettäessä.

Moniprosessoinnin ja monisäikeisyyden yhdistäminen

On myös mahdollista ajaa töitä, joissa yhdistetään moniprosessointi ja monisäikeisyys. Tällöin kullekin prosessille varataan useita ytimiä. Kukin prosessi voi sitten ajaa useita säikeitä siten, että jokainen säie toimii yhdellä ytimellä. Prosessien määrän kerrottuna säikeiden määrällä per prosessi tulee olla yhtä suuri kuin työn käyttämien ytimien määrä. Esimerkiksi työ, joka käyttää yhtä solmua ja yhteensä 40 ydintä, voisi käyttää 10 prosessia ja neljää säiettä per prosessi.

Useita samanaikaisia töitä: taulukkotyöt

Sen sijaan, että lähettäisit useita töitä samaan aikaan, monissa tapauksissa on suositeltavaa käyttää taulukkotyötä. Esimerkkieräajotiedostoja löytyy r-env:n rinnakkaisten eräajotöiden esimerkeistä ja Geocomputing-esimerkeistä. Taulukkotyöt soveltuvat saman koodin suorittamiseen eri parametreilla tai muihin tilanteisiin, joissa rinnakkaiset tehtävät ovat riippumattomia (eli niiden ei tarvitse kommunikoida keskenään).

Monisolmuanalyysit

Riippumatta siitä, ajatko moniprosessi- vai monisäikeistä R-työtä, analyysi on mahdollista jakaa useille solmuille. Tätä varten eräajotiedostoon ja R-skriptiin tarvitaan joitakin muutoksia verrattuna analyysiin, joka ajetaan yhdellä solmulla. Lisäksi sinun tulee käyttää R-paketteja, jotka ovat yhteensopivia monisolmutöiden kanssa, kuten future tai snow .

Useita käytännön esimerkkejä löytyy r-env:n rinnakkaisten eräajotöiden esimerkeistä. Rasteridataa käyttävien monisolmuisten R-esimerkkien lähde on myös Geocomputing-esimerkeissä.

Huomionarvoinen aihe on se, että moniprosessi- ja/tai monisäikeisten töiden määrittäminen useille solmuille (niin sanotut hybridityöt) on oma erityistapauksensa. Vaikka olisit onnistuneesti määrittänyt rinnakkaisen R-työn yhdelle solmulle, asetelma on mietittävä uudelleen, kun sitä skaalataan useille solmuille. Vinkkejä tähän löytyy r-env:n rinnakkaisten eräajotöiden esimerkeistä sekä CSC:n yleisestä hybridieräajotöiden dokumentaatiosta.

Käytännön vinkkejä

1. Mieti rinnakkaistamisstrategiaasi
Tapa, jolla analyysisi voidaan rinnakkaistaa, riippuu analyysistä, jonka aiot ajaa. Joitakin keskeisiä kysymyksiä ovat:

  • Tukevatko käyttämäsi R-paketit rinnakkaistamista?
  • Ovatko rinnakkaiset tehtävät täysin riippumattomia (vai tarvitsevatko ne keskinäistä kommunikointia)?
  • Riittääkö yksi solmu vai tarvitaanko useita?

Monisolmuanalyysit antavat käyttöösi enemmän resursseja kuin yhden solmun analyysi, mutta tätä on tärkeää punnita suhteessa monisolmuanalyysin kustannuksiin (ylikuorma ja pidemmät jonotusajat). Jos voit ajaa työn yhdellä solmulla, se on aina paras vaihtoehto.

2. Aloita minimaalisella proof of conceptilla
Aloita muutamalla ytimellä tai yhdellä solmulla varmistaaksesi, että rinnakkaistamisstrategiasi toimii. Käytä ensin pientä testidatajoukkoa ja vertaa rinnakkaisen analyysisi suoritusaikaa sarjallisen (ei-rinnakkaisen) analyysin suoritusaikaan, esimerkiksi R-paketilla tictoc. Kun rinnakkainen analyysisi toimii pienemmässä mittakaavassa, suurempien kokoonpanojen vianmääritys on paljon helpompaa.

3. Ystävysty eräajotiedostojen ja R-pakettiesi kanssa
Tässä auttavat olemassa olevat oppaat ja R-pakettien dokumentaatio. r-env:n dokumentaatio ja R-eräajotöiden esimerkit sisältävät mallit sarjallisille ja rinnakkaisille R-eräajotöille sekä ohjeet niiden käynnistämiseen CSC:n supertietokoneilla. Muita hyödyllisiä CSC Docs -sivuja ovat eräajotöiden perusdokumentaatio ja tiedot saatavilla olevista eräajotöiden partitioista.

4. Suurempien resurssien varaaminen ei välttämättä tarkoita nopeampia analyysejä
Optimaalisen ydin- ja/tai säiemäärän löytäminen on yleensä yrityksen ja erehdyksen tulosta. Usein on olemassa kynnys, jonka jälkeen saavutetaan vain marginaalisia hyötyjä suhteessa varaamiisi resursseihin. Lisäksi mitä enemmän resursseja varataan, sitä pidempään niiden vapautumista joutuu odottamaan.

5. Hyödynnä parallelly::availableCores()-funktiota
R:ssä on muutamia tapoja havaita käytettävissä olevien ytimien määrä. Supertietokoneilla yleisesti käytetty parallel::detectCores() havaitsee, kuinka monta ydintä koko solmussa on, riippumatta siitä, kuinka monta olet varannut. Useimmiten tavoitteena on kuitenkin havaita varattujen ytimien määrä. Tähän voidaan käyttää pakettia parallelly:

parallelly::availableCores()
6. Muista, että rinnakkaistamisen tuki on rajallinen RStudiossa Forkatut prosessit katsotaan epävakaiksi, kun R:ää ajetaan RStudiosta. Tämän vuoksi tietyt rinnakkaistamisvaihtoehdot (esim. plan(multicore) paketissa future) eivät ole käytettävissä RStudioa käytettäessä. Jos haluat käyttää moniprosessointia työskennellessäsi RStudiossa, socket-klusterit ovat vakaampi vaihtoehto. Raskaammat rinnakkaisskriptit kannattaa kuitenkin lähettää ei-interaktiivisina eräajotöinä.

Lyhyesti standardeista

Kun luet rinnakkaisesta R:stä ja rinnakkaisista eräajotöistä, törmäät todennäköisesti kahteen termiin: OpenMP ja Message Passing Interface (MPI). Molemmat ovat laajasti käytettyjä standardeja rinnakkaisuutta tukevien ohjelmistojen kirjoittamiseen. R:n käyttäjänä nämä yksityiskohdat voivat olla hyödyllisiä muistaa:

  • Moniprosessi- ja monisäikeiset R-työt perustuvat usein OpenMP:hen
  • Monisolmuiset R-työt perustuvat MPI:hin
  • Niin sanottuja "hybriditöitä" kutsutaan sellaisiksi, koska ne käyttävät sekä OpenMP:tä että MPI:tä

Lisäresurssit

Suomenkielinen tekoälykäännös

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

Klikkaa tästä antaaksesi palautetta