【问题标题】:Running mpirun over multiple nodes through WSL通过 WSL 在多个节点上运行 mpirun
【发布时间】:2022-11-05 10:05:10
【问题描述】:

我在 stackoverflow 上的第一篇文章,请原谅我面临的问题。

目标:通过局域网连接的两台运行 WSL2 的 windows PC 的计算能力来运行 OpenFOAM 模拟。

限制:日常工作流程依赖于 Windows 生态系统,因此无法切换到 linux。 OpenFOAM 需要Linux 环境。

软件:两台 PC 都运行 Windows 10,上面有 WSL2。两台 PC 之间没有可用的防火墙。

我在两台 PC(在 WSL 内)上都设置了无密码 SSH(自定义端口 2222)并且连接正常。但是为了让它工作,我必须使用下面的命令来使用端口转发,如此处所述WSL Networking

netsh interface portproxy add v4tov4 listenport=2222 listenaddress=0.0.0.0 connectport=2222 connectaddress=<WSL2 IP address>;

我还设置了 NFS,PC1 作为服务器,PC2 作为客户端。为了让它工作,我必须转发端口 443 和 2049。因此,两台 PC 上总共转发了三个端口 2222、443 和 2049 端口。

我在 /home/user/ 下的 PC1 上创建了一个名为“run”的通用文件夹,nobody:nogroup 和权限设置为 777。我在 PC2 上的同一位置 (/home/user/) 安装了相同的文件夹。一切正常,文件同步。

为了测试 mpirun 是否正常工作,我将 mpi_hello.c 文件复制到 PC1 上的文件夹中,编译并使用以下命令运行它。

mpicc mpi_hello.c -o mpi_hello
mpirun -np 4 ./mpi_hello

输出为

Hello from PC1, rank 0 (of 4).
Hello from PC1, rank 1 (of 4).
Hello from PC1, rank 2 (of 4).
Hello from PC1, rank 3 (of 4).

然后我用以下数据创建了一个 hostfile.txt 文件

PC1 slots=4
PC2 slots=4

然后运行以下命令

mpirun -np 8 --hostfile hostfile.txt ./mpi_hello

这没有给出任何输出或抛出错误。它只是挂起,我需要按 Ctrl+C 退出。当我在 hostfile.txt 中注释掉 PC2 时,一切正常。 我哪里错了?

编辑: 我使用命令sudo netstat -plnt检查了mpirun正在访问哪些端口,发现它使用了一些从15000到65000的随机端口。

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:36767           0.0.0.0:*               LISTEN      1016/rpc.mountd
tcp        0      0 0.0.0.0:54495           0.0.0.0:*               LISTEN      1016/rpc.mountd
tcp        0      0 0.0.0.0:2049            0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:45607         0.0.0.0:*               LISTEN      5085/mpirun
tcp        0      0 0.0.0.0:38761           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:59787           0.0.0.0:*               LISTEN      5085/mpirun
tcp        0      0 0.0.0.0:2222            0.0.0.0:*               LISTEN      520/sshd: /usr/sbin
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      965/rpcbind
tcp        0      0 0.0.0.0:48563           0.0.0.0:*               LISTEN      1016/rpc.mountd
tcp6       0      0 :::44695                :::*                    LISTEN      1016/rpc.mountd
tcp6       0      0 :::39231                :::*                    LISTEN      -
tcp6       0      0 :::2049                 :::*                    LISTEN      -
tcp6       0      0 :::60333                :::*                    LISTEN      1016/rpc.mountd
tcp6       0      0 :::2222                 :::*                    LISTEN      520/sshd: /usr/sbin
tcp6       0      0 :::111                  :::*                    LISTEN      965/rpcbind
tcp6       0      0 :::34195                :::*                    LISTEN      1016/rpc.mountd

因此,我尝试在两台 PC 上将所有端口从 15000 转发到 65000,并检查 mpirun 是否正常工作,但没有成功。

【问题讨论】:

  • 尽管(通常)需要 SSH 才能在远程节点上启动 MPI 服务器/帮助程序,但这(通常)不是唯一需要的 TCP/IP 套接字。例如,Open MPI 需要额外的套接字对来进行 OoB 管理(例如 mpirunorted 又名 MPI 服务器),还需要用于 btl/tcp(例如进程到进程通信)。我不明白您为什么需要端口转发(IIRC,来自 PC1,ssh -p 2222 localhost 最终会出现在 PC2 上)但这表明您的网络连接有问题(防火墙?路由?虚拟机?)
  • 谢谢@GillesGouaillardet 的回复。我需要启用端口转发,因为 WSL 2 有一个具有自己唯一 IP 地址的虚拟化以太网适配器。我在没有端口转发的情况下尝试过,但是 SSH 和 nfs 都不起作用。然后我参考了微软的文档并进行了端口转发。 link 我还尝试将所有端口从 15000 转发到 65000 并检查 mpirun 是否工作,但它没有工作。
  • 我使用命令sudo netstat -plnt 检查了 mpirun 正在访问哪些端口,发现它使用了一些从 15000 到 65000 的随机端口。所以我尝试在两台 PC 上转发从 15000 到 65000 的所有端口,并检查 mpirun 是否正常工作但仍然它没有用。
  • 这可能还不够……一种选择是让 WSL 使用桥接网络(甚至不确定这是否可能/受支持)。另一种选择是在您的 WSL 实例之间设置一个 VPN,并让 MPI 使用它。
  • 我相信 WSL1 使用桥接网络。但是我无法在 WSL1 上安装 nfs-server,这是确保公共目录在两个 WSL 实例上都可用所必需的。我尝试桥接 WSL2 适配器和本地网络适配器,但我完全失去了网络连接。我想知道如何在 2 个单独的 PC 上运行的 2 个 WSL 实例之间设置 VPN。也想知道问题的根本原因是什么。

标签: mpi windows-subsystem-for-linux openmpi wsl-2


【解决方案1】:
猜你喜欢
  • 2019-08-13
  • 2022-07-08
  • 2012-12-09
  • 2020-11-06
  • 2021-05-15
  • 2012-04-17
  • 2015-01-19
  • 2016-10-11
  • 1970-01-01
相关资源
最近更新 更多