#openmdao
#openmdao
Вопрос:
Я думаю, что я обнаружил утечку памяти в OpenMDAO, которая возникает при сбросе проблемы и вычислении полных производных несколько раз. Вот способ воспроизвести это с помощью проблемы Селлара:
import openmdao.api as om
from openmdao.test_suite.components.sellar_feature import SellarMDA
# Setup of the Sellar poblem
prob = om.Problem()
prob.model = SellarMDA()
for i in range(10000):
# prob = om.Problem() ### adding these two lines solves the memory leak
# prob.model = SellarMDA()
prob.setup(check=False)
prob.model.cycle.linear_solver = om.DirectSolver()
prob.run_driver()
totals = prob.compute_totals("z", "x")
del totals
input()
Когда я запускаю этот скрипт, оперативная память заполняется и не освобождается до тех пор, пока работающий терминал не будет закрыт. Завершение работы скрипта не освобождает память и не удаляет totals
объект. Похоже, что утечка памяти происходит только при использовании compute_totals
с конечными разностями. Я обнаружил, что воссоздание проблемы (две строки с комментариями) вместо ее сброса предотвращает утечку.
Моя текущая версия OpenMDAO — 3.2.0, но мне удалось воспроизвести ее и на 3.3.0.
Я не уверен, делаю ли я что-то неправильно или это действительно ошибка, но мне интересно, есть ли у кого-нибудь объяснение. Утечки легко избежать, достаточно добавить две строки с комментариями, но я все равно потерял несколько дней вычислений из-за этого, и я подумал, что смогу задокументировать это для других.
Комментарии:
1. спасибо, что сократили вашу проблему до этого компактного тестового примера. Это очень полезно!
Ответ №1:
Я запустил ваш тестовый пример и смог воспроизвести ошибку памяти. Однако я обнаружил, что проблема осталась, даже если я переключился на полностью аналитические производные. Там определенно есть небольшая ошибка, но утечка памяти вызвана повторным вызовом prob.setup()
. Когда я переместил вызов setup из цикла for, проблема с памятью исчезла. Итак, что-то немного просачивается в setup, но также совсем не обязательно повторно вызывать setup более одного раза, если вы не меняете что-то в своей проблеме, которая меняет переменный размер или иным образом фактически требует этого.
Я предполагаю, что в вашем реальном сценарии запуска вам нужно вызывать setup более одного раза, и именно поэтому вы столкнулись с этой ошибкой. Я зарегистрировал ошибку в трекере проблем OpenMDAO на GitHub.
Комментарии:
1. Спасибо за ваш ответ. На самом деле, я вызываю
prob.setup()
цикл, потому что хочу убедиться, что проблема всегда начинается с одного и того же состояния, поскольку я хочу вычислить среднее число вызовов дисциплин для вычисления для разных входных значений. Я думал, что настройка — самый простой и безопасный способ сделать это.
Ответ №2:
Мы обнаружили утечку памяти, и она исправлена по состоянию на 24 ноября 2020 года с фиксацией e51b513. Вскоре он будет объединен и появится в следующем выпуске OpenMDAO.