Parallelizzare il pacchetto di cursore usando doSMP


10

AGGIORNAMENTO: il cursore ora utilizza foreachinternamente, quindi questa domanda non è più pertinente. Se è possibile registrare un backend parallelo funzionante per foreach, il cursore lo utilizzerà.


Ho il pacchetto del cursore per R, e sono interessante usare la trainfunzione per validare in modo incrociato i miei modelli. Tuttavia, voglio accelerare le cose e sembra che il cursore fornisca supporto per l'elaborazione parallela. Qual è il modo migliore per accedere a questa funzione su un computer Windows? Ho il pacchetto doSMP , ma non riesco a capire come tradurre la foreachfunzione in una lapplyfunzione, quindi posso passarla alla trainfunzione.

Ecco un esempio di ciò che voglio fare, dalla traindocumentazione: Questo è esattamente quello che voglio fare, ma usando il doSMPpacchetto, piuttosto che il doMPIpacchetto.

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

Ecco una versione della funzione di mbq che utilizza gli stessi nomi di variabili della documentazione 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)

Risposte:


6

Provare

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

5

Caret lo fa già internamente per te come parte della train()funzione, vedi la sezione inferiore della pagina web del caret per cominciare.


La funzione predefinita utilizzata dal treno è lapply. Se si desidera parallelizzare il treno, è necessaria una funzione parallela che imita lapplicazione, ad esempio multicore ::: mclapply. Almeno, è così che capisco le cose.
Zach,

@Zach, +1 per questa domanda, mi chiedo se ci sono aggiornamenti su come si può fare l'elaborazione parallela caret::train()per Windows, la maggior parte degli esempi di APMlibri sono computazionalmente costosi, almeno per me 3 GB di RAM, 2,1 GHz, dual core, 32 bit Win . Se avessi saputo questo problema prima, sarei cambiato in Linux, ma ora è troppo tardi per me fare una cosa del genere. Conosci qualche idea su come combattere questo problema in Windows? se la risposta di mbqè ancora attiva, puoi semplicemente mostrare nel codice usando un esempio concreto di qualsiasi modello con dimensioni dei dati moderate di come implementare computeFunction?
dottorato il

@doctorate caret è stato aggiornato per utilizzare il foreachpacchetto internamente, che funziona con qualsiasi backend parallelo che puoi registrare. Dai un'occhiata al pacchetto doParallel. Una volta registrato un backend, il cursore lo utilizzerà automaticamente. Inoltre, su Windows, ogni core ha bisogno della propria copia di ram, quindi se registri 4 core, hai bisogno di 4 volte più RAM.
Zach,

@Zach, grazie davvero, l'ho provato e ha funzionato. So anche che hai contribuito caret, puoi dare un'occhiata a questa domanda, ti sarei molto grato. stats.stackexchange.com/questions/81962/…
dottorato
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.