我有一个依赖于 MPI 的 mpi4py 实现的 python 脚本。
这需要通过 mpiexec(或 mpirun)运行。
我的问题是:如何直接从 PyCharm 使用 mpiexec(或 mpirun)运行(并希望调试)python 脚本?
将 mpiexec 作为外部工具运行不是一个好主意,因为我将无法调试它。
我可以做什么?
最佳答案
我看到了两种使用 pycharm 调试 mpi4py 脚本的方法,以及一种涉及 Visual Studio 的方法。
两者都非常痛苦,因为 PyCharm 在现阶段并不是真的要成为与 Visual Studio 不同的 MPI 应用程序的调试 IDE。
第一种选择(痛苦较小):您拥有 PyCharm Professional 2019
我们将使用 PyCharm 专业版的远程调试器功能。
启动 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 上的调试控制台,等级 0 上的进程
端口 65118 上的调试控制台,等级 1 上的进程
就是这样,除了步进和执行不同步所以很痛苦但如果你想调试
send recv
它可能会奏效。第二种选择(非常痛苦):你有 PyCharm 社区 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 秒),转到 Run -> Attach to process 并选择要调试的进程,知道 PID(因此是
print os.getpid()
)你应该没事的。
第三个选项:
购买装有 Window Server 2012 的 PC。
安装 Visual Studio 2019 + PTVS(Python for Visual Studio)扩展
安装 HPC 包/SDK 2016
按照本教程:YouTube tutorial PTVS with MPI并发现使用 Visual Studio 调试 Python(同时封装 C++/C)的好处。
很抱歉宣传,但微软团队确实在这方面做出了努力......
只强制您的 HPC Server 的头节点在 Window Server 2012 下是一个无赖,但无论如何......
关于python - 如何从pycharm中使用mpi4py(使用mpiexec)运行python脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57519129/