私が実行しているOpenMDAOの問題はかなり複雑なので、スクリプト全体を投稿するのは役に立ちません。しかし、基本的なセットアップは、私の問題のルートはParallelFDGroup(現時点では実際には差分をとるのではなく、ちょうど一度問題を実行する)で、いくつかの通常のコンポーネントと並列グループを含んでいるということです。パラレルグループは、56個の外部コード(コードのインスタンスごとに1つのコンポーネント)のインスタンスを実行します。不思議なことに、私が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
私はOpenMDAO 1.7.3でUbuntuで動作しています。私はmpirun.openmpi(OpenRTE)1.4.3とmpirun(Open MPI)1.4.3の両方で動作させようとしましたが、どちらの場合も同じ結果が得られました。
私はthis postを見つけました。これは、MPIインストールに何か問題があることを示唆しています。しかし、これが当てはまる場合、問題は少数のプロセッサでは動作しますが、それ以上のプロセッサではうまくいかないと私は思います。また、問題のない32個のプロセッサを備えた比較的簡単なOpenMDAO問題(外部コードなし)を実行することもできます。
OpenMDAOの未知数をトレースバックが参照しているため、私はOpenMDAO未知数のサイズに制限があるのか疑問に思った。私の場合、各外部コードコンポーネントには数十〜数十の配列出力があり、それぞれ最大5万〜60,000個の要素になります。それは問題になるかもしれませんか?各外部コード・コンポーネントは、同じセットの入力ファイルも読み取ります。それも問題なのでしょうか?私は、読み書きアクセスが適切に定義されていることを保証しようとしましたが、それだけでは十分ではありません。
このような状況で何が原因であるかについてのご意見をお待ちしております。
EDIT:実際に外部コードを実行せずに(つまり、パラレルグループのコンポーネントが呼び出され、セットアップされていますが、実際に外部サブプロセスが作成されることはありません)、問題は解決されません。
EDIT2:私はこの問題についてもう少しデバッグを行い、私が発見した小さなものを分かち合うべきだと考えました。私が問題を外部コードインスタンスを含む並列グループだけに落とすと、問題は解決されません。しかし、パラレルグループのコンポーネントを基本的には何も削減しないでください。セットアップ用とprint_nonlinear用の印刷機能だけでは、問題は多数のプロセッサで正常に「実行」できます。私はセットアップラインを一つずつ追加して何が問題になるかを見始めた。多くの大きな未知数をコンポーネントに追加しようとすると、問題に遭遇しました。
self.add_output('BigOutput', shape=[100000])
しかし、私は以下のようにあまりにも多くの大出力を追加しようとすると、私はエラーを取得:
for i in range(100):
outputname = 'BigOutput{0}'.format(i)
self.add_output(outputname, shape=[100000])
時には、例えばこれは作品 - 私は実際にはまだ1つだけ大きな不明を追加することができます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ビットの計算には限界があります。 –