Parallélisation du paquet caret à l'aide de doSMP

10

MISE À JOUR: caret utilise désormais en foreachinterne, donc cette question n'est plus vraiment pertinente. Si vous pouvez enregistrer un backend parallèle fonctionnel foreach, caret l'utilisera.


J'ai le package caret pour R, et je suis intéressé par l'utilisation de la trainfonction pour effectuer une validation croisée de mes modèles. Cependant, je veux accélérer les choses, et il semble que caret prenne en charge le traitement parallèle. Quelle est la meilleure façon d'accéder à cette fonctionnalité sur une machine Windows? J'ai le paquet doSMP , mais je ne sais pas comment traduire la foreachfonction en lapplyfonction, donc je peux la transmettre à la trainfonction.

Voici un exemple de ce que je veux faire, à partir de la traindocumentation: C'est exactement ce que je veux faire, mais en utilisant le doSMPpackage, plutôt que le doMPIpackage.

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

Voici une version de la fonction de mbq qui utilise les mêmes noms de variables que la documentation 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
la source

Réponses:

6

Essayer

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

la source
5

Caret le fait déjà en interne pour vous dans le cadre de la train()fonction, voir la section inférieure de la page Web du caret pour commencer.

Dirk Eddelbuettel
la source
La fonction par défaut utilisée par train est lapply. Si vous voulez paralléliser le train, vous avez besoin d'une fonction parallèle qui imite lapply, comme multicore ::: mclapply. Du moins, c'est ainsi que je comprends les choses.
Zach
@Zach, +1 pour cette question, je me demande s'il y a une mise à jour de la façon dont on peut faire un traitement parallèle caret::train()pour Windows, la plupart des exemples de APMlivres sont coûteux en calcul, au moins pour moi 3 Go de RAM, 2,1 GHz, double cœur, 32 bits Win . Si j'avais connu ce problème auparavant, je changerais pour Linux, mais il est trop tard pour moi maintenant de faire une telle chose. Savez-vous comment lutter contre ce problème sous Windows? si la réponse par mbqest toujours active, pouvez-vous simplement afficher le code en utilisant un exemple concret de tout modèle avec une taille de données modérée de la façon de mettre en œuvre le computeFunction?
doctorat du
@doctorate caret a été mis à jour pour utiliser le foreachpackage en interne, ce qui fonctionne avec tout backend parallèle que vous pouvez enregistrer. Jetez un œil au package doParallel. Une fois que vous avez enregistré un backend, caret l'utilisera automatiquement. Notez également que, sous Windows, chaque cœur a besoin de sa propre copie de RAM, donc si vous enregistrez 4 cœurs, vous avez besoin de 4 fois plus de RAM.
Zach
@Zach, merci en effet, je l'ai essayé et cela a fonctionné. Je sais aussi que vous avez contribué à caret, pouvez-vous jeter un œil à cette question, je vous en serais très reconnaissant. stats.stackexchange.com/questions/81962/…
doctorat