用降雪 R 初始化 MPI 集群

Posted

技术标签:

【中文标题】用降雪 R 初始化 MPI 集群【英文标题】:Initializing MPI cluster with snowfall R 【发布时间】:2013-07-27 19:26:03 【问题描述】:

我一直在尝试在我大学的集群上运行 Rmpisnowfall,但出于某种原因,无论我分配了多少计算节点,我的 snowfall 初始化始终只在一个节点上运行。

我是这样初始化它的:

sfInit(parallel=TRUE, cpus=10, type="MPI")

有什么想法吗?我会根据需要提供说明。

【问题讨论】:

您的集群运行的是哪种 MPI? openMPI,据我所知没有错误消息(事情运行顺利,但系统管理员告诉我它在一个集群上运行,即使我分配了 5 个)。我也刚刚意识到我的意思是一个节点而不是一个集群。 有什么可能导致它的想法吗?也许我必须使用 socketHosts 吗? 【参考方案1】:

要在集群上运行基于 Rmpi​​ 的程序,您需要使用批处理排队系统请求多个节点,然后通过 mpirun/mpiexec 等实用程序从作业脚本执行您的 R 脚本。理想情况下,mpirun 实用程序已构建为自动检测批处理排队系统分配了哪些节点,否则您将需要使用诸如 --hostfile 之类的 mpirun 参数来告诉它要使用哪些节点。

在您的情况下,听起来您请求了多个节点,因此问题可能出在 R 脚本的执行方式上。有些人没有意识到他们需要使用 mpirun/mpiexec,结果是您的脚本在单个节点上运行。如果您使用的是 mpirun,则可能是您的 Open MPI 安装未构建支持您的批处理排队系统。在这种情况下,您必须根据批处理排队系统提供的信息创建适当的主机文件,这些信息通常通过环境变量和/或文件提供。

这是一个典型的 mpirun 命令,我使用它从作业脚本执行我的并行 R 脚本:

mpirun -np 1 R --slave -f par.R

由于我们构建了支持 Torque 的 Open MPI,因此我不使用 --hostfile 选项:mpirun 会自动从 PBS_NODEFILE 环境变量中找出要使用的节点。 -np 1 的使用可能看起来很奇怪,但如果您的程序要产生工人,则需要使用 snow 包时通常会这样做。我从未使用过snowfall,但在查看了源代码后,在我看来sfInit 总是使用“count”参数调用makeMPIcluster,这将导致snow 产生工人,所以我认为对于具有snowfall 的 MPI 集群,-np 1 是必需的。否则,mpirun 将在多个节点上启动您的 R 脚本,每个节点都会在自己的节点上生成 10 个工作人员,这不是您想要的。诀窍是将sfInit“cpus”参数设置为与批处理排队系统分配给您的作业的节点数一致的值。您可能会发现 Rmpi mpi.universe.size 函数对此很有用。

如果您认为所有这些都正确完成,则问题可能与在您的 R 脚本中创建 MPI 集群对象的方式有关,但我怀疑它与使用(或缺乏使用)有关) 的 mpirun。

【讨论】:

谢谢,我认为问题很可能是我没有使用 mpirun(不知道这一点)。因此,使用 mpirun 的文档如下所示,来自集群的说明:# Invoke mpirun。 # 注意:$NSLOTS 由 OGS 设置为 N,即“-pe mpi_M_tasks_per_node N”选项请求的处理器数量。 # 如果 M=4,可能的 N 是:4, 8, 12, 16, . . . #(参见 Runningjobs 页面中的表 2) mpirun -np $NSLOTS mpi_program arg1 arg2 .. 如果我想让降雪为我做所有的工作,我应该只做 -np 1? @user1480248 正如我更新的答案中提到的,我认为您确实需要在降雪时使用“-np 1”。基于 Rmpi​​ 的包在使用 MPI 生成时相当不寻常,因此关于如何设置 -np 的通常建议是错误的。 因此,如果我分配了 16 个计算节点,并且我想利用每个节点上的所有 16 个内核(系统允许我访问),如果我让 cpus @user1480248 如果您已请求并被分配了 16 个节点,每个节点有 16 个内核,那么我希望 mpi.universe.size 将返回值 256。我还希望将“cpus”设置为256 将导致在这 16 个节点中的每个节点上产生 16 个工作器。但这是一个猜测,因为我对 OGS 不是很熟悉,这取决于在您的 Open MPI 安装中内置 OGS 支持。

以上是关于用降雪 R 初始化 MPI 集群的主要内容,如果未能解决你的问题,请参考以下文章

运行 R 脚本后无法杀死工人

如何使用 sfInit 和 makeCluster 类型“MPI”/R 中的消息传递/集群上的并行化

使用 sf Library 将库加载到降雪集群时抑制启动消息

MPI_Init() 之前的初始化变量和 MPI_Finanlize() 之后的 cout

R中的平行回归(可能有降雪)

在java中的main之外初始化MPI