r - 设置 Torque/moab 集群以在单个循环中使用每个节点的多个核心

标签 r foreach parallel-processing pbs torque

这是[ How to set up doSNOW and SOCK cluster with Torque/MOAB scheduler? 的后续内容]

我有一个内存有限的脚本,仅使用 1 foreach循环,但我想在节点 1 上运行 2 次迭代,在节点 2 上运行 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 循环以在多个节点上使用多个内核?

最佳答案

为了在 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 等后端。

关于r - 设置 Torque/moab 集群以在单个循环中使用每个节点的多个核心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28073142/

相关文章:

r - 矩阵不同概率的赌场游戏

java - For-Each 循环 Java 错误 ArrayIndexOutOfBoundsException

r - 在R中的ggarrange中添加两个标签

r - autoplot - 如何调整加载标签?

r - 向文本元素添加空格

r - 外循环的并行化在 REvolution 中有效,但在普通 R 中无效

javascript - Jquery:使用唯一键名称迭代嵌套 JSON

python - concurrent.futures.ProcessPoolExecutor 与 multiprocessing.pool.Pool

C++ fstream 输出错误的数据

c# - 遍历树时使用线程