python - 在 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 一起使用。
解决方案
推荐阅读
- macos - ld: 找不到 -lgstreamer-1.0 的库 clang: 错误: 链接器命令失败,退出代码为 1(使用 -v 查看调用)
- python - Selenium Python 中不再提供使用的 ID
- go - 如何确定哪个模块/s使用间接依赖?
- html - 悬停后菜单和子菜单之间的间隙
- css - Z-index 不适用于 Vue + Laravel 项目中的 vue-awesome-swiper
- android - 导航kotlin android中的平滑地图旋转
- kotlin - 检查列表中的枚举组合 (Kotlin)
- visual-studio-code - 为什么 Prettier 在 React 代码中添加了这些奇怪的字符串
- sql - Oracle 中不区分大小写的 where-in SQL 查询
- html - Nuxtjs/Vuejs 为 datetime-local 类型的输入字段设置默认日期时间为当前日期时间