memory-leaks - 在模型上运行推理时 mxnet cpu 内存泄漏
问题描述
在对 mxnet 模型执行推理时(即将图像缓冲区转换为张量并通过模型运行一次前向传递),我遇到了内存泄漏。
一个最小的可重现示例如下:
import mxnet
from gluoncv import model_zoo
from gluoncv.data.transforms.presets import ssd
model = model_zoo.get_model('ssd_512_resnet50_v1_coco')
model.initialize()
for _ in range(100000):
# note: an example imgbuf string is too long to post
# see gist or use requests etc to obtain
imgbuf =
ndarray = mxnet.image.imdecode(imgbuf, to_rgb=1)
tensor, orig = ssd.transform_test(ndarray, 512)
labels, confidences, bboxs = model.forward(tensor)
结果是 RSS 内存线性增加(从 700MB 增加到 10GB+)。
其他预训练模型和我尝试使用的自定义模型仍然存在此问题。并且使用垃圾收集器并没有显示对象的任何增加。
这个要点有完整的代码片段,包括一个示例 imgbuf。
环境信息:
蟒蛇2.7.15
GCC 4.2.1
mxnet-mkl 1.3.1
gluoncv 0.3.0
解决方案
MXNet 正在运行一个异步引擎,以最大限度地提高算子的并行性和并行执行,这意味着每次对入队操作/复制数据的调用都会急切地返回,并且操作会在 MXNet 后端入队。通过在编写循环时有效地运行循环,您将操作排入队列的速度比处理它们的速度快。
您可以添加显式同步点,例如.asnumpy()
or.mx.nd.waitall()
或.wait_to_read()
,这样 MXNet 将在继续执行 python 之前等待入队操作完成。
这将解决您的问题:
import mxnet
from gluoncv import model_zoo
from gluoncv.data.transforms.presets import ssd
model = model_zoo.get_model('ssd_512_resnet50_v1_coco')
model.initialize()
for _ in range(100000):
# note: an example imgbuf string is too long to post
# see gist or use requests etc to obtain
imgbuf =
ndarray = mxnet.image.imdecode(imgbuf, to_rgb=1)
tensor, orig = ssd.transform_test(ndarray, 512)
labels, confidences, bboxs = model.forward(tensor)
mx.nd.waitall()
在此处阅读有关 MXNet 异步执行的更多信息:http: //d2l.ai/chapter_computational-performance/async-computation.html
推荐阅读
- excel - 如何按颜色对表格列进行排序?
- html - 如何在表格边界内对齐文本输入元素?
- python - 枚举 Pandas 数据框后,字典条目都相同
- python - Django & Celery - 跨多个方法和文件发送信号
- typescript - Firebase 数据库出现意外令牌错误
- c# - Microsoft.EntityFrameworkCore ProjectTo() 找不到我的存储库的方法定义
- python - Python - Beautifulsoup - 从列表中传递单个 url 以被抓取
- javascript - javascript table标签粉碎jquery next函数
- javascript - 相同 div 中的事件委托
- mysql - 在 node.js 上使用合并和续集