【问题标题】:Setup torque/moab cluster to use multiple cores per node with a single loop设置扭矩/moab 集群以在单个循环中使用每个节点的多个核心
【发布时间】:2015-01-21 17:20:06
【问题描述】:

这是对 [How to set up doSNOW and SOCK cluster with Torque/MOAB scheduler?

的后续报道

我有一个内存有限的脚本,它只使用 1 个 foreach 循环,但我希望在 node1 上运行 2 次迭代,在 node2 上运行 2 次迭代。上面链接的问题允许您为外循环的每个节点启动一个 SOCK 集群,然后为内循环启动 MC 集群,我认为没有利用每个节点上的多个核心。 我收到警告信息 Warning message: closing unused connection 3 (<-compute-1-30.local:11880)

如果我这样做 registerDoMC(2) 如果我在 registerDoSNOW(cl) 之后这样做 谢谢。

编辑:上一个问题的解决方案适用于所提出的问题。请参阅下面的示例了解我想要的内容。

使用每个处理器 2 个节点和 2 个内核启动交互式作业:

qsub -I -l nodes=2:ppn=2

启动 R 后:

library(doParallel)
f <- Sys.getenv('PBS_NODEFILE')
nodes <- unique(if (nzchar(f)) readLines(f) else 'localhost')
print(nodes)

这是我正在运行的两个节点:

[1] "compute-3-15" "compute-1-32"

在这两个节点上启动 sock 集群:

cl <- makePSOCKcluster(nodes, outfile='')

我不确定为什么他们似乎都在compute-3-15 ....?

starting worker pid=25473 on compute-3-15.local:11708 at 16:54:17.048
starting worker pid=14746 on compute-3-15.local:11708 at 16:54:17.523

但是注册两个节点并运行一个foreach循环:

registerDoParallel(cl)
r=foreach(i=seq(1,6),.combine='c') %dopar% { Sys.info()[['nodename']]}
print(r)

r 的输出表明两个节点都被使用了:

 [1] "compute-3-15.local" "compute-1-32.local" "compute-3-15.local"
 [4] "compute-1-32.local" "compute-3-15.local" "compute-3-15.local"

现在,我真正想要的是 foreach 循环在 4 个内核上运行,每个节点上运行 2 个。

library(doMC)
registerDoMC(4)
r=foreach(i=seq(1,6),.combine='c') %dopar% { Sys.info()[['nodename']]}
print(r)

输出表明只使用了 1 个节点,但可能是该节点上的两个核心。

[1] "compute-3-15.local" "compute-3-15.local" "compute-3-15.local"
[4] "compute-3-15.local" "compute-3-15.local" "compute-3-15.local"

如何获得单个 foreach 循环以在多个节点上使用多个内核?

【问题讨论】:

  • 请求作业使用超过每个节点的核心只是将 qsub 修改为具有 -l nodes=1:ppn=X 其中 X 是您想要使用的核心数。我不知道你的堆栈的作业提交来自哪里,但如果你能把它放在堆栈的适当部分,它会解决你的问题。
  • 我不认为那样可以。我要求 -l nodes=4:ppn=8 但是当您为每个节点设置一个 SOCK 集群时,我的理解是有 4 个 R 实例,每个实例位于每个节点的 1 个核心上。我想使用 8 个内核,每个节点上 2 个,但如果注册 MC 是相同的循环(而不是内部循环),注册 MC 似乎会关闭 sock 集群。
  • 您需要确保您的 MPI 脚本(或启动每个进程的任何内容)理解 ppn 部分。此外,如果您希望每个节点有两个核心,则 ppn 应该等于 2,而不是 8。ppn=8 表示您希望每个节点有 8 个核心。
  • 不幸的是,如果您请求整个节点(8 核),im 使用的系统仅允许使用单个作业节点,因此 ppn=8。所以我的问题是我如何告诉 r 在单个 foreach 实例中的 4 个节点上使用 2 个内核(链接的问题显示它带有嵌套的并行循环)?

标签: r foreach parallel-processing pbs torque


【解决方案1】:

为了在 foreach/doParallel 中使用多个节点,您在调用 makePSOCKcluster 时指定一个主机名向量。如果您想在这些主机上使用多个核心,只需多次指定主机名,makePSOCKcluster 将在每个主机上启动多个工作器。

由于您使用的是 Torque 资源管理器,您可以使用以下函数来生成节点列表,该列表可以限制在任何节点上启动的最大工作线程数:

getnodelist <- function(maxpernode=100) {
  f <- Sys.getenv('PBS_NODEFILE')
  x <- if (nzchar(f)) readLines(f) else rep('localhost', 3)
  d <- as.data.frame(table(x), stringsAsFactors=FALSE)
  rep(d$x, pmin(d$Freq, maxpernode))
}

这是一个使用此函数在 Torque 分配的每个节点上运行不超过两个工作程序的示例:

library(doParallel)
nodelist <- getnodelist(2)
print(nodelist)
cl <- makePSOCKcluster(nodelist, outfile='')
registerDoParallel(cl)
r <- foreach(i=seq_along(nodelist), .combine='c') %dopar% {
  Sys.info()[['nodename']]
}
cat('results:\n')
print(r)

请注意,您不能使用 doMC 后端在多个节点上执行任务,因为 doMC 使用的 mclapply 函数只能在本地计算机上创建工作人员。要使用多个节点,您必须使用 doParallel、doSNOW 或 doMPI 等后端。

【讨论】:

  • 非常感谢!这就是我要找的。在我的系统上,PBS_NODEFILE 已经为每个核心列出了每个节点,所以只需 f&lt;-...x&lt;-readLines(f) 就足够了 getnodelist。 'sock' 集群和 doMC 之间是否存在有效区别?似乎两者都可以在我的个人机器上运行,但只有一个 sock 集群才能与网络节点一起使用。
  • @Dominik 最大的不同是 doMC worker 在执行 foreach 循环时是 fork 的,而 makePSOCKcluster worker 可以通过 ssh 启动并且跨多个循环持久化。这会产生许多后果,但 foreach 会尽量使它们工作一致。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
  • 2018-03-23
  • 2018-10-29
  • 1970-01-01
相关资源
最近更新 更多