我使用starcluster在ec2上设置了一个集群,并设置了scipy堆栈(包括mpi4py)。我被告知发出一个mpi作业,其处理器数量与集群中的处理器相匹配。例如,如果我创建一个实例类型的4节点集群,其中每个集群都有2个vcpu,我可以发出:
mpiexec -n 4 python mytestfile.py
或
mpiexec -np 8 python mytestfile.py
另外,我如何确定每个节点实际上处理问题的2个实例而不是处理所有8个节点的一个节点?换句话说,mpiexec
会自动计算出所有这些吗?
答案 0 :(得分:1)
mpiexec
需要一个启动MPI进程的节点列表。一般来说,有两种方法可以获得列表。
第一种方式是通过与某种分布式资源管理器集成,例如, SGE,Torque,LSF等。这些通常为每个作业提供授权节点列表,然后MPI启动器可以解析该列表并提取必要的信息。在这种情况下,通常只需运行mpiexec -n #procs ./executable
。
第二种方法是手动提供列表。这通常通过命令行选项(如Open MPI中的-H
)或通过所谓的主机文件来完成。主机文件通常列出作业应执行的节点的主机名和每个节点上的插槽数。 Open MPI的示例主机文件是:
node0001 slots=2
node0002 slots=2
node0003 slots=2
node0004 slots=2
在这种情况下, slots=2
告诉库每个节点提供两个插槽,这意味着可以在该节点上启动最多两个MPI进程。插槽数是一个任意值,并且不需要匹配CPU /核心数,但在大多数情况下,插槽数将与核心数相匹配(尽管混合MPI +线程作业可能不是这种情况) )。
鉴于上述主机文件,可以像这样开始一个MPI作业:
mpiexec --hostfile /path/to/hostfile -n 8 ...
在远程节点上启动作业通常要求当前用户能够使用一些无密码机制登录这些节点,例如,公钥认证。