【问题标题】:how to combine doMPI and doMC on a cluster?如何在集群上结合 doMPI 和 doMC?
【发布时间】:2016-05-30 20:06:25
【问题描述】:

我曾经使用doMCforeach 进行并行计算,现在我可以访问集群。我的问题和Going from multi-core to multi-node in R类似,但是这个帖子没有回复。

基本上,我可以向我的批处理排队系统请求多个任务 -n 和每个任务的多个内核 -c。我确实设法使用doMPI 对我请求的任务数量进行并行模拟,但我现在想使用startMPIclustermaxcores 选项来使每个MPI 进程都使用多核功能。

我注意到parallel::detectCores() 似乎没有看到我被归属了多少个核心并返回一个节点的最大核心数。

目前我已经尝试过:

ncore = 3 #same number as the one I put with -c option
library(Rmpi)
library(doMPI)
cl <- startMPIcluster(maxcores = ncore)
registerDoMPI(cl)
## now some parallel simulations
foreach(icount(10), .packages = c('foreach', 'iterators', 'doParallel')) %dopar% {
    ## here I'd like to use the `ncore` cores on each simulation of `myfun()`
    registerDoParallel(cores = ncore)
    myfun()
}

myfun 内部确实有一些foreach 循环)但如果我设置ncore &gt; 1 则会出现错误:

{ 中的错误:任务 1 失败 - “'mckill' 失败”

谢谢

编辑

我可以访问的机器是http://www-ccrt.cea.fr/fr/moyen_de_calcul/airain.htm,其中指定了“Librairies MPI: BullxMPI, distribution Bull MPI 优化并与 OpenMPI 兼容”

【问题讨论】:

  • 我猜你正在使用 Slurm。您是通过 sbatch 提交作业吗?你是如何执行 R 脚本的?您使用的是 mpirun 还是 srun?
  • 是的,我在某处看到过这个词 (slurm)(我绝对不是 HPC 专家)。我正在使用“ccc_mprun -n 10 -c 5 R CMD BATCH --vanilla myscript.R”之类的东西执行脚本。我首先使用 mpirun,但后来有人告诉我改用这个 ccc_mprun。我也尝试过交互模式,但实际上即使没有这种“双重”并行化,我也无法使用 -c 提供的资源
  • 我还看到您对另一篇有关 Rmpi​​::mpi.universe.size() 的相关帖子的评论,在我的情况下,它只返回 -n 中给出的值,而不是产品 -n*- c
  • 我的问题确实是一个纯粹的doMC 问题。虽然我已经完成了多核计算机(不是集群),但我不明白为什么它在这里不起作用。我已经看到了一些有关为什么在某些 Linux 发行版上 R 不能并行运行的相关问题;我会尝试以这种方式挖掘一下并关闭这个问题。
  • 您的 MPI 实现可能不喜欢工人派生进程,这是由 doMC 使用的 mclapply 函数完成的。当 mclapply 尝试终止分叉的子进程时,您遇到错误似乎很奇怪。我从没见过。

标签: r foreach parallel-processing mpi multicore


【解决方案1】:

您正在尝试同时使用许多不同的概念。您正在使用基于 MPI 的集群在不同的计算机上启动,但正在尝试同时使用多核处理。这让事情变得不必要地复杂了。

您使用的集群可能分布在多个节点上。如果要进行并行处理,则需要某种方式在这些节点之间传输数据。

进来MPI。这是一种在不同机器上的不同工作人员之间轻松连接的方法,无需指定 IP 地址或端口。这确实是您想要使用mpirunccc_mprun 启动进程的原因(这可能是一个为您的特定集群提供一些额外参数的脚本)。

我们现在如何在 R 中使用这个系统?(另见 https://cran.r-project.org/web/packages/doMPI/vignettes/doMPI.pdf

使用:mpirun -n 24 R --slave -f myScriptMPI.R 启动您的脚本,用于在 24 个工作进程上启动。集群管理系统将决定在哪里启动这些工作进程。它可能会在同一台(强大的)机器上启动所有 24 个,也可能会将它们分布在 24 台不同的机器上。这取决于工作负载、可用资源、可用内存、当前处于 SLEEP 模式的机器等。

上述命令将在 24 台不同的机器上启动 myScriptMPI.R。我们现在如何合作?

library(doMPI)
cl <- startMPIcluster() 
#the "master" process will continue
#the "worker" processes will wait here until receiving work from the master
registerDoMPI(cl)
## now some parallel simulations
foreach(icount(24), .packages = c('foreach', 'iterators'), .export='myfun') %dopar% {
    myfun()
}

您的数据将使用 MPI 协议自动从 master 传输到 worker。

如果您想更好地控制分配,包括为多核与节点间并行化制作“嵌套”MPI 集群,我建议您阅读 doMPI 小插图。

【讨论】:

  • 感谢您的回答,但我的意思恰恰是在每个节点上使用多核。假设我想做一些模拟,并且对于每个模拟我想使用并行计算。我想过使用与我的模拟数量相等的节点数,然后使用并行多核执行每个模拟
  • 无论如何,像 SLURM 这样的集群管理系统绝不会允许您“背着他们”占用比分配给您的进程更多的 CPU。对所有事情都使用 doMPI,不要混合搭配并行处理库。解决方案是根据要求启动 MPI 进程(例如,在 4 台主机上,每台主机有 4 个 CPU)并使用嵌套集群创建子步骤。 doMPI 小插曲很好地解释了这一点。
猜你喜欢
  • 2017-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 2011-08-01
  • 2023-02-18
  • 2018-03-09
  • 2018-12-27
相关资源
最近更新 更多