【问题标题】:Parsing arguments using argparse and mpi4py使用 argparse 和 mpi4py 解析参数
【发布时间】:2014-08-01 19:28:56
【问题描述】:

我想在 MPI 下的多个并行进程中运行 Python 脚本,我需要传递命令行参数。我在 Python 中使用 argparse 模块,但有时有点乱。如果我没有指定正确的参数,所有进程都会抱怨,所以我会收到许多相同错误消息的副本。

我尝试只让进程 0 解析参数,然后将结果广播到其他进程,但是当解析失败并且没有广播时,其他进程会挂起。

如何解析命令行参数,并在解析失败时打印可读消息?

【问题讨论】:

    标签: python parallel-processing mpi argparse


    【解决方案1】:

    我需要的额外部分是在进程 0 中围绕参数解析步骤包装 try/finally。在 finally 块中,将 something 广播到其他进程。如果解析失败,你会广播None,他们都可以静默退出。

    from mpi4py import MPI
    from time import sleep
    import argparse
    
    def parseOptions(comm):
        parser = argparse.ArgumentParser(
            description='Print some messages.')
    
        parser.add_argument('iteration_count', help='How many times', type=int)
        parser.add_argument('message',
                            help='What to say',
                            nargs=argparse.OPTIONAL,
                            default='Hello, World!')
    
        args = None
        try:
            if comm.Get_rank() == 0:
                args = parser.parse_args()
        finally:
            args = comm.bcast(args, root=0)
    
        if args is None:
            exit(0)
        return args
    
    def main():
        comm = MPI.COMM_WORLD  # @UndefinedVariable
        rank = comm.Get_rank()
        size = comm.Get_size()
    
        args = parseOptions(comm)
    
        if rank == 0:
            print args.message
    
        for i in range(args.iteration_count):
            if i%size == rank:
                print '{} in rank {} started.'.format(i, rank)
                sleep(.5)
                print '...'
                sleep(.5)
                print '{} in rank {} ended.'.format(i, rank)
    
    if __name__ == '__main__':
        main()
    

    我用这样的命令运行代码:

    mpirun -np 4 python scratch.py 13
    

    【讨论】:

      【解决方案2】:

      如果您遇到错误情况,通常最简单的方法是让进程中止,而不是尝试做一些花哨的事情来清理。在您的情况下,您可以让原始进程(排名 0)调用 abort 并导致其他所有人退出:

      comm.abort()
      

      这样,您就不必让每个人都试图匹配结果。它们只是自动中止。

      【讨论】:

      • 我是 MPI 新手,我不知道 abort。这听起来更容易。
      • 我尝试使用comm.Abort(),但要么我没有正确使用,要么它是一个非常生硬的工具。它打印了一堆错误文本,包括根进程不正确退出的语句。它抱怨对initfinalize 的调用不平衡,所以我将坚持我原来的广播None 的策略来告诉其他进程退出。
      • 这是真的,可能是打印额外的输出并抱怨。它被设计为在错误情况下调用,听起来就像您看到的那样。
      猜你喜欢
      • 2018-12-14
      • 2016-06-19
      • 2014-03-04
      • 2013-09-13
      • 1970-01-01
      • 2015-03-04
      • 2020-07-14
      • 2016-05-30
      相关资源
      最近更新 更多