在MPI下运行时使用非线性解算器时,优化挂起

在MPI下运行时使用非线性解算器时,优化挂起,mpi,openmdao,Mpi,Openmdao,我正在尝试使用OpemMDAO中的无梯度算法(如简单遗传算法)解决优化问题,使用MPI并行函数求值。当我的问题没有周期时,我不会遇到任何问题。然而,只要我必须使用非线性解算器来收敛一个循环,这个过程就会在一个列组的nl_解算器完成后无限期地挂起 下面是一个代码示例(solve_sellar.py): 将openmdao.api作为om导入 从openmdao.test_suite.components.sellar_功能导入SellarMDA 从openmdao.utils.mpi导入mpi 如

我正在尝试使用OpemMDAO中的无梯度算法(如简单遗传算法)解决优化问题,使用MPI并行函数求值。当我的问题没有周期时,我不会遇到任何问题。然而,只要我必须使用非线性解算器来收敛一个循环,这个过程就会在一个列组的nl_解算器完成后无限期地挂起

下面是一个代码示例(solve_sellar.py):

将openmdao.api作为om导入
从openmdao.test_suite.components.sellar_功能导入SellarMDA
从openmdao.utils.mpi导入mpi
如果不是MPI:
排名=0
其他:
秩=MPI.COMM\u WORLD.rank
如果名称=“\uuuuu main\uuuuuuuu”:
prob=om.Problem()
prob.model=SellarMDA()
问题模型添加设计变量('x',下限=0,上限=10)
问题模型添加设计变量('z',下限=0,上限=10)
问题模型添加目标(“obj”)
问题模型添加约束('con1',上限=0)
问题模型添加约束('con2',上限=0)
prob.driver=om.SimpleGADriver(run_parallel=(MPI不是None),位={“x”:32,“z”:32})
问题设置()
问题设置解算器打印(级别=0)
问题运行驱动程序()
如果秩==0:
打印('最小值在')
打印(prob['x'][0])
打印(prob['z'])
打印(“最小目标”)
打印(prob['obj'][0])
如您所见,此代码旨在使用OpenMDAO中包含的
SimpleGADriver
解决Sellar问题。当我以串行方式运行此代码时(
python3 solve\u sellar.py
),我会在一段时间后得到一个结果和以下输出:

Unable to import mpi4py. Parallel processing unavailable.
NL: NLBGSSolver 'NL: NLBGS' on system 'cycle' failed to converge in 10 iterations.
<string>:1: RuntimeWarning: overflow encountered in exp
NL: NLBGSSolver 'NL: NLBGS' on system 'cycle' failed to converge in 10 iterations.
minimum found at
0.0
[0. 0.]
minumum objective
0.7779677271254263
NL: NLBJSolver 'NL: NLBJ' on system 'cycle' failed to converge in 10 iterations.
[mpiexec@eb26233a2dd8] Sending Ctrl-C to processes as requested
[mpiexec@eb26233a2dd8] Press Ctrl-C again to force abort
然后一无所有。该命令挂起并阻止分配的处理器,但没有进一步的输出。最后,我使用CTRL-C终止该命令。在以下输出之后,该进程将继续挂起:

Unable to import mpi4py. Parallel processing unavailable.
NL: NLBGSSolver 'NL: NLBGS' on system 'cycle' failed to converge in 10 iterations.
<string>:1: RuntimeWarning: overflow encountered in exp
NL: NLBGSSolver 'NL: NLBGS' on system 'cycle' failed to converge in 10 iterations.
minimum found at
0.0
[0. 0.]
minumum objective
0.7779677271254263
NL: NLBJSolver 'NL: NLBJ' on system 'cycle' failed to converge in 10 iterations.
[mpiexec@eb26233a2dd8] Sending Ctrl-C to processes as requested
[mpiexec@eb26233a2dd8] Press Ctrl-C again to force abort
因此,我必须强制中止该过程:

Ctrl-C caught... cleaning up processes
[proxy:0:0@eb26233a2dd8] HYD_pmcd_pmip_control_cmd_cb (pm/pmiserv/pmip_cb.c:883): assert (!closed) failed
[proxy:0:0@eb26233a2dd8] HYDT_dmxu_poll_wait_for_event (tools/demux/demux_poll.c:77): callback returned error status
[proxy:0:0@eb26233a2dd8] main (pm/pmiserv/pmip.c:202): demux engine error waiting for event
[mpiexec@eb26233a2dd8] HYDT_bscu_wait_for_completion (tools/bootstrap/utils/bscu_wait.c:76): one of the processes terminated badly; aborting
[mpiexec@eb26233a2dd8] HYDT_bsci_wait_for_completion (tools/bootstrap/src/bsci_wait.c:23): launcher returned error waiting for completion
[mpiexec@eb26233a2dd8] HYD_pmci_wait_for_completion (pm/pmiserv/pmiserv_pmci.c:218): launcher returned error waiting for completion
[mpiexec@eb26233a2dd8] main (ui/mpich/mpiexec.c:340): process manager error waiting for completion
您应该能够在任何支持MPI的OpenMDAO工作环境中复制此文件,但我也制作了Dockerfile以确保环境的一致性:

FROM danieldv/hode:latest

RUN pip3 install --upgrade openmdao==2.9.0

ADD . /usr/src/app
WORKDIR /usr/src/app

CMD mpirun -np 16 python3 solve_sellar.py

有人对如何解决这个问题有什么建议吗?

谢谢您的报道。是的,这看起来像是我们在修复某些解算器上的MPI范数计算时引入的错误


此错误现已在提交C4369225F43E5613D5DD4238D1CDEA07D76ECC3时修复。您可以通过从OpenMDAO github repo中下载最新版本来访问修复程序,或者等到下一个版本(将是2.9.2)发布。

只是想让您知道您的bug有修复程序。再次感谢你的报告。听到这个消息太好了!谢谢