我正在运行一个使用biganalytics :: bigkmeans和xgboost(通过Caret)函数的函数。如果首先通过registerDoMC(cores = 4)注册它们,则它们都支持并行处理。但是,为了利用我可以访问的64核机器的功能而不增加太多的并行开销,我想在16个实例中运行以下函数(总共64个进程。
example = function (x) {
biganalytics:: bigkmeans (matrix(rnorm(10*5,1000,1),ncol=500))
mod <- train(Class ~ ., data = df ,
method = "xgbTree", tuneLength = 50,
trControl = trainControl(search = "random"))
}
set.seed(1)
dat1 <- twoClassSim(1000)
dat2 <- twoClassSim(1001)
dat3 <- twoClassSim(1002)
dat4 <- twoClassSim(1003)
list <- list(dat1, dat2, dat3, dat4)
mclapply(list, example, mc.cores = 16).
重要的是我坚持使用mclapply,因为我需要一个共享内存并行后端,这样我在实际使用超过50gb的数据集时就不会用完ram了。
我的问题是,在这种情况下我会在哪里注册DoMC?
谢谢!
答案 0 :(得分:1)
使用嵌套并行性通常不是一个好主意,但如果外部循环的迭代次数少于内核,则可能是。
您可以加载doMC
并在foreach循环中调用registerDoMC
,以便让工作人员致电train
。但请注意,将mclapply
用更多的工作人员而不是任务来称呼是没有意义的,否则一些工人将无法完成任何工作。
你可以这样做:
example <- function (dat, nw) {
library(doMC)
registerDoMC(nw)
# call train function on dat...
}
# This assumes that length(datlist) is much less than ncores
ncores <- 64
m <- length(datlist)
nw <- ncores %/% m
mclapply(datlist, example, nw, mc.cores=m)
如果length(datlist)
为4,那么每个&#34;训练&#34;任务将使用16名工人。你当然可以使用更少的工人来培训&#34;任务,但你可能不应该使用更多。