python - 如何在 pycharm 中使用 mpi4py(使用 mpiexec)运行 python 脚本?
问题描述
我有一个依赖于 MPI 的 mpi4py 实现的 python 脚本。这需要通过 mpiexec(或 mpirun)运行。
我的问题是:如何直接使用 PyCharm 中的 mpiexec(或 mpirun)运行(并希望调试)python 脚本?
将 mpiexec 作为外部工具运行不是一个好主意,因为我将无法调试它。
我能做些什么呢?
解决方案
我看到了两种使用 pycharm 调试 mpi4py 脚本的方法和一种涉及 Visual Studio 的方法。
两者都非常痛苦,因为 PyCharm 在这个阶段并不是真正的用于 MPI 应用程序的调试 IDE,这与 Visual Studio 相反。
第一个选项(不那么痛苦):您拥有 PyCharm Professional 2019
我们将使用 PyCharm Professional 的远程调试器功能。
启动 PyCharm 创建一个项目并转到 Run->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...'
看看我是如何报告端口的。
你已经启动并运行,pydevd_pycharm.settrace
在所有进程之后设置一个自动断点。
端口 65117 上的调试控制台,rank 0
上的进程 端口 65118 上的调试控制台,rank 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 秒),转到运行 -> 附加到进程并选择要调试知道 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 下是很糟糕的,但无论如何……