2016-12-15 21 views
0

我運行的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... 
+0

你可能內存不足,有很多未知數......有32位數學的限制。 –

回答

0

其很難猜測什麼怎麼回事,但如果它適用於少數處理器,而不適用於大型處理器。有人猜測,當您使用多個節點時,問題就會顯現出來,並且數據必須通過網絡傳輸。我看到了這種方式表現不佳的MPI編譯。如果我把這項工作保留在一個節點上,但是不止一個節點會崩潰。

回溯顯示你甚至沒有通過設置。所以它不可能是你的外部代碼或其他組件運行方法中的任何東西。

如果你在羣集上運行,你在編譯自己的MPI嗎?您通常需要爲任何類型的HPC庫編譯非常具體的選項/庫。但是大多數HPC系統提供了可以加載的mpi預編譯模塊。

+0

謝謝你的想法!我沒有完全想到它甚至沒有通過設置,這可能會有所幫助。我們實際上是在我們自己的機器上運行,因此我們不必爲MPI編譯做任何太瘋狂的事情。只需用apt-get安裝vanilla MPI即可。再說一次,如果問題是由於MPI本身的問題引起的,那麼我認爲它會以這種方式處理使用大量處理器的任何問題,對吧?但事實並非如此。我可以在32個處理器上運行一個簡單的omdao優化問題沒有問題。 – aherrema

+0

經過一些更多的實驗後,您可能對跨節點問題是正確的。當只使用單個節點的處理器時(雖然很難知道哪些處理器用於哪些嘗試),但我們確實似乎遇到的問題較少。仍然沒有解釋爲什麼我可以對全部處理器運行一個簡單的問題,但似乎仍然相關。也許是一個mpi4py問題... – aherrema

+2

@aherrema一件很簡單的事情,可能你已經檢查過了,但是在使用mpi4py時這很重要,因爲之後你可能會面對奇怪的行爲:你是否檢查過使用的mpi4py是針對完全相同的類型(OpenMPI,MPICH等)以及您在環境中加載的MPI庫的版本?我曾經有過這樣的問題,但我不知道它是否適用於你的情況。從mpi4py進口MPI 名稱,版本= MPI.get_vendor() 或只是 打印MPI.get_vendor() – fedepad