这是线程ipython-with-mpi-clustering-using-machinefile的延续。它稍微更集中一些,希望更清楚地说明问题可能是什么。
我有 3 个节点作为集群运行,使用 mpich/mpi4py、一个机器文件和一个 virtualenv 中的所有库,所有这些都在 NFS 共享上。我的目标是使用 ipython/ipyparallel 在多个节点之间分配作业,每个节点运行多个 ipython 引擎。
我能够在一个节点上运行ipcluster start --profile=mpi -n 4
(在本例中为 worker2
),并通过另一个节点(在本例中为 worker1
)运行ipython --profile=mpi
并使用以下命令列出正在运行的引擎:
import ipyparallel as ipp
client = ipp.Client()
dview = client[:]
with dview.sync_imports():
import socket
@dview.remote(block=True)
def engine_hostname():
return socket.gethostname()
results = engine_hostname()
for r in results:
print r
正如预期的那样,我打印了运行引擎的主机主机名的 4 个实例:
In [7]: for r in results:
print r
...:
worker2
worker2
worker2
worker2
但是,如果我在另一个节点上启动 ipcluster(在本例中为 head
),那么当我如上所述查询它们时,这些是唯一显示的引擎/节点,即使第一组引擎仍在另一个节点上运行:
In [7]: for r in results:
print r
...:
head
head
head
head
我的问题是,我怎样才能让ipython看到所有正在运行的节点上的所有引擎;iow,以实际将负载分布在不同的节点上。
在它自己上运行 mpi 工作正常(头、worker1 和 worker2 是集群中各自的节点):
(venv)gms@head:~/development/mpi$ mpiexec -f machinefile -n 10 ipython test.py
head[21506]: 0/10
worker1[7809]: 1/10
head[21507]: 3/10
worker2[8683]: 2/10
head[21509]: 9/10
worker2[8685]: 8/10
head[21508]: 6/10
worker1[7811]: 7/10
worker2[8684]: 5/10
worker1[7810]: 4/10
所以,至少我知道这不是问题所在。
已解决。我重新创建了我的ipcluster_config.py文件,并向它添加了 c.MPILauncher.mpi_args = ["-machinefile"、"path_to_file/machinefile"],这次它工作了 - 出于某种奇怪的原因。我可以发誓我以前有这个,但唉...