Równoważenie pakietu karetki za pomocą doSMP

10

AKTUALIZACJA: daszek używa teraz foreachwewnętrznie, więc to pytanie nie jest już tak naprawdę istotne. Jeśli możesz zarejestrować działający backend równoległy foreach, Caret go użyje.


Mam pakiet karetki dla R i jestem ciekawy w użyciu trainfunkcji do krzyżowej weryfikacji moich modeli. Chcę jednak przyspieszyć i wydaje się, że daszek zapewnia obsługę przetwarzania równoległego. Jaki jest najlepszy sposób uzyskania dostępu do tej funkcji na komputerze z systemem Windows? Mam pakiet doSMP , ale nie wiem, jak przełożyć foreachfunkcję na lapplyfunkcję, więc mogę przekazać ją do trainfunkcji.

Oto przykład tego, co chcę zrobić z traindokumentacji: To jest dokładnie to, co chcę zrobić, ale używając doSMPpakietu, a nie doMPIpakietu.

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

Oto wersja funkcji mbq, która używa tych samych nazw zmiennych co dokumentacja 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
źródło

Odpowiedzi:

6

Próbować

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

źródło
5

Caret robi to już wewnętrznie dla Ciebie w ramach tej train()funkcji, na początek zapoznaj się z dolną sekcją strony internetowej Caret .

Dirk Eddelbuettel
źródło
Domyślną funkcją używaną przez pociąg jest lapply. Jeśli chcesz zrównoleglić pociąg, potrzebujesz funkcji równoległej, która naśladuje lapply, takiej jak multicore ::: mclapply. Tak przynajmniej rozumiem.
Zach.
@Zach, +1 za to pytanie. Zastanawiam się, czy jest jakaś aktualizacja tego, jak można wykonywać przetwarzanie równoległe, caret::train()ponieważ Windowswiększość przykładów APMksiążki jest drogo obliczeniowa, przynajmniej dla mnie 3 GB pamięci RAM, 2,1 GHz, dwurdzeniowy, 32-bitowy Win . Gdybym znał ten problem wcześniej, zmieniłbym się na Linux, ale jest już za późno, abym mógł zrobić coś takiego. Czy wiesz, jak walczyć z tym problemem w systemie Windows? jeśli odpowiedź przez mbqjest nadal aktywna, czy możesz po prostu pokazać w kodzie na konkretnym przykładzie dowolnego modelu o umiarkowanym rozmiarze danych, jak zaimplementować computeFunction?
doktorat
@doctorate caret został zaktualizowany, aby używać foreachpakietu wewnętrznie, który działa z dowolnym równoległym backendem, który możesz zarejestrować. Spójrz na pakiet doParallel. Gdy zarejestrujesz backend, Caret automatycznie go użyje. Zauważ też, że w systemie Windows każdy rdzeń potrzebuje własnej kopii pamięci RAM, więc jeśli zarejestrujesz 4 rdzenie, potrzebujesz 4x więcej pamięci RAM.
Zach
@Zach, dzięki, naprawdę, spróbowałem i zadziałało. Wiem również, że przyczyniliście się do tego caret, czy możecie przyjrzeć się temu pytaniu, byłbym bardzo wdzięczny. stats.stackexchange.com/questions/81962/…
doktorat