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.

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 ajettavia 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äikeistystä tai molempia. Monet R-paketit mainitsevat tuen moniydinrinnakkaisuudelle – սա on yleistermi, joka kattaa sekä moniprosessoinnin että monisäikeistyksen. 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 riippumattomat R-prosessit kommunikoivat 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 käynnistyy 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äikeistys

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

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 tyypillisesti 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äikeistykselle. Myös muuntyyppisiä R-paketteja käyttävät työt voivat hyötyä monisäikeistyksestä 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äikeistystä käytettäessä.

Moniprosessoinnin ja monisäikeistyksen yhdistäminen

On myös mahdollista ajaa töitä, joissa yhdistetään moniprosessointi ja monisäikeistys. 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 tulisi 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. Sinun on myös käytettävä 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 pariin pääsee myös Geocomputing-esimerkeissä.

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 sitä skaalataan useille solmuille. Vinkkejä tähän löytyy r-env:n rinnakkaisten eräajotöiden esimerkeistä sekä osana CSC:n yleistä dokumentaatiota hybridi-eräajotöistä.

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 (vai tarvitsevatko ne keskinäistä viestintää)?
  • 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 (yleiskuormaan ja pidempiin jonotusaikoihin). Jos voit ajaa analyysin yhdellä solmulla, se on aina paras vaihtoehto.

2. Aloita minimaalisella toimivuustestillä
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ämän tueksi kannattaa tutustua olemassa oleviin oppaisiin ja R-pakettien dokumentaatioon. 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äajojen perusdokumentaatio ja tiedot käytettävissä olevista eräajopartitioista.

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 vähäisiä hyötyjä suhteessa varaamiisi resursseihin. 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ä. Supertietokoneilla yleisesti käytetty parallel::detectCores() tunnistaa, kuinka monta ydintä koko 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:

parallelly::availableCores()
6. Muista, että rinnakkaistamisen tuki on rajallinen RStudiossa Forkatut prosessit katsotaan epävakaiksi, 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ää 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äresursseja

Suomenkielinen tekoälykäännös

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

Klikkaa tästä antaaksesi palautetta