【问题标题】:MPI errors "MPI_ERR_IN_STATUS" and "BadPickleGet" in OpenMDAO when running external codes in parallel with many processors与多个处理器并行运行外部代码时,OpenMDAO 中的 MPI 错误“MPI_ERR_IN_STATUS”和“BadPickleGet”
【发布时间】:2017-05-01 09:37:59
【问题描述】:

我正在运行的 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 安装有问题。但如果是这种情况,我觉得奇怪的是,这个问题适用于少数处理器,但不适用于大量处理器。我还可以运行一个相对简单的 OpenMDAO 问题(无外部代码),使用 32 个处理器而不会发生意外。

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

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

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

EDIT2:我对这个问题做了更多的调试,并认为我应该分享我发现的一点点。如果我将问题分解为仅包含外部代码实例的并行组,则问题仍然存在。但是,如果我将并行组中的组件减少到基本上什么都没有——只是一个用于 setup 和用于 solve_nonlinear 的打印函数——那么这个问题可以在大量处理器上成功“运行”。我开始一一添加设置行,看看会产生什么问题。我在尝试向组件添加许多大型未知数时遇到了问题。实际上,我仍然可以只添加一个大的未知数——例如,这是可行的:

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...

【问题讨论】:

  • 您可能因大量未知数而内存不足... 32 位数学存在限制。

标签: mpi openmdao


【解决方案1】:

很难猜出这里发生了什么,但如果它适用于少量处理器而不适用于较大的处理器,一种猜测可能是当您使用多个节点时会出现问题,并且必须传输数据整个网络。我见过这样的不良 MPI 编译。如果我将工作保留在一个节点上,但在不止一个节点上中断,一切都会奏效。

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

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

【讨论】:

  • 感谢您的意见!我没有完全考虑到它甚至没有通过设置,所以这可能会有所帮助。我们实际上是在我们自己的机器上运行,所以我们不必在 MPI 编译方面做任何太疯狂的事情。只需使用 apt-get 安装 vanilla MPI。同样,如果问题是由于 MPI 本身的问题引起的,我希望它对于使用大量处理器的任何问题都会以这种方式运行,对吧?但事实并非如此。我可以在 32 个处理器上运行一个简单的 omdao 优化问题没问题。
  • 经过更多的实验,您可能对跨节点问题是正确的。当只使用单个节点的处理器时,我们肯定会遇到更少的问题(尽管很难知道哪些处理器被用于哪些尝试)。仍然没有解释为什么我可以用全部处理器运行一个简单的问题,但似乎仍然相关。也许是一个 mpi4py 问题...
  • @aherrema 一件快速的事情,可能您已经检查过了,但这在使用 mpi4py 时非常重要,因为您以后可能会遇到奇怪的行为:您是否检查过您使用的 mpi4py 是针对与您在环境中加载的 MPI 库的类型(OpenMPI、MPICH 等)和版本完全相同?我曾经遇到过由此引起的问题,但我不知道它是否适用于您的情况。您可以检查: from mpi4py import MPI name, version = MPI.get_vendor() 或仅打印 MPI.get_vendor()
  • @fedepad 我很欣赏有关检查 mpi4py 版本的建议和说明。运行 MPI.get_vender() 时,我得到 ('Open MPI', (1, 4, 3)),这似乎与我正在运行的 OpenMPI 1.4.3 一致。所以我不认为是这样。不过谢谢!
  • 在原始帖子中添加了更多信息。问题似乎与未知数有关……
猜你喜欢
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
  • 1970-01-01
相关资源
最近更新 更多