Возможная утечка памяти с помощью compute_totals и конечных разностей

#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.