【发布时间】:2014-02-13 20:59:06
【问题描述】:
我熟悉foreach、%dopar% 等。我也熟悉cv.glmnet 的parallel 选项。但是你如何设置嵌套并行呢?
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)
并行交叉验证:
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 个内核空闲)还是每个任务会被分配 4 个内核(总共用完所有 8 个内核)?有什么方法可以查询给定时间正在使用多少个内核?
【问题讨论】:
-
foreach将每个任务发送到一个核心。因此,cv.glmnet只有一个内核可用。如果你想要嵌套并行化,你需要在foreach级别上进行:cran.r-project.org/web/packages/foreach/vignettes/nested.pdf -
所以-澄清一下-我需要手动实施交叉验证程序吗?如果是这样,那就是我的怀疑。
标签: r foreach parallel-processing nested glmnet