Я знаком с foreach
, %dopar%
и тому подобное. Я также знаком с parallel
вариант для cv.glmnet
. Но как вы создали вложенную parallelistion, как показано ниже?Вложенные параллельные функции R (
library(glmnet)
library(foreach)
library(parallel)
library(doSNOW)
Npar <- 1000
Nobs <- 200
Xdat <- matrix(rnorm(Nobs * Npar), ncol = Npar)
Xclass <- rep(1:2, each = Nobs/2)
Ydat <- rnorm(Nobs)
Parallel кросс-проверки:
cl <- makeCluster(8, type = "SOCK")
registerDoSNOW(cl)
system.time(mods <- foreach(x = 1:2, .packages = "glmnet") %dopar% {
idx <- Xclass == x
cv.glmnet(Xdat[idx,], Ydat[idx], nfolds = 4, parallel = TRUE)
})
stopCluster(cl)
не параллельно перекрестной проверки:
cl <- makeCluster(8, type = "SOCK")
registerDoSNOW(cl)
system.time(mods <- foreach(x = 1:2, .packages = "glmnet") %dopar% {
idx <- Xclass == x
cv.glmnet(Xdat[idx,], Ydat[idx], nfolds = 4, parallel = FALSE)
})
stopCluster(cl)
Для двух системных времен я получаю очень незначительную разницу.
Возможен ли параллелизм? Или мне нужно явно использовать вложенный оператор?
Боковой вопрос: если в объекте кластера доступно 8 ядер, а цикл foreach
содержит две задачи, каждой задаче будет задано 1 ядро (а остальные 6 ядер остаются без дела) или каждой задаче будут даны четыре ядра (используя все 8 ядер в целом)? Каким образом можно запросить, сколько ядер используется в данный момент времени?
'foreach' отправляет каждую задачу в одно ядро. Следовательно, для 'cv.glmnet' доступно только одно ядро. Если вам нужна вложенная распараллеливание, вам нужно сделать это на уровне 'foreach': http://cran.r-project.org/web/packages/foreach/vignettes/nested.pdf – Roland
Итак - уточнить - мне нужно будет выполнить процедуру перекрестной проверки вручную? Если так, то я подозревал. – dynamo