我熟悉foreach
,%dopar%
等。我也熟悉parallel
選項cv.glmnet
。但你如何設置嵌套parallelistion如下?嵌套並行功能
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'級別執行:http://cran.r-project.org/web/packages/foreach/vignettes/nested.pdf – Roland
所以 - 澄清 - 我需要手動實施交叉驗證程序?如果是這樣,那就是我所懷疑的。 – dynamo