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
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)