安装docker后导致intel mpi拉不起多机运行的问题解决记录

问题

在安装docker环境后 mpi 多机并行环境运行程序失效,mpi 程序拉起后无后续执行的信息,导致进程卡住

排查思路

  1. 检查 ssh 均正常,可以免密登陆
  2. 通过 pstree 查看 mpi 进程树,可以看到主副节点均能发现有进程占用
  3. 打开 mpi 详细调试日志
    a. export I_MPI_DEBUG=5
    b. export I_MPI_HYDRA_DEBUG=on

可以看到输出如下启动时的网卡信息输出后卡住:

1
2
3
[0] MPI startup(): ===== NIC pinning on ubuntu04 =====
[0] MPI startup(): Rank Thread id Pin nic
[0] MPI startup(): 0 0 br-0718f8abdfbb

网卡名 br-0718f8abdfbb 即是 docker 的虚拟网卡名称,显然与指定的 mpi 网卡不一致,但是执行 mpirun 给的参数 -iface eno8403,此时怀疑 mpi 网卡调用发生错误。

问题原因

IntelMPI OFI (libfabric) 网卡自动选择问题:
Intel MPI 基于 OFI 时,I_MPI_OFI_PROVIDER 会自动选择第一个可用的网络接口(如 Docker 网桥),而非你指定的物理网卡。

运行以下命令查看系统支持的 OFI 驱动接口:

1
fi_info -p tcp; fi_info -p verbs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
provider: tcp
fabric: 172.20.0.0/16
domain: br-0718f8abdfbb
version: 118.10
type: FI_EP_MSG
protocol: FI_PROTO_SOCK_TCP
provider: tcp
fabric: 172.19.0.0/16
domain: br-a829bcb59d60
version: 118.10
type: FI_EP_MSG
protocol: FI_PROTO_SOCK_TCP
provider: tcp
fabric: 172.21.0.0/16
domain: br-a17cca3d3239
version: 118.10
type: FI_EP_MSG
protocol: FI_PROTO_SOCK_TCP
provider: tcp
fabric: 192.168.1.0/24
domain: eno8303
version: 118.10
type: FI_EP_MSG
protocol: FI_PROTO_SOCK_TCP

可以看到第一个接口即是 docker 的接口,而不是物理网卡接口,由此判定是此原因导致了MPI未使用正确的网卡引起MPI进程无法正常通信。

解决办法

通过环境变量明确要求 OFI 使用物理网卡

1
export FI_TCP_IFACE=eno8403  # 强制指定mpi 接口为物理网卡

再次执行:

1
fi_info -p tcp; fi_info -p verbs
1
2
3
4
5
6
7
# 第一个接口已更改为物理网卡接口
provider: tcp
fabric: 192.168.1.0/24
domain: eno8403
version: 118.10
type: FI_EP_MSG
protocol: FI_PROTO_SOCK_TCP

此时再通过 mpirun 执行程序已恢复正常,且能看到调式日志:

1
2
3
4
[0] MPI startup(): Number of NICs:  1 
[0] MPI startup(): ===== NIC pinning on ubuntu04 =====
[0] MPI startup(): Rank Thread id Pin nic
[0] MPI startup(): 0 0 eno8403