Hyppää sisältöön

Welcome to our weekly research support coffee hour on Zoom! 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.

R:n rinnakkaistyöt

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

  • Hyödyntää useita CPU-ytimiä R-funktion nopeuttamiseen
  • Lähettää useita samanaikaisesti ajettavia Slurm-töitä
  • Jakaa työt useille laskentasolmuille

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 Puhdissa. Mukana on myös linkkejä lisälukemiseen.

Useiden ytimien käyttäminen

Rinnakkaiset R-analyysit voivat hyödyntää multiprocessing- tai multithreading-menetelmiä tai molempia. Monet R-paketit mainitsevat tukevansa multicore-rinnakkaisuutta – tämä on yleistermi, joka kattaa sekä multiprocessing- että multithreading-menetelmät. Tarkka tapa, jolla useita ytimiä käytetään, riippuu R-paketista.

Multiprocessing

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

Multiprocessingiin perustuvissa analyyseissä määritellään usein klusteri R-skriptin sisällä. Tässä yhteydessä termi cluster tarkoittaa R-prosessien ryhmää:

  • Esimerkiksi cl <- getMPIcluster() paketissa snow
    • Muita klustereita käyttäviä R-paketteja ovat esimerkiksi parallel, doMPI ja future

Klusteria määritettäessä voidaan valita, miten itsenäisten 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 kuin socket-klustereita käyttävät, mutta niiden tuki rajoittuu POSIX-järjestelmiin (mukaan lukien Linux ja Mac).
  • Socket-klusterissa jokaiselle ytimelle käynnistetään täysin uusi R-prosessi, ja jokainen prosessi aloittaa tyhjästä ympäristöstä. Vaikka socket-klusterit ovat hitaampia kuin fork-klusterit, niitä tuetaan myös Windowsissa.

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.

Multithreading

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ä multithreading-menetelmällä. Multithreading voi nopeuttaa tiettyjä rutiineja, kuten lineaarialgebraan liittyviä laskentoja. Hakemistossa r-env oleva R-asennus on linkitetty Intel® OneMKL:ään, jotta multithreading-tuki on käytettävissä.

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

Tietyt R-paketit (kuten mgcv ja ranger) tarjoavat suoran tuen multithreadingille. Myös muuntyyppisiä R-paketteja käyttävät työt voivat hyötyä multithreadingista analyysistä riippuen. On kuitenkin aina suositeltavaa tarkistaa työ yhdellä säikeellä ja usealla säikeellä, jotta voidaan varmistaa, saadaanko nopeutusta ja että tulokset pysyvät oikeina multithreadingia käytettäessä.

Multiprocessingin ja multithreadingin yhdistäminen

On myös mahdollista ajaa töitä, joissa yhdistetään multiprocessing ja multithreading. 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 prosessikohtaisella säiemäärällä tulee olla yhtä suuri kuin työn käyttämien ytimien määrä. Esimerkiksi työ, joka käyttää yhtä solmua Puhdissa (40 ydintä), voisi käyttää 10 prosessia ja neljää säiettä prosessia kohden.

Samanaikaisten töiden lähettäminen

Tähän tarkoitukseen suositeltu tapa on lähettää taulukkotyö. Esimerkkieräajotiedostoja löytyy r-env-dokumentaatiosta ja GitHubista. Taulukkotyöt soveltuvat saman koodin suorittamiseen eri parametreilla tai muihin tilanteisiin, joissa rinnakkaiset tehtävät ovat toisistaan riippumattomia (eli niiden ei tarvitse kommunikoida keskenään).

Monisolmuanalyysit

Riippumatta siitä, ajatko sarjallista, moniprosessista vai monisäikeistä R-työtä, analyysi on mahdollista jakaa useille Puhdin 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 snow tai future.

Useita käytännön esimerkkejä löytyy r-env-dokumentaation rinnakkaisten eräajotöiden osiosta. Rasteridataa käyttäviä monisolmu-R-esimerkkejä löytyy myös GitHubista.

Huomionarvoista on, 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 skaalaat useille solmuille. Vinkkejä tähän löytyy r-env-dokumentaatiosta 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. Keskeisiä kysymyksiä ovat esimerkiksi:

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

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

2. Aloita pienellä toimivuustestillä. Aloita yhdellä solmulla varmistaaksesi, että rinnakkaistamisstrategiasi toimii. Käytä ensin pientä testidatajoukkoa ja vertaa rinnakkaisen analyysin suoritusaikaa sarjallisen (ei-rinnakkaisen) analyysin suoritusaikaan esimerkiksi R-paketilla tictoc. Kun rinnakkainen analyysisi toimii yhdellä solmulla, monisolmuasetelmien vianmääritys on paljon helpompaa.

3. Tutustu hyvin eräajotiedostoihin ja R-paketteihisi. Tässä auttavat olemassa olevat oppaat ja R-pakettien dokumentaatio. Hyödyllisiä CSC Docs -sivuja ovat esimerkiksi sarjallisten ja rinnakkaisten R-eräajotöiden esimerkit, eräajojen perusdokumentaatio sekä tiedot käytettävissä olevista eräajopartitioista. r-env-käyttäjädokumentaatio sisältää monia esimerkkejä rinnakkaisista R-töistä ja niiden käynnistämisestä Puhdissa.

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 lisähyöty suhteessa varattuihin resursseihin jää vähäiseksi. Lisäksi mitä enemmän resursseja varataan, sitä pidempi on odotusaika ennen kuin ne tulevat saataville.

5. Hyödynnä parallelly::availableCores()-funktiota. R:ssä on muutamia tapoja tunnistaa käytettävissä olevien ytimien määrä. Puhdissa parallel::detectCores() antaa aina tulokseksi 40. Toisin sanoen funktio tunnistaa, kuinka monta ydintä solmussa on, riippumatta siitä, kuinka monta olet varannut. Useimmiten tavoitteena on kuitenkin tunnistaa varattujen ytimien määrä. Tähän voidaan käyttää pakettia parallelly (tai pakettia future, joka tuo parallelly-paketin mukana):

parallelly::availableCores()
6. Muista, että rinnakkaistamisen tuki on rajallinen RStudiossa. Haarautettuja prosesseja pidetään epävakaina, kun R:ää ajetaan RStudiossa. 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ää multiprocessingia 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
  • Monisolmu-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äresursseja

Jos haluat perehtyä r-env-käyttäjädokumentaatiota syvemmälle, seuraavat linkit sisältävät lisätietoa, joka voi kiinnostaa:

Suomenkielinen tekoälykäännös

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

Klikkaa tästä antaaksesi palautetta