compute_totals和有限差可能存在内存泄漏



我想我在OpenMDAO中发现了内存泄漏,当重置问题并多次计算总导数时就会发生这种情况。这里有一种方法来重现Sellar问题:

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()

当我启动这个脚本时,RAM会被填满,直到运行的终端关闭后才会释放。终止脚本不会释放内存,也不会删除totals对象。内存泄漏似乎只有在使用具有有限差的compute_totals时才会发生。我发现重新创建问题(两行注释(而不是仅重置它可以防止泄漏。

我目前的OpenMDAO版本是3.2.0,但我也设法在3.3.0上复制了它。

我不确定我是做错了什么,还是真的是一个bug,但如果有人能解释,我很感兴趣。避免泄漏很容易,添加两行注释就足够了,但我还是因此损失了几天的计算时间,我想我可以为其他人记录它。

我运行了您的测试用例,并能够重现内存错误。然而,我发现问题仍然存在,即使我转向完全解析导数。这里肯定有一个小错误,但内存泄漏是由对prob.setup()的重复调用触发的。当我将设置调用移出for循环时,内存问题就消失了。因此,在设置中有些东西有点泄漏,但也根本不需要多次重新调用设置,除非你正在更改问题中交换可变大小的东西或实际需要它。

我假设在实际运行脚本中,您确实需要多次调用setup,这就是您遇到此错误的原因。我已经在GitHub上的OpenMDAO问题跟踪器中记录了这个错误。

我们发现了内存泄漏,截至2020年11月24日,已通过提交e51b513修复。它将很快被合并,并将出现在下一个OpenMDAO版本中。

最新更新