【发布时间】: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 位数学存在限制。