Распараллеливание пакета caret с использованием doSMP


10

ОБНОВЛЕНИЕ: каретка теперь используется foreachвнутри, поэтому этот вопрос больше не актуален. Если вы можете зарегистрировать рабочий параллельный бэкэнд для foreach, caret будет использовать его.


У меня есть пакет каретки для R, и мне интересно использовать trainфункцию для перекрестной проверки моих моделей. Тем не менее, я хочу ускорить процесс, и, похоже, карета обеспечивает поддержку параллельной обработки. Каков наилучший способ доступа к этой функции на компьютере с Windows? У меня есть пакет doSMP , но я не могу понять, как преобразовать foreachфункцию в lapplyфункцию, поэтому я могу передать ее trainфункции.

Вот пример того, что я хочу сделать из trainдокументации: это именно то, что я хочу сделать, но с использованием doSMPпакета, а не doMPIпакета.

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

Вот версия функции mbq, которая использует те же имена переменных, что и документация 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)

Ответы:


6

Пытаться

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

5

Caret уже делает это для вас как часть train()функции, для начала ознакомьтесь с нижним разделом веб-страницы Caret.


Функция по умолчанию, используемая поездом, является lapply. Если вы хотите распараллелить поезд, вам нужна параллельная функция, которая имитирует, например, multicore ::: mclapply. По крайней мере, я так понимаю.
Зак

@ Zach, +1 за этот вопрос, интересно, есть ли какое-нибудь обновление того, как можно выполнять параллельную обработку с, caret::train()для Windowsбольшинства примеров APMкниги вычислительно дорого, по крайней мере для меня 3 ГБ ОЗУ, 2,1 ГГц, двухъядерный, 32-битный Win , Если бы я знал эту проблему раньше, я бы изменился Linux, но сейчас слишком поздно для меня, чтобы сделать такую ​​вещь. Знаете ли вы, как бороться с этой проблемой в Windows? Если ответ по- mbqпрежнему активен, можете ли вы просто показать в коде, используя конкретный пример любой модели с умеренным объемом данных о том, как реализовать computeFunction?
докторская степень

@doctorate caret был обновлен для foreachвнутреннего использования пакета, который работает с любым параллельным бэкэндом, который вы можете зарегистрировать. Посмотрите на пакет doParallel. Как только вы зарегистрируете серверную часть, она будет автоматически использоваться. Также обратите внимание, что в Windows каждому ядру нужна своя копия оперативной памяти, поэтому если вы регистрируете 4 ядра, вам нужно в 4 раза больше оперативной памяти.
Зак

@ Зак, спасибо, действительно, я попробовал, и это сработало. Я также знаю, что вы внесли свой вклад caret, можете ли вы взглянуть на этот вопрос, я был бы очень признателен. stats.stackexchange.com/questions/81962/…
докторская степень
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.