我正在使用预先训练的网络运行一个演示 Web 应用程序。我遇到的问题是,对于我在网络上测试的每个图像,内存都会增加很多并且从未释放过,所以我必须重新启动 Web 服务器才能从不再使用的旧对象中释放内存。这是我运行的网络:
from torchvision import models
fcn = models.segmentation.fcn_resnet101(pretrained=True).eval()
这是内存中最重要部分积累的代码:
out = net(inp)['out']
哪里net
是别名(函数参数),fcn
并且inp
是图像输入转换为适当的形式以供网络模型使用。
这适用于使用烧瓶和 wsgi 的 apache Web 服务器。我有很多代码,所以我只放最重要的。我不知道如何解决这个问题,因此如果在此处显示一些额外的代码很重要,我不知道是哪一个。
我做了一些研究并找到了一些“快速”的解决方案(有些在 SO 上),但它们并没有太大帮助。例如,这就是我尝试过的。我分离模型调用结果并将其分配给显式变量,然后使用垃圾清理器:
mr = net(inp)
out = mr['out']
接着
del net
del mr
gc.collect()
它没有帮助。我假设驻留对象是在外部模型代码下创建的,我希望看到一些解决方案来使用 nn 模型函数从这些对象中释放内存,但不确定我的方向是否正确。
我还考虑在 python 中使用一些“标准”方法,例如创建单独的线程或类似的方法来更好地控制内存。我不是这里的专家,因此将不胜感激。它还必须与 apache、flask 和 wsgi_mod 一起使用。