Openmdao - вычислять конечную разницу параллельно при оптимизации - PullRequest
0 голосов
/ 05 октября 2018

Я сделал простой пример (см. Ниже), который делает 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 голосов
/ 05 октября 2018

Начиная с OpenMDAO v2.4 вы не могли делать параллельные конечно-разностные.Однако эта функция была недавно добавлена ​​в основную ветку OpenMDAO и скоро будет официально выпущена в OpenMDAO V2.5.

Чтобы использовать эту функцию прямо сейчас, установите версию репозитория openMDAO (Вы не можете сделать pip install openmdao. Вместо этого клонируйте репозиторий из github, а затем pip install -e <location of the cloned repo>).

Тогда вы можетеследуйте инструкциям на странице документации для параллельного 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'])
...