设置 torque/moab 集群以在单个循环中为每个节点使用多个核心
Setup torque/moab cluster to use multiple cores per node with a single loop
这是 [How to set up doSNOW and SOCK cluster with Torque/MOAB scheduler?
的后续
我有一个内存受限的脚本,它只使用 1 个 foreach
循环,但我想在节点 1 上进行 2 次迭代 运行ning,在节点 2 上进行 2 次迭代 运行ning。上面的链接问题允许您为外循环的每个节点启动一个 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
函数只能在本地机器上创建 worker。要使用多个节点,您必须使用后端,例如 doParallel、doSNOW 或 doMPI。
这是 [How to set up doSNOW and SOCK cluster with Torque/MOAB scheduler?
的后续我有一个内存受限的脚本,它只使用 1 个 foreach
循环,但我想在节点 1 上进行 2 次迭代 运行ning,在节点 2 上进行 2 次迭代 运行ning。上面的链接问题允许您为外循环的每个节点启动一个 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
函数只能在本地机器上创建 worker。要使用多个节点,您必须使用后端,例如 doParallel、doSNOW 或 doMPI。