结合mclapply并在函数中注册DoMC

时间:2018-02-13 09:54:01

标签: r parallel-processing r-caret

我正在运行一个使用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?

谢谢!

1 个答案:

答案 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;任务,但你可能不应该使用更多。