设置扭矩/ moab集群,使用单个循环在每个节点上使用多个核心

时间:2015-01-21 17:20:07

标签: r foreach parallel-processing pbs torque

这是[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循环以在多个节点上使用多个核心?

1 个答案:

答案 0 :(得分:2)

为了在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分配的每个节点上运行不超过两个worker的示例:

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。