MPI错误" MPI_ERR_IN_STATUS"和#34; BadPickleGet"在与许多处理器

时间:2016-12-15 17:27:19

标签: mpi openmdao

我正在运行的OpenMDAO问题非常复杂,所以我认为发布整个脚本会有所帮助。但是,基本设置是我的问题根是一个ParallelFDGroup(现在实际上不是有限差分 - 只运行一次问题),它包含一些普通组件和一个并行组。并行组负责运行56个外部代码实例(每个代码实例一个组件)。奇怪的是,当我用4-8个处理器运行问题时,一切似乎都运行正常(有时甚至适用于10-12个处理器)。但是当我尝试使用更多的处理器(20+)时,我总是能够得到以下错误。它提供了两个回溯:

Traceback (most recent call last):
  File "opt_5mw.py", line 216, in <module>
    top.setup()   #call setup
  File "/home/austinherrema/.local/lib/python2.7/site-packages/openmdao/core/problem.py", line 644, in setup
    self.root._setup_vectors(param_owners, impl=self._impl, alloc_derivs=alloc_derivs)
  File "/home/austinherrema/.local/lib/python2.7/site-packages/openmdao/core/group.py", line 476, in _setup_vectors
    self._u_size_lists = self.unknowns._get_flattened_sizes()
  File "/home/austinherrema/.local/lib/python2.7/site-packages/openmdao/core/petsc_impl.py", line 204, in _get_flattened_sizes
    return self.comm.allgather(sizes)
  File "MPI/Comm.pyx", line 1291, in mpi4py.MPI.Comm.allgather (src/mpi4py.MPI.c:109194)
  File "MPI/msgpickle.pxi", line 746, in mpi4py.MPI.PyMPI_allgather (src/mpi4py.MPI.c:48575)
mpi4py.MPI.Exception: MPI_ERR_IN_STATUS: error code in status

Traceback (most recent call last):
  File "opt_5mw.py", line 216, in <module>
    top.setup()   #call setup
  File "/home/austinherrema/.local/lib/python2.7/site-packages/openmdao/core/problem.py", line 644, in setup
    self.root._setup_vectors(param_owners, impl=self._impl, alloc_derivs=alloc_derivs)
  File "/home/austinherrema/.local/lib/python2.7/site-packages/openmdao/core/group.py", line 476, in _setup_vectors
    self._u_size_lists = self.unknowns._get_flattened_sizes()
  File "/home/austinherrema/.local/lib/python2.7/site-packages/openmdao/core/petsc_impl.py", line 204, in _get_flattened_sizes
    return self.comm.allgather(sizes)
  File "MPI/Comm.pyx", line 1291, in mpi4py.MPI.Comm.allgather (src/mpi4py.MPI.c:109194)
  File "MPI/msgpickle.pxi", line 749, in mpi4py.MPI.PyMPI_allgather (src/mpi4py.MPI.c:48609)
  File "MPI/msgpickle.pxi", line 191, in mpi4py.MPI.Pickle.loadv (src/mpi4py.MPI.c:41957)
  File "MPI/msgpickle.pxi", line 143, in mpi4py.MPI.Pickle.load (src/mpi4py.MPI.c:41248)
cPickle.BadPickleGet: 65

我使用OpenMDAO 1.7.3在Ubuntu下运行。我尝试使用mpirun.openmpi(OpenRTE)1.4.3和mpirun(Open MPI)1.4.3运行并且在每种情况下得到相同的结果。

我发现this post似乎表明MPI安装有问题。但如果是这种情况,那么我觉得奇怪的是这个问题适用于少数处理器而不是更多的处理器。我也可以使用32个处理器运行一个相对简单的OpenMDAO问题(没有外部代码)而不会发生事故。

因为回溯引用了OpenMDAO未知数,所以我想知道OpenMDAO未知数的大小是否有限制。就我而言,每个外部代码组件都有几十个数组输出,每个输出最多可达50,000-60,000个元素。可能有问题吗?每个外部代码组件也读取同一组输入文件。这也是一个问题吗?我试图确保正确定义读写访问权限,但这可能还不够。

对于在这种情况下可能是罪魁祸首的任何建议表示赞赏。

编辑:我应该补充一点,我已经尝试运行问题而没有实际运行外部代码(即并行组中的组件被调用和设置但外部子进程实际上从未创建)并且问题仍然存在。

