我運行的OpenMDAO問題非常複雜,因此我認爲發佈整個腳本不會有幫助。但是,基本設置是我的問題根目錄是一個ParallelFDGroup(目前實際上並非有限差分 - 僅運行一次該問題),其中包含幾個正常分量以及一個並行分組。並行組負責運行56個外部代碼實例(每個代碼實例一個組件)。奇怪的是,當我用4-8個處理器運行這個問題時,一切看起來都很好(有時甚至可以用10-12個處理器)。但是當我嘗試使用更多的處理器(20+)時,我總是在下面得到錯誤。它提供了兩個回溯:當與許多處理器並行運行外部代碼時,OpenMDAO中的MPI錯誤「MPI_ERR_IN_STATUS」和「BadPickleGet」
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
我在Ubuntu下運行OpenMDAO 1.7.3。我試過用mpirun.openmpi(OpenRTE)1.4.3和mpirun(Open MPI)1.4.3來運行,並且在每種情況下都得到了相同的結果。
我發現this post似乎表明MPI安裝有問題。但是,如果是這樣的話,這讓我感到奇怪的是,這個問題只適用於少數處理器,而不適用於更多的處理器。我也可以用32個處理器運行一個相對簡單的OpenMDAO問題(無需外部代碼),而不會發生事故。
由於回溯引用OpenMDAO未知,我想知道OpenMDAO未知的大小是否有限制。在我的情況下,每個外部代碼組件都有幾十個數組輸出,每個輸出可能高達50,000-60,000個元素。可能會有問題嗎?每個外部代碼組件也讀取相同的一組輸入文件。這也可能是一個問題嗎?我試圖確保讀取和寫入訪問被正確定義,但這可能還不夠。
任何有關可能是這種情況下罪魁禍首的建議,
編輯:我應該補充一點,我已經試過運行該問題而沒有實際運行外部代碼(即並行組中的組件被調用並設置,但實際上從未創建外部子進程),問題依然存在。
編輯2:我在這個問題上做了一些更多的調試,並認爲我應該分享我發現的那個小東西。如果我將問題僅限於包含外部代碼實例的並行組,問題仍然存在。但是,如果我將並行組中的組件減少到幾乎沒有任何內容 - 只是設置和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位數學的限制。 –