【问题标题】:Openmdao - compute finite difference in parallel when optimizingOpenmdao - 优化时并行计算有限差分
【发布时间】:2018-10-05 12:58:16
【问题描述】:

我做了一个简单的例子(见下文),它以串行方式执行 fd。并行执行此操作的最佳方法是什么?我正在使用 Python 3.6 和 OpenMDAO 2.4.0。

   import numpy as np

   from openmdao.api import Problem, ScipyOptimizeDriver, ExecComp, IndepVarComp, ExplicitComponent, Group

   class WorkFlow(ExplicitComponent):
       def setup(self):
           self.add_input('x', np.ones(5))
           self.add_output('y', 2.0)
           self.declare_partials('y', 'x', method='fd')

       def compute(self, inputs, outputs):
           print('comm:', self.comm.rank, inputs['x'])
           print()
           outputs['y'] = abs(np.sum(inputs['x']**2) - 9)

   prob = Problem()
   indeps = prob.model.add_subsystem('indeps', IndepVarComp(), promotes=['*'])
   indeps.add_output('x', np.ones(5))

   prob.model.add_subsystem('wf', WorkFlow(),  promotes_inputs=['x'])

   prob.driver = ScipyOptimizeDriver()
   prob.driver.options['optimizer'] = 'SLSQP'
   prob.driver.options['tol'] = 1e-9

   prob.model.add_design_var('x', lower=-10.0, upper=10.0)

   prob.model.add_objective('wf.y')

   prob.setup()
   prob.run_driver()
   print(prob['x'])
   print(prob['wf.y'])

【问题讨论】:

    标签: openmdao


    【解决方案1】:

    从 OpenMDAO v2.4 开始,您无法进行并行有限差分。不过,该功能最近已添加到 OpenMDAO 的 master 分支中,并将很快在 OpenMDAO V2.5 中正式发布。

    要立即使用该功能,请安装 openMDAO 的存储库版本(您不能这样做 pip install openmdao。而是从 github 克隆存储库,然后 pip install -e <location of the cloned repo>)。

    然后您可以按照documentation page 上的说明进行并行FD。

    这是您的实际代码。对组件的唯一更改是,当您实例化它时,您向组件提供了 num_par_fd=5 参数。然后当你调用文件时,你应该像这样在 mpi 下运行它:

    mpiexec -n 5 python test.py

    下面是 test.py 的样子:

       import numpy as np
    
       from openmdao.api import Problem, ScipyOptimizeDriver, ExecComp, IndepVarComp, ExplicitComponent, Group
    
       class WorkFlow(ExplicitComponent):
           def setup(self):
               self.add_input('x', np.ones(5))
               self.add_output('y', 2.0)
               self.declare_partials('y', 'x', method='fd')
    
           def compute(self, inputs, outputs):
               print('comm:', self.comm.rank, inputs['x'])
               print()
               outputs['y'] = abs(np.sum(inputs['x']**2) - 9)
    
       prob = Problem()
       indeps = prob.model.add_subsystem('indeps', IndepVarComp(), promotes=['*'])
       indeps.add_output('x', np.ones(5))
    
       prob.model.add_subsystem('wf', WorkFlow(num_par_fd=5),  promotes_inputs=['x'])
    
       prob.driver = ScipyOptimizeDriver()
       prob.driver.options['optimizer'] = 'SLSQP'
       prob.driver.options['tol'] = 1e-9
    
       prob.model.add_design_var('x', lower=-10.0, upper=10.0)
    
       prob.model.add_objective('wf.y')
    
       prob.setup()
       prob.run_driver()
       print(prob['x'])
       print(prob['wf.y'])
    

    【讨论】:

    • 感谢您的回答!虽然我发现该功能的文档在实际功能之前发布有点颠倒?
    • 我在运行上面的代码时遇到了错误。 File "MPI/Comm.pyx", line 640, in mpi4py.MPI.Comm.Allgather (src/mpi4py.MPI.c:98562) mpi4py.MPI.Exception: Invalid buffer pointer, error stack: PMPI_Allgather(958): MPI_Allgather(sbuf=0x2b28250, scount=1, MPI_INT, rbuf=0x2b28250, rcount=1, MPI_INT, MPI_COMM_WORLD) failed PMPI_Allgather(931): Buffers must not be aliased。你有线索吗?并行FD文档中的代码运行良好...
    • 有人知道为什么上面的代码不能运行吗?
    • 上面的代码在我的 macbook 上运行良好。你知道你是否使用openmpi吗? OpenMDAO MPI 代码仅使用 openmpi 进行过测试。我模糊记得在使用带有 MPICH 的旧版本 OpenMDAO 时遇到这样的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 2015-02-26
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多