EDIT2:我已经在这个问题上做了一些调试,并且认为我应该分享我发现的一点点。如果我将问题解决为仅包含外部代码实例的并行组,则问题仍然存在。但是,如果我将并行组中的组件基本上没有 - 只是用于设置和solve_nonlinear的打印功能 - 那么问题就可以成功运行&#34;拥有大量处理器。我开始逐个添加设置行,看看会产生什么问题。在尝试向组件添加许多大的未知数时遇到了问题。我实际上仍然可以添加一个大的未知 - 例如,这有效:

self.add_output('BigOutput', shape=[100000])

但是当我尝试添加太多大输出时,我会收到错误:

for i in range(100):
    outputname = 'BigOutput{0}'.format(i)
    self.add_output(outputname, shape=[100000])

有时我只是从PETSc得到一般的分段违规错误。其他时候,我得到一个相当长的追溯,这个追溯太长了,不能在这里发布 - 如果它提供任何有用的线索,我会发布它的开头:

*** glibc detected *** python2.7: free(): invalid pointer: 0x00007f21204f5010 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7da26)[0x7f2285f0ca26]
/home/austinherrema/miniconda2/lib/python2.7/lib-dynload/../../libsqlite3.so.0(sqlite3_free+0x4f)[0x7f2269b7754f]
/home/austinherrema/miniconda2/lib/python2.7/lib-dynload/../../libsqlite3.so.0(+0x1cbbc)[0x7f2269b87bbc]
/home/austinherrema/miniconda2/lib/python2.7/lib-dynload/../../libsqlite3.so.0(+0x54d6c)[0x7f2269bbfd6c]
/home/austinherrema/miniconda2/lib/python2.7/lib-dynload/../../libsqlite3.so.0(+0x9d31f)[0x7f2269c0831f]
/home/austinherrema/miniconda2/lib/python2.7/lib-dynload/../../libsqlite3.so.0(sqlite3_step+0x1bf)[0x7f2269be261f]
/home/austinherrema/miniconda2/lib/python2.7/lib-dynload/_sqlite3.so(pysqlite_step+0x2d)[0x7f2269e4306d]
/home/austinherrema/miniconda2/lib/python2.7/lib-dynload/_sqlite3.so(_pysqlite_query_execute+0x661)[0x7f2269e404b1]
/home/austinherrema/miniconda2/bin/../lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x8942)[0x7f2286c6a5a2]
/home/austinherrema/miniconda2/bin/../lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x86c3)[0x7f2286c6a323]
/home/austinherrema/miniconda2/bin/../lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x86c3)[0x7f2286c6a323]
/home/austinherrema/miniconda2/bin/../lib/libpython2.7.so.1.0(PyEval_EvalCodeEx+0x89e)[0x7f2286c6b1ce]
/home/austinherrema/miniconda2/bin/../lib/libpython2.7.so.1.0(+0x797e1)[0x7f2286be67e1]
/home/austinherrema/miniconda2/bin/../lib/libpython2.7.so.1.0(PyObject_Call+0x53)[0x7f2286bb6dc3]
/home/austinherrema/miniconda2/bin/../lib/libpython2.7.so.1.0(+0x5c54f)[0x7f2286bc954f]
/home/austinherrema/miniconda2/bin/../lib/libpython2.7.so.1.0(PyObject_Call+0x53)[0x7f2286bb6dc3]
/home/austinherrema/miniconda2/bin/../lib/libpython2.7.so.1.0(PyEval_CallObjectWithKeywords+0x43)[0x7f2286c60d63]
/home/austinherrema/miniconda2/bin/../lib/libpython2.7.so.1.0(+0x136652)[0x7f2286ca3652]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x7e9a)[0x7f2286957e9a]
/lib/x86_64-linux-gnu/libc.so.6(clone+0x6d)[0x7f2285f8236d]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:03 9706352                            /home/austinherrema/miniconda2/bin/python2.7
00600000-00601000 rw-p 00000000 08:03 9706352                            /home/austinherrema/miniconda2/bin/python2.7
00aca000-113891000 rw-p 00000000 00:00 0                                 [heap]
7f21107d6000-7f2241957000 rw-p 00000000 00:00 0
etc...

1 个答案:

答案 0 :(得分:0)

很难猜到这里发生了什么,但是如果它适用于少数处理器而不适用于较大的处理器,那么当您使用多个节点并且数据必须转移时,可能会出现问题整个网络。我看到过这种方式表现不好的MPI编辑。如果我将工作保留在一个节点上,那么事情就会奏效,但不止一个。

追溯显示您甚至没有通过设置。因此,它不太可能是您的外部代码或任何其他组件运行方法中的任何内容。

如果您在群集上运行,是否正在编译自己的MPI?对于任何类型的HPC库,您通常需要使用非常具体的选项/库进行编译。但是大多数HPC系统都提供了可以加载mpi预编译的模块。