【发布时间】:2016-02-03 20:16:45
【问题描述】:
我有一个使用 mpi4py 的 python 脚本,名为 main_parallel.py。我可以使用time 形成cli 来测量时间,但是,如何制作类似于cProfile 的配置文件?我喜欢查看代码每个部分的调用次数。我不能使用 cProfile,因为它只能用于串行代码。
谢谢!
【问题讨论】:
标签: python parallel-processing profiler mpi4py
我有一个使用 mpi4py 的 python 脚本,名为 main_parallel.py。我可以使用time 形成cli 来测量时间,但是,如何制作类似于cProfile 的配置文件?我喜欢查看代码每个部分的调用次数。我不能使用 cProfile,因为它只能用于串行代码。
谢谢!
【问题讨论】:
标签: python parallel-processing profiler mpi4py
正如Rob Latham 所说,您可以使用 cProfile。您可以将每个进程的输出保存在不同的文件中。如果你想分析一个函数,你可以使用这样的装饰器:
from mpi4py import MPI
import cProfile
def profile(filename=None, comm=MPI.COMM_WORLD):
def prof_decorator(f):
def wrap_f(*args, **kwargs):
pr = cProfile.Profile()
pr.enable()
result = f(*args, **kwargs)
pr.disable()
if filename is None:
pr.print_stats()
else:
filename_r = filename + ".{}".format(comm.rank)
pr.dump_stats(filename_r)
return result
return wrap_f
return prof_decorator
@profile(filename="profile_out")
def my_function():
# do something
每个进程的输出可以使用snakeviz可视化
【讨论】:
import cProfile的理由吗?这样每次都会重新导入...
为什么不能使用 cprofile?你试过吗?
对于 MPICH,我是这样运行的:
$ mpiexec -l -np 4 python -m cProfile ./simple-io.py doodad
这给了我 4 组输出,但 '-l' 参数列出了每个输出位前面的 MPI 等级。注意:'-l' 参数是 MPICH 特定的。 OpenMPI 使用--tag-output。其他实现可能会使用其他东西。
我看到 cprofile 可以接受文件名参数。制作每个等级的输出文件,然后使用 Stats 处理它
% python
Python 2.7.10 (default, Oct 14 2015, 16:09:02)
[GCC 5.2.1 20151010] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pstats
>>> pstats.Stats("simple-io.cprofile").sort_stats('cumulative').print_stats()
给了我很多 cprofile 信息...但是我的玩具程序太小了,无法给我任何有用的东西。
【讨论】:
mpiexec(来自 Ubuntu 16.04 包管理器的 1.10.2)似乎没有 -l 开关。没有它,我只会得到一个输出文件,显然是 0 级。考虑到我的安装比你的答案新,也许你的答案已经过时了?
mpiexec 以如此不一致的方式做到这一点有点奇怪。我认为它的目的是替换mpirun,因为它没有标准化,所以恰恰受到了这些不一致的影响......