Openmdao-优化时并行计算有限差分

时间:2018-10-05 12:58:16

标签: openmdao

我做了一个简单的示例(见下文),该示例串行执行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'])

1 个答案:

答案 0 :(得分:0)

从OpenMDAO v2.4开始,您不能执行并行有限差分。但是,该功能最近已添加到OpenMDAO的主分支中,并将很快在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'])