首页 > 解决方案 > 如何在 pycharm 中使用 mpi4py(使用 mpiexec)运行 python 脚本?

问题描述

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

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

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

我能做些什么呢?

标签: pythonparallel-processingpycharmmpimpi4py

解决方案


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

两者都非常痛苦,因为 PyCharm 在这个阶段并不是真正的用于 MPI 应用程序的调试 IDE,这与 Visual Studio 相反。

第一个选项(不那么痛苦):您拥有 PyCharm Professional 2019
我们将使用 PyCharm Professional 的远程调试器功能。
启动 PyCharm 创建一个项目并转到 Run->Edit Configurations,在那里您将找到 Python Remote Debug 的模板(这是 PyCharm 专业版保留的功能)。创建一个:将端口保留为 0 并勾选允许并行运行。 编辑配置 MPI 单击应用并返回主屏幕。
如果点击 你会看到这个控制台,调试服务器正在等待连接;记下它将进行通信的端口(在我的情况下 为 64777):单击任意次数的 mpi 进程并每次都记下端口。这是整洁的部分。
点击调试
控制台1

在我的示例中,我将运行 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...'

看看我是如何报告端口的。

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

你已经启动并运行,pydevd_pycharm.settrace在所有进程之后设置一个自动断点。
端口 65117 上的调试控制台,rank 0 上的进程 端口 65118 上的调试控制台,rank 1 上的进程 控制台 1
控制台 2
控制台 2 调试

就是这样,除了步进和执行不同步,所以很痛苦,但如果你想调试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 秒),转到运行 -> 附加到进程并选择要调试知道 PID 的进程(因此)
执行
在此处输入图像描述
print os.getpid()在此处输入图像描述 在此处输入图像描述

你应该没事。

第三个选项:

购买装有 Window Server 2012 的 PC。

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

安装 HPC 包/SDK 2016

按照本教程:YouTube 教程 PTVS with MPI并发现使用 Visual Studio 调试 python(以及同时封装的 C++/C)的好处。
很抱歉宣传,但 Microsoft 团队确实在这方面做出了努力……<br> 仅强制将 HPC 服务器的头节点置于 Window Server 2012 下是很糟糕的,但无论如何……


推荐阅读