首页 > 解决方案 > 在 Web 应用程序上运行经过训练的神经网络模型后释放内存

问题描述

我正在使用预先训练的网络运行一个演示 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 一起使用。

标签: pythonflaskwsgitorchvision

解决方案


推荐阅读