OpenMDAO 1.x:并行录制

时间:2015-11-02 09:51:16

标签: recorder openmdao

在并行组中使用分布式组件在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开发人员能够轻松找出问题所在。

手动指定包含工作,因为切片参数被排除在外,但是这不是必需的,并且在幕后处理。

我也想让你们知道我们对新框架的兴趣。它是所以比0.x版本快得多,而并行FD功能非常受欢迎,并且像魅力一样!

1 个答案:

答案 0 :(得分:0)

最近有一些变化同时打破了转储记录器。我们为某人修改了一个故事,但在此期间,您可能想尝试SqliteRecorder录音机。这就是我一直用于CADRE的性能测试。您以相同的方式设置它,但然后使用sqlitedict读取值。文档中有一个小例子,但CADRE代码中有一个更实际的例子:

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