2016-12-15 1 views
0

私が実行している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... 
+0

多分未知数の多いメモリが不足しています... 32ビットの計算には限界があります。 –

答えて

0

その、ここで起こっていただきました!推測するのは難しいが、もし少数のプロセッサで動作し、大きなノードでは動作しません。複数のノードを使用すると問題が発生し、ネットワーク経由でデータを転送する必要があります。私はこのようにふさわしい悪いMPIコンパイルを見ました。仕事を1つのノードに保ち、複数のノードを壊してしまえば、うまくいくだろう。

トレースバックには、設定が完了していないことが表示されます。だからあなたの外部コードや他のコンポーネントのメソッドを実行するには何もない可能性があります。

クラスタで実行している場合は、独自のMPIをコンパイルしていますか?通常は、あらゆる種類のHPCライブラリ用の非常に特殊なオプション/ライブラリを使用してコンパイルする必要があります。しかし、ほとんどのHPCシステムは、プリコンパイルされたmpiのロード可能なモジュールを提供しています。

+0

あなたの考えをありがとう!私はそれがセットアップを経ずに役立つかもしれないという事実を通して完全には考えていなかった。私たちは実際に私たち自身のマシンで走っているので、MPIコンパイルに関してはあまりにも狂ったことをする必要はありませんでした。 apt-getでバニラMPIをインストールするだけです。繰り返しますが、問題がMPI自体の問題によるものだった場合は、より多くのプロセッサを使用しているすべての問題に対して、この方法で動作すると思います。しかし、そうではありません。私は問題のない32プロセッサで簡単なomdao最適化問題を実行できます。 – aherrema

+0

もう少し実験を重ねると、ノード間の問題について正しいかもしれません。単一ノードのプロセッサのみを使用している場合は、明らかに問題が少ないように見えます(どちらのプロセッサがどの試行に使用されているかは分かりませんが)。それでも、なぜ私はプロセッサの完全な数で単純な問題を実行することができますが、まだ関連性があるように説明していません。たぶんmpi4pyの問題かもしれません... – aherrema

+2

@aherremaおそらく既にチェックしたことでしょうが、これは後で奇妙な動作に直面する可能性があるので、mpi4pyを使用するときには非常に重要です。使用しているmpi4pyがあなたの環境にロードするMPIライブラリと同じタイプ(OpenMPI、MPICHなど)とバージョン?私はかつて一度それに起因する問題を抱えていましたが、それがあなたの場合に当てはまるかどうかはわかりません。私はmpi4pyバージョンをチェックするための提案や指示に感謝mpi4py輸入MPI 名、バージョン= MPI.get_vendor() か、単に 印刷MPI.get_vendor() – fedepad

関連する問題