我有一个依赖mpi4py的MPI实现的Python脚本。
需要通过mpiexec(或mpirun)运行。
我的问题是:如何直接从PyCharm使用mpiexec(或mpirun)来运行(并希望调试)Python脚本?
作为外部工具运行mpiexec并不是一个好主意,因为我将无法进行调试。
我应该怎么办呢?
我有一个依赖mpi4py的MPI实现的Python脚本。
需要通过mpiexec(或mpirun)运行。
我的问题是:如何直接从PyCharm使用mpiexec(或mpirun)来运行(并希望调试)Python脚本?
作为外部工具运行mpiexec并不是一个好主意,因为我将无法进行调试。
我应该怎么办呢?
两种方法都很痛苦,因为与Visual Studio相反,PyCharm并不是设计成这个阶段MPI应用程序的调试IDE。
第一种选项(最少痛苦):您需要 PyCharm Professional 2019
我们将使用 PyCharm Professional 的远程调试功能。
启动 PyCharm 创建一个项目,然后转到 Run->Edit Configurations,在那里您会找到一个 Python 远程调试的模板(这是 PyCharm professional 的专属功能)。创建一个 : 将端口保持为 0 并勾选允许并行运行。
点击 Apply 并返回主屏幕。
如果你点击
您将看到此控制台,调试服务器正在等待连接;请注意它将要通信的端口(在我的情况下为 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 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秒的时间),进入Run->Attach to process,并选择您想要调试的进程,并知道PID(因此是print os.getpid()
)
那么你就没问题了。
第三个选项:
购买安装有Window Server 2012的PC。
安装Visual Studio 2019 + PTVS(Python for Visual Studio)扩展
安装HPC Pack / SDK 2016
按照此教程:YouTube教程PTVS with MPI,并发现使用Visual Studio调试Python(以及同时封装的C ++ / C)的好处。
抱歉打广告,但微软团队确实在这方面做出了努力…
唯一不足的是必须将HPC Server的头节点强制放置在Window Server 2012下,但无论如何…