Паралелізація пакету кареток за допомогою doSMP


10

ОНОВЛЕННЯ: тепер caret використовується foreachвнутрішньо, тому це питання вже не є актуальним. Якщо ви можете зареєструвати робочий паралельний бекенд для foreach, caret буде використовувати його.


У мене є пакет 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 для початку.


Функція за замовчуванням, що використовується поїздом, є помилково. Якщо ви хочете паралелізувати поїзд, вам потрібна паралельна функція, яка імітує помилково, наприклад, багатоядерний ::: mclapply. Принаймні, саме так я розумію речі.
Зак

@Zach, +1 для цього питання, мені цікаво, чи є оновлення того, як можна робити паралельну обробку з caret::train()для Windows, більшість прикладів APMкниги обчислювально дорогі, принаймні для мене 3 Гб оперативної пам’яті, 2,1 ГГц, двоядерний, 32 біт Win . Якби я знав цю проблему раніше, я б змінився Linux, але зараз мені вже пізно робити таке. Чи знаєте ви якусь ідею, як боротися з цією проблемою у Windows? якщо відповідь mbqдосі активна, чи можете ви просто показати в коді, використовуючи конкретний приклад будь-якої моделі з помірним розміром даних, як реалізувати computeFunction?
докторантура

@doctors caret було оновлено для foreachвнутрішнього використання пакету, який працює з будь-яким паралельним сервісом , який ви можете зареєструвати. Погляньте на пакет doParallel. Після того як ви зареєструєте бекенд, карета автоматично використовуватиме його. Також зауважте, що для Windows кожне ядро ​​потребує власної копії оперативної пам’яті, тому якщо ви зареєструєте 4 ядра, вам потрібно 4 рази більше оперативної пам’яті.
Зак

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