Hyppää sisältöön

Johdanto 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. Mukana on myös linkkejä lisälukemiseen. Esimerkkieräajotiedostoja varten katso rinnakkaisten R-eräajojen mallipohjat.

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 joko
    • 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 suoritettavia Slurm-töitä
    • Taulukkotyöt mahdollistavat saman analyysin ajamisen useilla syötetiedostoilla tai eri asetuksilla
  • Jakaa työn usealle laskenta-nodelle
    • Kun yhden noden ytimet eivät riitä, useat nodet tarjoavat enemmän resursseja

Useiden ytimien käyttö

Rinnakkaiset R-analyysit voivat hyödyntää moniprosessointia, monisäikeistystä tai molempia. Monet R-paketit mainitsevat tukevansa multicore-rinnakkaisuutta – tämä 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 kukin 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 hoidetaan worker-prosesseissa.

Monisäikeistys

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äikeistyksen avulla. Monisäikeistys voi auttaa nopeuttamaan tiettyjä rutiineja (esimerkiksi lineaarialgebraa). r-env-asennus on linkitetty Intel® oneAPI Math Kernel Libraryyn (oneMKL), jotta monisäikeistystä 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 tyypillisesti ytimien määrään ympäristömuuttujalla OMP_NUM_THREADS. Lisätietoja löytyy r-env-rinnakkaiseräajoesimerkeistä.

Tietyt R-paketit (kuten data.table, mgcv ja ranger) tarjoavat suoran tuen monisäikeistykselle. Myös muita 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 useaan säikeeseen, 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ä kukin 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ää 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-rinnakkaiseräajoesimerkeistä ja Geocomputing-esimerkeistä. Taulukkotyöt soveltuvat saman koodin suorittamiseen eri parametreilla tai muihin tilanteisiin, joissa rinnakkaiset tehtävät ovat riippumattomia toisistaan (eli niiden ei tarvitse kommunikoida keskenään).

Moninodianalyysit

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

Useita käytännön esimerkkejä löytyy r-env-rinnakkaiseräajoesimerkeistä. Rasteridataa käyttävien moninodi-R-esimerkkien lähde on myös Geocomputing-esimerkeissä.

Huomionarvoista on, että moniprosessi- ja/tai monisäikeisten töiden määrittäminen useille nodeille (niin sanotut hybridityöt) on oma erityistapauksensa. Vaikka olisit onnistuneesti määrittänyt rinnakkaisen R-työn yhdelle nodelle, asetelma on mietittävä uudelleen, kun sitä skaalataan useille nodeille. Vinkkejä tähän löytyy r-env-rinnakkaiseräajoesimerkeistä sekä CSC:n yleisestä hybridieräajojen 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 (vai tarvitsevatko ne keskinäistä viestintää)?
  • Riittääkö yksi node vai tarvitaanko useita?

Usean noden analyysit antavat käyttöösi enemmän resursseja kuin yhden noden analyysi, mutta tätä on tärkeää punnita suhteessa moninodianalyysin kustannuksiin (ylikuorma ja pidemmät jonotusajat). Jos voit ajaa sen yhdellä nodella, se on aina paras vaihtoehto.

2. Aloita minimaalisella proof of conceptilla
Aloita muutamalla ytimellä tai yhdellä nodella varmistaaksesi, että rinnakkaistamisstrategiasi toimii. Käytä ensin pientä testidatajoukkoa ja vertaa rinnakkaisen analyysisi suoritusaikaa sarjallisen (ei-rinnakkaisen) analyysin aikaan 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-dokumentaatio ja R-eräajoesimerkit sisältävät mallipohjia sarjallisille ja rinnakkaisille R-eräajoille 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 nodessa 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 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 RStudion kanssa, socket-klusterit ovat vakaampi vaihtoehto. Raskaammat rinnakkaisskriptit kannattaa kuitenkin lähettää ei-interaktiivisina eräajoina.

Lyhyesti standardeista

Kun luet rinnakkaisesta R:stä ja rinnakkaisista eräajoista, 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-käyttäjänä nämä yksityiskohdat voivat olla hyödyllisiä muistaa:

  • Moniprosessi- ja monisäikeiset R-työt perustuvat usein OpenMP:hen
  • Moninodi-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

Onko tämä sivu hyödyllinen?
Kiitos palautteestasi!
Kiitos! Arvostamme palautettasi.

Kerro meille miten voisimme parantaa tätä sivua ottamalla meihin yhteyttä .