Parallelisierung des Caret-Pakets mit doSMP

10

UPDATE: Caret wird jetzt foreachintern verwendet, sodass diese Frage nicht mehr wirklich relevant ist. Wenn Sie ein funktionierendes paralleles Backend für registrieren können foreach, wird es von Caret verwendet.


Ich habe das Caret- Paket für R und bin daran interessiert, die trainFunktion zur Kreuzvalidierung meiner Modelle zu verwenden. Ich möchte die Dinge jedoch beschleunigen, und es scheint, dass Caret die Parallelverarbeitung unterstützt. Wie kann ich auf einem Windows-Computer am besten auf diese Funktion zugreifen? Ich habe das doSMP- Paket, kann aber nicht herausfinden, wie die foreachFunktion in eine lapplyFunktion übersetzt werden soll, sodass ich sie an die trainFunktion übergeben kann.

Hier ist ein Beispiel für das, was ich tun möchte, aus der trainDokumentation: Genau das möchte ich tun, aber das doSMPPaket anstelle des doMPIPakets verwenden.

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

Hier ist eine Version der Funktion von mbq, die dieselben Variablennamen wie die lapply-Dokumentation verwendet:

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
quelle

Antworten:

6

Versuchen

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

quelle
5

Caret erledigt dies bereits intern für Sie als Teil der train()Funktion. Weitere Informationen finden Sie im unteren Bereich der Caret-Webseite .

Dirk Eddelbuettel
quelle
Die vom Zug verwendete Standardfunktion ist lapply. Wenn Sie den Zug parallelisieren möchten, benötigen Sie eine parallele Funktion, die lapply nachahmt, z. B. multicore ::: mclapply. Zumindest verstehe ich die Dinge so.
Zach
@Zach, +1 für diese Frage, ich frage mich, ob es ein Update gibt, wie man Parallelverarbeitung caret::train()für durchführen Windowskann. Die meisten Beispiele für APMBücher sind rechenintensiv, zumindest für mich 3 GB RAM, 2,1 GHz, Dual Core, 32 Bit Win . Hätte ich dieses Problem schon einmal gekannt, würde ich zu wechseln Linux, aber es ist jetzt zu spät für mich, so etwas zu tun. Kennen Sie eine Idee, wie Sie dieses Problem in Windows bekämpfen können? Wenn die Antwort von mbqnoch aktiv ist, können Sie pls einfach im Code anhand eines konkreten Beispiels eines Modells mit mäßiger Datengröße anzeigen, wie das implementiert werden soll computeFunction?
Promotion am
@doctorate caret wurde aktualisiert, um das foreachPaket intern zu verwenden, das mit jedem parallelen Backend funktioniert, das Sie registrieren können. Schauen Sie sich das doParallel-Paket an. Sobald Sie ein Backend registriert haben, wird es von Caret automatisch verwendet. Beachten Sie auch, dass unter Windows jeder Kern eine eigene RAM-Kopie benötigt. Wenn Sie also 4 Kerne registrieren, benötigen Sie 4x so viel RAM.
Zach
@ Zach, danke, ich habe es versucht und es hat funktioniert. Ich weiß auch, dass Sie dazu beigetragen haben. caretKönnen Sie sich diese Frage ansehen? Ich wäre Ihnen sehr dankbar. stats.stackexchange.com/questions/81962/…
Promotion