OpenMDAO 1.x: 并行记录
OpenMDAO 1.x: recording in parallel
当 运行在 MPI 下使用 ParallelGroup 中的分布式组件进行分析时,将 DumpRecorder 添加到分析中时出现错误。下面是一个演示这一点的小例子(这是 运行 最新的主分支提交 aaa67a4d51f4081e9e41b250b0a76b077f6f0c21 来自 28/10/2015):
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 开发人员能够轻松找出问题所在。
手动指定 include 是可行的,因为 Sliced 参数随后会被排除,但最好不要这样做,并在幕后进行处理。
我还想让你们知道我们对新框架有多兴奋。它 so 比 0.x 版本快得多,并且并行 FD 功能非常受欢迎并且非常有用!
最近有一些更改并行破坏了转储记录器。我们发布了一个故事供某人修复,但与此同时,您可能想试试 SqliteRecorder
记录器。这就是我在 CADRE 上用于性能测试的工具。您以相同的方式设置它,然后使用 sqlitedict 读取值。文档中有一个小示例,但 CADRE 代码中有一个更实用的示例:
https://github.com/OpenMDAO/CADRE/blob/master/plot_progress.py
当 运行在 MPI 下使用 ParallelGroup 中的分布式组件进行分析时,将 DumpRecorder 添加到分析中时出现错误。下面是一个演示这一点的小例子(这是 运行 最新的主分支提交 aaa67a4d51f4081e9e41b250b0a76b077f6f0c21 来自 28/10/2015):
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 开发人员能够轻松找出问题所在。
手动指定 include 是可行的,因为 Sliced 参数随后会被排除,但最好不要这样做,并在幕后进行处理。
我还想让你们知道我们对新框架有多兴奋。它 so 比 0.x 版本快得多,并且并行 FD 功能非常受欢迎并且非常有用!
最近有一些更改并行破坏了转储记录器。我们发布了一个故事供某人修复,但与此同时,您可能想试试 SqliteRecorder
记录器。这就是我在 CADRE 上用于性能测试的工具。您以相同的方式设置它,然后使用 sqlitedict 读取值。文档中有一个小示例,但 CADRE 代码中有一个更实用的示例:
https://github.com/OpenMDAO/CADRE/blob/master/plot_progress.py