Paralelizar el paquete de caret usando doSMP

10

ACTUALIZACIÓN: caret ahora se usa foreachinternamente, por lo que esta pregunta ya no es realmente relevante. Si puede registrar un backend paralelo que funcione foreach, caret lo usará.


Tengo el paquete de caret para R, y estoy interesado en usar la trainfunción para validar de forma cruzada mis modelos. Sin embargo, quiero acelerar las cosas, y parece que caret proporciona soporte para el procesamiento paralelo. ¿Cuál es la mejor manera de acceder a esta función en una máquina con Windows? Tengo el paquete doSMP , pero no puedo entender cómo traducir la foreachfunción a una lapplyfunción, así que puedo pasarla a la trainfunción.

Aquí hay un ejemplo de lo que quiero hacer, de la traindocumentación: Esto es exactamente lo que quiero hacer, pero usando el doSMPpaquete, en lugar del doMPIpaquete.

## A function to emulate lapply in parallel
mpiCalcs <- function(X, FUN, ...)
}
    theDots <- list(...)
    parLapply(theDots$cl, X, FUN)
{

library(snow)
cl <- makeCluster(5, "MPI")

## 50 bootstrap models distributed across 5 workers
mpiControl <- trainControl(workers = 5,
    number = 50,
    computeFunction = mpiCalcs,
    computeArgs = list(cl = cl))

set.seed(1)
usingMPI <- train(medv ~ .,
    data = BostonHousing,
    "glmboost",
    trControl = mpiControl)

Aquí hay una versión de la función de mbq que usa los mismos nombres de variables que la documentación de lapply:

felapply <- function(X, FUN, ...) {
    foreach(i=X) %dopar% {
        FUN(i, ...)
    }       
}

x <- felapply(seq(1,10), sqrt)
y <- lapply(seq(1,10), sqrt)
all.equal(x,y)
Zach
fuente

Respuestas:

6

Tratar

computeFunction=function(onWhat,what,...){foreach(i=onWhat) %do% what(i,...)},

fuente
5

Caret ya hace esto internamente por usted como parte de la train()función, consulte la sección inferior de la página web de caret para empezar.

Dirk Eddelbuettel
fuente
La función predeterminada utilizada por el tren es lapply. Si desea paralelizar el tren, necesita una función paralela que imite lapply, como multinúcleo ::: mclapply. Al menos, así es como entiendo las cosas.
Zach
@Zach, 1 para esta pregunta, me pregunto ¿hay alguna actualización de cómo se puede hacer el procesamiento en paralelo con la caret::train()de Windowsla mayoría de los ejemplos de APMlibro son computacionalmente caro, al menos para mí 3 GB de RAM, 2,1 GHz, de doble núcleo, Win 32 bits . Si hubiera conocido este problema antes, cambiaría a Linux, pero ya es demasiado tarde para hacer eso. ¿Conoces alguna idea de cómo combatir este problema en Windows? Si la respuesta mbqsigue activa, ¿puede mostrar en el código utilizando un ejemplo concreto de cualquier modelo con un tamaño de datos moderado de cómo implementar el computeFunction?
Doctorado
@doctorate caret se ha actualizado para usar el foreachpaquete internamente, lo que funciona con cualquier backend paralelo que pueda registrar. Echa un vistazo al paquete doParallel. Una vez que registre un back-end, caret lo usará automáticamente. También tenga en cuenta que, en Windows, cada núcleo necesita su propia copia de RAM, por lo que si registra 4 núcleos, necesita 4 veces más RAM.
Zach
@Zach, gracias de hecho, lo probé y funcionó. También sé que contribuiste caret, ¿puedes echar un vistazo a esta pregunta? Te lo agradecería mucho. stats.stackexchange.com/questions/81962/…
doctorado