ActPi向阳技术栈
← 返回文章列表

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

文章目录
  1. 问题
  2. 排查思路
  3. 问题原因
  4. 解决办法

问题

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

排查思路

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

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

[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 驱动接口:

fi_info -p tcp; fi_info -p verbs
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 使用物理网卡

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

再次执行:

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

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

[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