是否可以在本地计算机和远程集群上运行 OpenMPI?
Posted
技术标签:
【中文标题】是否可以在本地计算机和远程集群上运行 OpenMPI?【英文标题】:Is it possible to run OpenMPI on a local computer AND a remote cluster? 【发布时间】:2013-04-03 02:46:09 【问题描述】:我有一组需要在集群中执行的计算操作(可能像 512 个 MPI 进程)。现在,我让集群上的根节点打开一个套接字并在计算操作之间将数据传输到我的本地计算机,但我想知道是否可以只创建两个 MPI 组,其中一个是我的本地机器和另一个远程集群,并使用 MPI 命令在它们之间发送数据。
这可能吗?
【问题讨论】:
我认为没有理由不这样做,除了实际的配置问题,NAT、代理、安全、密码、加密、防火墙、开放/关闭端口等......如果你在同一个本地网络中(实际上是一样的,就像只在您的机器和集群之间切换,没有路由器)应该没问题。您的下一个问题是配置 mpi 启动系统和本地计算机上的节点以被 mpi 启动器识别。 (您需要对集群的 conf 文件进行 root 访问)。但是,是的,MPI 是为异构parc 设计的,所以... 【参考方案1】:可以,只要集群节点和您的机器之间有网络路径即可。 MPI 标准提供了执行此操作的抽象机制,而 Open MPI 提供了一种非常简单的方法来使事情正常工作。您必须查看标准的流程创建和管理部分(MPI-2.2 第 10 章),特别是建立通信小节(MPI-第 10.4 节) 2.2)。基本上步骤是:
-
您分别启动两个 MPI 作业。这显然是你所做的,所以这里没有什么新鲜事。
其中一个作业使用
MPI_Open_port()
创建网络端口。此 MPI 调用返回一个唯一的端口名称,然后必须使用 MPI_Publish_name()
将其发布为众所周知的服务名称。一旦端口打开,就可以通过调用阻塞例程MPI_Comm_accept()
来接受客户端连接。该作业现在已成为服务器作业。
另一个 MPI 作业,称为客户端作业,首先使用 MPI_Lookup_name()
从服务名称解析端口名称。获得端口名称后,它可以调用MPI_Comm_connect()
以连接到远程服务器。
一旦MPI_Comm_connect()
与各自的MPI_Comm_accept()
配对,两个作业将在它们之间建立一个相互通信器,然后可以来回发送消息。
一个复杂的细节是客户端作业如何在给定服务名称的情况下查找端口名称?这是 Open MPI 中文档较少的部分,但它非常简单:您必须提供用于启动客户端作业的 mpiexec
命令以及服务器作业的 mpiexec
的 URI,它充当某种目录服务。为此,您应该使用 --report-uri -
参数启动服务器作业,以使其将其 URI 打印到标准输出:
$ mpiexec --report-uri - <other arguments like -np> ./server ...
它将为您提供1221656576.0;tcp://10.1.13.164:36351;tcp://192.168.221.41:36351
形式的长URI。现在您必须使用 --ompi-server uri
选项将此 URI 提供给客户端 mpiexec
:
$ mpiexec --ompi-server 1221656576.0;tcp://10.1.13.164:36351... ./client ...
请注意,URI 包含节点上存在的所有已配置和启用的网络接口的地址,服务器的 mpiexec
是在该节点上启动的。您应该确保客户能够联系到其中至少一个。还要确保您在启用的 BTL 组件列表中有 TCP BTL 组件,否则不会有消息流动。 TCP BTL 通常默认启用,但在某些 InfiniBand 安装中,通过设置环境变量 OMPI_MCA_btl
的相应值或在默认 Open MPI MCA 配置文件中显式禁用它。可以使用 --mca
选项覆盖 MCA 参数,例如:
$ mpiexec --mca btl self,sm,openib,tcp --report-uri - ...
另请参阅the answer,我给了一个类似的问题。
【讨论】:
【参考方案2】:是的,如果有可用的 TCP/IP 连接,它应该开箱即用(MPI 在随机的高 TCP 端口上通信 - 如果 TCP 用作传输层)。尝试将您的机器添加到您提供给mpirun
的主机文件中。如果这不起作用,您可以使用不需要mpirun
的MPI_Open_port 直接连接到您的计算机。
【讨论】:
以上是关于是否可以在本地计算机和远程集群上运行 OpenMPI?的主要内容,如果未能解决你的问题,请参考以下文章
如何在远程 Spark 集群上运行本地 Python 脚本?
是否可以设置 Visual Studio 2017,使其在远程 Linux 机器而不是本地机器上运行和调试 .NET Core C# 应用程序?