最近在搞mpi4py + 多节点运行并行运算,结果本地单机跑得好好的,提交到linux上多机集群后的连接问题困扰了我许久,最后去官方看文档找到了答案!!
运行代码:(这是一个mpi4py计算pi的栗子)
#pi_test.py
from mpi4py import MPI
comm = MPI.COMM_WORLD
comm_rank = comm.Get_rank()
comm_size = comm.Get_size()
k = (1.0 if comm_rank % 2 == 0 else -1.0)/(2 * comm_rank +1)
# data = 1 - 1/3 + 1/5 - 1/7 + 1/9 -............ = pi/4
data = comm.reduce(k,root=0,op=MPI.SUM)
if comm_rank == 0:
pi = data * 4
print('pi%f' % pi)
本地执行(单机开9个进程完美运行):
提交到linux多机运行:
先设置hostfile: 执行命令:mpiexec --allow-run-as-root --hostfile mpi_config_file python pi_test.py
结果出现了连接问题并且阻塞了:
[controller][[29731,1],4][btl_tcp_endpoint.c:638:mca_btl_tcp_endpoint_recv_connect_ack] received unexpected process identifier [[29731,1],7]
[controller][[29731,1],8][btl_tcp_endpoint.c:638:mca_btl_tcp_endpoint_recv_connect_ack] received unexpected process identifier [[29731,1],7]
有时候还会出现:
[localhost][[30780,1],2][btl_tcp_endpoint.c:796:mca_btl_tcp_endpoint_complete_connect] connect() to 172.17.0.1 failed: Connection refused (111)
连接不到172.17.0.1的错误
解决:
最终在官方的技术文档中,找到了答案。
意思就是说,openMPI会贪婪地寻找两台机器的所有IP接口,但是我们不会用到所有的IP接口,并且有的IP接口可能是不能用的(上面连接不上127.17.0.1可能就是不能用的接口),所以我们要去用 --mca btl_tcp_if_include 接口1,接口2 来限制他用的接口。
步骤一:用ip addr 命令找到master的接口列表
步骤二:我们选用em1接口的10.10.20.19/24 来作为本次通信的IP接口
大功告成!
小弟不才,有错请大佬斧正!
官网参考:https://www.open-mpi.org/