如何从 pycharm 中使用 mpi4py(使用 mpiexec)运行 python 脚本?

How to run python script with mpi4py (using mpiexec) from within pycharm?

我有一个 python 脚本,它依赖于 MPI 的 mpi4py 实现。 这需要通过 mpiexec(或 mpi运行)运行。

我的问题是:如何直接从 PyCharm 使用 mpiexec(或 mpi运行)运行(并希望调试)python 脚本?

运行 mpiexec 作为外部工具不是一个好主意,因为我将无法调试它。

我可以做什么?

我看到了两种使用 pycharm 调试 mpi4py 脚本的方法,一种涉及 Visual Studio.

两者都很痛苦,因为 PyCharm 在这个阶段并不真正意味着要调试 IDE 与 Visual Studio 相反的 MPI 应用程序。

第一个选项(不那么痛苦):你有 PyCharm Professional 2019
我们将使用 PyCharm 专业的远程调试器功能。
开始 PyCharm 创建一个项目并转到 运行->Edit Configurations,在那里你会找到 Python Remote Debug 的模板(这是为 PyCharm 专业人士保留的功能) .创建一个:将端口保留为 0 并勾选允许并行 运行。 单击应用并返回主屏幕。
如果你点击

你会看到这个控制台,调试服务器正在等待连接; 记下它将通信的端口(在我的例子中是 64777): 多次单击 mpi 进程并记下每次的端口。这是繁琐的部分。

在我的示例中,我将 运行 4 个进程,因此单击四次并得到 [64777, 64890, 64891, 64893]

现在开始您要调试的脚本:

from mpi4py import MPI
import time
import os
size=MPI.COMM_WORLD.Get_size()
rank = MPI.COMM_WORLD.Get_rank()
import pydevd_pycharm
port_mapping=[65117, 65118, 65119, 65115]
pydevd_pycharm.settrace('localhost', port=port_mapping[rank], stdoutToServer=True, stderrToServer=True)

print os.getpid()


if(rank==0):
    print size, rank
    print 'go boy go !!!'
else:
    print size, rank
    print 'run Forrest...'

看我是怎么报端口的

现在打开一个终端并执行:

并且您已启动 运行ning,在所有进程的 pydevd_pycharm.settrace 之后设置了一个自动断点。
端口 65117 上的调试控制台,等级 0 上的进程
端口 65118 上的调试控制台,级别 1 上的进程

就是这样,除了步进和执行不同步所以很痛苦,但如果你想调试 send recv 它可能会成功。

第二个选项(很痛苦):你有 PyCharm Community 2019

在脚本的开头打印进程的 PID 并休眠以便您有时间附加每个进程

from mpi4py import MPI
import time
import os
size=MPI.COMM_WORLD.Get_size()
rank = MPI.COMM_WORLD.Get_rank()

print os.getpid()
sys.stdout.flush()
time.sleep(200)

if (rank == 0):
    print size, rank
    print 'go boy go !!!'
else:
    print size, rank
    print 'run Forrest...'

运行


(在我的示例中很快你只有 200 秒),转到 运行 -> 附加到进程和 select 你想要调试的知道 PID 的进程(因此 print os.getpid()

你应该没事的。

第三个选项:

购买装有 Window Server 2012 的 PC。

安装 Visual Studio 2019 + PTVS(Python for Visual Studio)扩展

安装 HPC Pack/SDK 2016

遵循本教程:YouTube tutorial PTVS with MPI 并发现使用 Visual Studio 进行调试的好处 python(同时封装 C++/C)。
很抱歉宣传,但微软团队在这方面真的很努力......
只强迫你的 HPC 服务器的头节点在 Window Server 2012 下是一个无赖,但无论如何......