Paralelisasi paket caret menggunakan doSMP

10

UPDATE: caret sekarang menggunakan foreachinternal, jadi pertanyaan ini tidak lagi benar-benar relevan. Jika Anda dapat mendaftarkan backend paralel yang berfungsi untuk foreach, caret akan menggunakannya.


Saya memiliki paket caret untuk R, dan saya menarik menggunakan trainfungsi untuk memvalidasi silang model saya. Namun, saya ingin mempercepat, dan tampaknya caret memberikan dukungan untuk pemrosesan paralel. Apa cara terbaik untuk mengakses fitur ini pada mesin Windows? Saya memiliki paket doSMP , tetapi saya tidak tahu bagaimana menerjemahkan foreachfungsi menjadi lapplyfungsi, jadi saya bisa meneruskannya ke trainfungsi.

Berikut adalah contoh dari apa yang ingin saya lakukan, dari traindokumentasi: Ini persis apa yang ingin saya lakukan, tetapi menggunakan doSMPpaket, bukan doMPIpaket.

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

Berikut adalah versi fungsi mbq yang menggunakan nama variabel yang sama dengan dokumentasi 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
sumber

Jawaban:

6

Mencoba

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

sumber
5

Caret sudah melakukan ini secara internal untuk Anda sebagai bagian dari train()fungsi, lihat bagian bawah halaman web caret sebagai permulaan.

Dirk Eddelbuettel
sumber
Fungsi default yang digunakan kereta adalah lapply. Jika Anda ingin memparalelkan kereta, Anda memerlukan fungsi paralel yang meniru lapply, seperti multicore ::: mclapply. Setidaknya, itulah cara saya memahami banyak hal.
Zach
@Zach, 1 untuk pertanyaan ini, saya heran apakah ada update bagaimana seseorang dapat melakukan pemrosesan paralel dengan caret::train()untuk Windows, sebagian besar contoh APMbuku yang komputasi mahal, setidaknya untuk saya 3GB RAM, 2.1GHz, dual core, 32bit Win . Seandainya saya mengetahui masalah ini sebelumnya, saya akan berubah Linux, tetapi sekarang sudah terlambat bagi saya untuk melakukan hal seperti itu. Apakah Anda tahu cara mengatasi masalah ini di windows? jika jawabannya oleh mbqmasih aktif, dapatkah Anda hanya menampilkan kode menggunakan contoh nyata dari setiap model dengan ukuran data moderat bagaimana menerapkannya computeFunction?
doktoral
@doctorate caret telah diperbarui untuk menggunakan foreachpaket secara internal, yang berfungsi dengan backend paralel yang dapat Anda daftarkan. Lihatlah paket doParallel. Setelah Anda mendaftarkan backend, tanda sisipan akan secara otomatis menggunakannya. Perhatikan juga, pada windows, setiap core membutuhkan salinan ramnya sendiri, jadi jika Anda mendaftar 4 core, Anda membutuhkan RAM sebanyak 4x.
Zach
@ Zak, terima kasih memang, saya mencobanya dan berhasil. Saya tahu juga bahwa Anda berkontribusi caret, dapatkah Anda melihat pertanyaan ini, saya akan sangat berterima kasih. stats.stackexchange.com/questions/81962/…
doktoral