Оптимизация зависает при использовании нелинейного солвера при работе под MPI - PullRequest
1 голос
/ 08 октября 2019

Я пытаюсь решить проблемы оптимизации, используя алгоритмы без градиента (такие как простой генетический алгоритм) в 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

У кого-нибудь есть предложения, как решить эту проблему?

1 Ответ

1 голос
/ 08 октября 2019

Спасибо, что сообщили об этом. Да, это похоже на ошибку, которую мы ввели, когда исправили вычисление нормы MPI для некоторых решателей.

Эта ошибка была исправлена ​​с момента фиксации c4369225f43e56133d5dd4238d1cdea07d76ecc3. Вы можете получить доступ к исправлению, вытащив последнюю версию репозитория OpenMDAO github или подождать до следующей версии (которая будет 2.9.2).

...