【发布时间】:2018-11-19 20:52:19
【问题描述】:
任何开发人员/用户是否对并行驱动程序进行了扩展测试?这些的预期缩放比例是多少?
我有一个带有 openmpi 的设置,并使用了 DOEDriver 的并行示例from the manual,但使用了 UniformGenerator。
在 2、4、8、16 核中测试。缩放性能非常糟糕。这是由于 在此示例中我不知道的瓶颈。
你有更好的测试扩展的示例建议吗?
【问题讨论】:
标签: openmdao
任何开发人员/用户是否对并行驱动程序进行了扩展测试?这些的预期缩放比例是多少?
我有一个带有 openmpi 的设置,并使用了 DOEDriver 的并行示例from the manual,但使用了 UniformGenerator。
在 2、4、8、16 核中测试。缩放性能非常糟糕。这是由于 在此示例中我不知道的瓶颈。
你有更好的测试扩展的示例建议吗?
【问题讨论】:
标签: openmdao
您的问题有点含糊,因为您没有向我们提供有关您如何运行示例问题的任何细节。尽管您刚刚修改了基本示例,但我会猜测一下。假设您尝试基于this specific example 运行Paraboloid 模型的许多案例,那么您在缩放方面看到的问题可能是由于抛物面模型没有显着的计算成本并行化值得。
每当您从任何算法或代码从串行转移到并行时,总会产生一些新的开销。由于 OpenMDAO 使用基于 MPI 的并行性,因此现在需要 MPI 通信开销和额外的框架级设置。此外,如果您保留该示例问题的默认设置,则会有一个记录器连接到驱动程序。当你并行运行 DOE 时,你会得到 n 个不同的记录器文件(每个进程一个文件)。因此,将结果写入每个文件需要时间,除非您有并行文件系统,否则在系统等待写入磁盘的能力时会增加瓶颈。
所以说真的,你需要小心并行化,但这里有一个简单的脚本来表明,如果你让组件计算更昂贵,那么你将获得更好的缩放。这不是一个严格的缩放示例,sleep 函数的使用有点作弊,因为没有做任何实际工作。但它得到了一般的观点。
import time
from openmdao.api import Problem, IndepVarComp, ExplicitComponent
from openmdao.api import DOEDriver, FullFactorialGenerator
from openmdao.api import SqliteRecorder, CaseReader
class Paraboloid(ExplicitComponent):
"""
Evaluates the equation f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3.
"""
def setup(self):
self.add_input('x', val=0.0)
self.add_input('y', val=0.0)
self.add_output('f_xy', val=0.0)
# Finite difference all partials.
self.declare_partials('*', '*', method='fd')
def compute(self, inputs, outputs):
"""
f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3
Minimum at: x = 6.6667; y = -7.3333
"""
x = inputs['x']
y = inputs['y']
outputs['f_xy'] = (x-3.0)**2 + x*y + (y+4.0)**2 - 3.0
time.sleep(1)
prob = Problem()
model = prob.model
model.add_subsystem('p1', IndepVarComp('x', 0.0), promotes=['x'])
model.add_subsystem('p2', IndepVarComp('y', 0.0), promotes=['y'])
model.add_subsystem('comp', Paraboloid(), promotes=['x', 'y', 'f_xy'])
model.add_design_var('x', lower=0.0, upper=1.0)
model.add_design_var('y', lower=0.0, upper=1.0)
model.add_objective('f_xy')
prob.driver = DOEDriver(FullFactorialGenerator(levels=3))
prob.driver.options['run_parallel'] = True
prob.driver.options['procs_per_model'] = 1
prob.driver.options['debug_print'] = ['desvars', 'objs']
prob.driver.add_recorder(SqliteRecorder("cases.sql"))
prob.setup()
st = time.time()
prob.run_driver()
print('time', time.time() - st)
总结: 您需要您的模型/组件足够昂贵以使并行化值得。如果您使用的是文件包装组件,则需要格外小心,因为所有文件 i/o 都将成为并行执行的巨大瓶颈。
【讨论】: