【问题标题】:Nesting parallel functions in R (在 R 中嵌套并行函数 (
【发布时间】:2014-02-13 20:59:06
【问题描述】:

我熟悉foreach%dopar% 等。我也熟悉cv.glmnetparallel 选项。但是你如何设置嵌套并行呢?

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


【解决方案1】:

在您的并行交叉验证示例中,cv.glmnet 本身不会并行运行,因为集群工作人员中没有注册 foreach 并行后端。外部的 foreach 循环将并行运行,但不是 cv.glmnet 函数中的 foreach 循环。

要将 doSNOW 用于外部和内部 foreach 循环,您可以使用 clusterCall 初始化雪集群工作人员:

cl <- makeCluster(2, type = "SOCK")
clusterCall(cl, function() {
  library(doSNOW)
  registerDoSNOW(makeCluster(2, type = "SOCK"))
  NULL
})
registerDoSNOW(cl)

这会为 master 和 worker 注册 doSNOW,这样当指定 parallel=TRUE 时,对 cv.glmnet 的每次调用都将在两个 worker 集群上执行。

嵌套并行的技巧是避免创建过多进程和过度订阅 CPU(或 CPU),因此在注册并行后端时需要小心。我的示例对于具有四个内核的 CPU 是有意义的,即使总共创建了六个工作程序,因为“外部”工作程序在内部 foreach 循环执行时不会做太多事情。在集群上运行时,通常使用 doSNOW 为每个节点启动一个工作程序,然后使用 doMC 在每个节点上为每个核心启动一个工作程序。

请注意,您的示例不使用太多计算时间,因此使用两个级别的并行性并不值得。我会使用一个更大的问题来确定不同方法的好处。

【讨论】:

    猜你喜欢
    • 2021-02-12
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 2022-07-04
    • 2014-06-12
    • 1970-01-01
    相关资源
    最近更新 更多