0

ParallelGroup 内の分散コンポーネントを使用して MPI で解析を実行すると、DumpRecorder を解析に追加するとエラーが発生します。以下は、これを示す小さな例です (これは、2015 年 10 月 28 日の最新のマスター ブランチ コミット aaa67a4d51f4081e9e41b250b0a76b077f6f0c21 で実行されました)。

import numpy as np
from openmdao.core.mpi_wrap import MPI
from openmdao.api import Component, Group, DumpRecorder, Problem, ParallelGroup


class Sliced(Component):

    def __init__(self):
        super(Sliced, self).__init__()

        self.add_param('x', 0.)
        self.add_output('y', 0.)

    def solve_nonlinear(self, params, unknowns, resids):

        unknowns['y'] = params['x'] * 2.


class VectorComp(Component):

    def __init__(self, size):
        super(VectorComp, self).__init__()

        self.add_param('xin', np.zeros(size))

        self.add_output('x', np.zeros(size))

    def solve_nonlinear(self, params, unknowns, resids):

        unknowns['x'] = params['xin'] * 2.


class Analysis(Group):

    def __init__(self, size):
        super(Analysis, self).__init__()

        self.add('v', VectorComp(size), promotes=['*'])

        par = self.add('par', ParallelGroup())
        for i in range(size):
            par.add('sec%02d' % i, Sliced())
            self.connect('x', 'par.sec%02d.x' % i, src_indices=[i])


if __name__ == '__main__':

    if MPI:
        from openmdao.core.petsc_impl import PetscImpl as impl
    else:
        from openmdao.core.basic_impl import BasicImpl as impl

    p = Problem(impl=impl, root=Analysis(4))

    recorder = DumpRecorder('optimization.log')
    # adding specific includes works, but leaving it out results in a crash
    # recorder.options['includes'] = ['x']
    p.driver.add_recorder(recorder)
    p.setup()
    p.run()

発生するエラーは次のとおりです。

RuntimeError: Cannot access remote Variable 'par.sec00.x' in this process.

レコーダーはプロセッサごとにファイルをダンプするようですが、BaseRecorder._filter_vectorsメソッドは特定のプロセッサに存在しないパラメーターを除外するべきではありませんか? 私はまだ修正を提案するほどコードに精通していないので、OpenMDAO の開発者が何が問題なのかを簡単に理解できることを願っています。

手動でインクルードを指定すると、Sliced パラメーターが除外されるため機能しますが、これは必要なく、内部で処理されると便利です。

また、新しいフレームワークについて私たちがどれほど興奮しているかをお知らせしたいと思います。0.x バージョンよりもはるかに高速であり、パラレル FD 機能は非常に高く評価され、魅力的に機能します。

4

1 に答える 1

0

並行してダンプレコーダーを壊す最近の変更がいくつかありました。SqliteRecorder誰かに修正してもらうためにストーリーを用意しましたが、それまでの間、レコーダーを試してみることをお勧めします。これは、私が CADRE でのパフォーマンス テストに使用してきたものです。同じように設定しますが、sqlitedict を使用して値を読み取ります。ドキュメントには小さな例がありますが、より実用的な例は CADRE コードにあります。

https://github.com/OpenMDAO/CADRE/blob/master/plot_progress.py

于 2015-11-02T13:33:35.150 に答える