(Acest articol a fost publicat pentru prima dată pe JottR pe Rși cu amabilitate a contribuit la R-bloggeri). (Puteți raporta problema legată de conținutul acestei pagini aici)
Doriți să vă distribuiți conținutul pe R-bloggeri? dați clic aici dacă aveți un blog, sau aici dacă nu aveți.

Sunt incredibil de încântat să anunț lansarea futuriza pachet. Această lansare marchează o piatră de hotar majoră în călătoria de un deceniu a proiectului Futureverse.
De la înființarea viitor ecosistem, eu (și alții) am imaginat un instrument care ar face execuția concomitentă cât mai simplă posibil, cu modificări minime ale codului dvs. existent – fără refactorizare, fără nume de funcții noi de memorat – ar trebui să funcționeze și să funcționeze la fel peste tot. Sunt mândru să spun asta cu futuriza acest lucru este acum posibil – preluați apelul dorit de reducere a hărții și introduceți-l futurize()de ex
y <- lapply(x, fcn) |> futurize()
Asta este – o atingere „magică” printr-o singură funcție! Uşor!
Da, nu se întâmplă nicio magie aici – este doar frumusețea lui R în acțiune.

Diagrama care ilustrează modul în care codul secvenţial R map-reduce poate fi paralelizat cu | data-recalc-dims=
futurize(). În stânga, funcții secvențiale cum ar fi lapply(…), purrr::map(…), foreach(…) %do%, plyr::llply(…) și altele curg într-o casetă centrală etichetată |> futurize() cu pictograme baghetă magică, indicând transformarea automată. În partea dreaptă, codul transformat se extinde către mai mulți lucrători paraleli (Worker 1, Worker 2, Worker 3, …), ale căror rezultate sunt combinate într-un singur nod „Rezultate”. stil=”lățime: 100%; marja: 1em 0 1em 0; chenar: 1px solid #eee; umplutură: 0,2ex;”/> Unul dintre cele mai mari obstacole în programarea R simultană a fost fragmentarea API-urilor și a comportamentului. Pachete astfelviitor.aplica ,furrr și doViitorul futurize() au abordat parțial acest lucru. Deși l-au simplificat pentru dezvoltatori și utilizatori, toți ne solicită să folosim nume de funcții ușor diferite și argumente de paralelizare diferite pentru a controla ieșirea standard, mesajele, avertismentele și generarea de numere aleatorii (RNG). schimbă acest lucru prin furnizarea o interfață unificată
pentru toți. În prezent suportă: lapply()Iată cum arată în practică. Observați cum logica de reducere a hărții (de ex
# Base R
ys <- lapply(xs, fcn) |> futurize()
# purrr
ys <- map(xs, fcn) |> futurize()
ys <- xs |> map(fcn) |> futurize()
# foreach
ys <- foreach(x = xs) %do% { fcn(x) } |> futurize()
) este identică indiferent de stilul pe care îl preferați:
„Magia” unei singure funcții futurize() The funcția funcționează ca atranspiler lapply() . Termenul „transpilare” descrie procesul de transformare a codului sursă dintr-o formă în alta, denumit traducere de la sursă la sursă. Captează expresia originală fără a o evalua, apoi o convertește în echivalentul concurent și în final execută expresia transpilată. Practic se schimbă future.apply::future_lapply() la map() şi furrr::future_map() la
din mers și gestionează opțiunile privind modul de paralelizare într-un mod unificator și uneori automat. Acest lucru vă permite să scrieți cod paralel fără a estompa logica de bază a codului dvs.
Abilități specifice domeniului The futuriza pachetul include suport și pentru un set tot mai mare de pachete specifice domeniului, inclusivcizme ,semn de omisiune ,glmnet ,lme4 ,mgcv șitm . Aceste pachete oferă propriile argumente de paralelizare încorporate, adesea complexe. futuriza parallel = "snow", ncpus = 4, cl = clretrage toate acestea. De exemplu, în loc să fie nevoie să specificați argumente precum cl <- parallel::makeCluster(4) cu boot()la utilizare
# Bootstrap with 'boot' b <- boot(data, statistic, R = 999) |> futurize() # Cross-validation with 'caret' m <- train(Species ~ ., data = iris, method = "rf") |> futurize()
poți doar să faci:
De ce cred că ar trebui să-l folosești The futuriza Pachetul urmează filozofia de bază a designului Futureverse:
- separați „ce” să executați concomitent de „cum” să paralelizați. Cod cunoscut:
|> futurize()Scrieți cod R standard. Dacă eliminați - merge la fel. Comportament familiar:
- Ieșirea standard, mesajele, avertismentele și erorile se propagă așa cum este de așteptat și așa cum sunt. Interfață unificată:
lapply()Opțiunile viitoare funcționează la fel pentrumap(),foreach()șifuturize(stdout = FALSE)și așa mai departe, de ex - . Independenta backend: Deoarece este construit pe viitorul ecosistem, codul dvs. se poate paraleliza pe oricare dintresuportat backend-uri viitoare
plan(future.mirai::mirai_multisession). Se extinde pe notebook, un server la distanță sau un cluster masiv de calcul de înaltă performanță (HPC) cu o singură modificare a setărilor, de ex.plan(future.batchtools::batchtools_slurm),plan(future.p2p::cluster, cluster = "alice/friends")și chiar
. Un alt mod de a spune, cufuturiza poți uitaviitor.aplica ,furrr și doViitorul
– acele pachete funcționează acum în culise pentru tine, dar nu trebuie să te gândești la ele.
Instalare
install.packages("futurize")
Puteți instala pachetul din CRAN:
Outro sper ca futuriza ușurează viața de codare R prin eliminarea detaliilor tehnice ale execuției paralele, permițându-vă să rămâneți concentrat pe logica pe care doriți să o atingeți. Îmi place să aud cum vei folosi futuriza
în codul dvs. R. Pentru întrebări, feedback și solicitări de funcții, vă rugăm să contactați forumul Futureverse Discussions.
Fie ca viitorul să fie cu tine!
Henrik
