R en Paralelo (la manera tradicional)

By Daniel Nicola in R Posts R en Español

June 2, 2022

La librería parallel ha estado activa desde hace varios años y ha sido muy poco utilizada por personas como yo. Esta no es la única manera de realizar cálculos en paralelo en R pero es quizá la más tradicional y la manera en que se la utiliza es similar a otras librerías/paquetes. Simplemente se deben seguir 3 pasos (descritos líneas abajo). Esta vez, he utilizado solamente apply y parApply pero claro, puedes hacer un montón de aplicaciones en paralelo. Si estás interesado en realizar más cosas en paralelo, puedes echar un ojo a doParallel y foreach para construir loops y correrlos en más de un core. Una librería más reciente es future que la puedes encontrar aquí. Si utilizas el tidyverse, en especial la librería purrr se te hará fácil trabajar con furrr.

Si estás interesada/o en entrenar modelos en paralelo, quizá es bueno saber que la computación en paralelo viene integrada a varios paquetes/librerías que se utilizan para esto. Por ejemplo, si trabajas con tidymodels una línea de código doParallel::registerDoParallel() antes de hacer el tuning de un grid (tune_grid(...)) es suficiente para que trabajen varios cores en lugar de uno sólo, ahorrándote tiempo significativamente.

R en Paralelo

  • Crea un cluster
  • Corre un código
  • Detienes el cluster
Un ejemplo básico de uso de R en paralelo está en este video:

El código les dejo aquí. Topes!

library(parallel)
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.5     ✓ purrr   0.3.4
## ✓ tibble  3.1.6     ✓ dplyr   1.0.8
## ✓ tidyr   1.2.0     ✓ stringr 1.4.0
## ✓ readr   2.1.2     ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
#DATOS
data <- matrix(rnorm(100000*20, 1000, 500), nrow = 100000, ncol = 20) %>%
  as.data.frame() %>%
  rename_all(function(x) paste0("col_", 1:20))

num_cores <- detectCores()

#Crear cluster
cl <- makeCluster(num_cores-1)

#Código normal
system.time(apply(data, 2, mean))
##    user  system elapsed 
##   0.331   0.009   0.341
#Código en paralelo
system.time(parApply(cl, data, 2, mean))
##    user  system elapsed 
##   0.044   0.007   0.107
#Detener el cluster
stopCluster(cl)
Posted on:
June 2, 2022
Length:
2 minute read, 338 words
Categories:
R Posts R en Español
Tags:
R
See Also:
R Top Packages
Tu primera Shiny App (?)
My first Mac...