【问题标题】:Profile parallelized python script with mpi4py使用 mpi4py 分析并行化 python 脚本
【发布时间】:2016-02-03 20:16:45
【问题描述】:

我有一个使用 mpi4pypython 脚本,名为 main_parallel.py。我可以使用time 形成cli 来测量时间,但是,如何制作类似于cProfile 的配置文件?我喜欢查看代码每个部分的调用次数。我不能使用 cProfile,因为它只能用于串行代码。

谢谢!

【问题讨论】:

    标签: python parallel-processing profiler mpi4py


    【解决方案1】:

    正如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的理由吗?这样每次都会重新导入...
    • 根据this,导入被缓存并且只导入一次。但是,没有理由将导入保留在最内部的函数中,因此您可以在顶层导入它。
    • 是的,你是对的。我忘记了重新进口没有罚款。然而,这不是通常的风格......另外,为 MPI 单例添加导入行以使代码完整可能会很好。编辑:我建议对此进行编辑。
    【解决方案2】:

    为什么不能使用 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 级。考虑到我的安装比你的答案新,也许你的答案已经过时了?
    • 谢谢。 1.10.2 来自 OpenMPI。我已经更新了我的答案,以反映获得排名靠前的方法是特定于实现的,并记录了两个主要实现。
    • 太棒了。显然标准化的mpiexec 以如此不一致的方式做到这一点有点奇怪。我认为它的目的是替换mpirun,因为它没有标准化,所以恰恰受到了这些不一致的影响......
    猜你喜欢
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多