Я пытаюсь решить проблемы оптимизации, используя алгоритмы без градиента (такие как простой генетический алгоритм) в OpemMDAO, используя оценку параллельных функций с MPI. Когда у моей проблемы нет циклов, я не сталкиваюсь ни с какими проблемами. Однако, как только мне придется использовать нелинейный решатель для сходимости цикла, процесс будет зависать бесконечно после того, как один из рядов 'nl_solver завершит свою работу.
Вот пример кода (solve_sellar.py):
import openmdao.api as om
from openmdao.test_suite.components.sellar_feature import SellarMDA
from openmdao.utils.mpi import MPI
if not MPI:
rank = 0
else:
rank = MPI.COMM_WORLD.rank
if __name__ == "__main__":
prob = om.Problem()
prob.model = SellarMDA()
prob.model.add_design_var('x', lower=0, upper=10)
prob.model.add_design_var('z', lower=0, upper=10)
prob.model.add_objective('obj')
prob.model.add_constraint('con1', upper=0)
prob.model.add_constraint('con2', upper=0)
prob.driver = om.SimpleGADriver(run_parallel=(MPI is not None), bits={"x": 32, "z": 32})
prob.setup()
prob.set_solver_print(level=0)
prob.run_driver()
if rank == 0:
print('minimum found at')
print(prob['x'][0])
print(prob['z'])
print('minumum objective')
print(prob['obj'][0])
Как видите, этот код предназначен для решения проблемы Селлара с использованием SimpleGADriver
, включенного в OpenMDAO. Когда я просто запускаю этот код последовательно (python3 solve_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
Если я вместо этого запускаю это с MPI (mpirun -np 16 python3 solve_sellar.py
), я получаю следующеевывод:
NL: NLBJSolver 'NL: NLBJ' on system 'cycle' failed to converge in 10 iterations.
А тут еще много всего. Команда зависает и блокирует назначенные процессоры, но больше не выводит. В конце концов я убиваю команду с помощью CTRL-C. Затем процесс продолжает зависать после следующего вывода:
[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
У кого-нибудь есть предложения, как решить эту проблему?