如何从 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 下是一个无赖,但无论如何......
我有一个 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):
在我的示例中,我将 运行 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 下是一个无赖,但无论如何......