Memory leaks 在模型上运行推断时mxnet cpu内存泄漏

Memory leaks 在模型上运行推断时mxnet cpu内存泄漏,memory-leaks,deep-learning,intel-mkl,mxnet,numpy-ndarray,Memory Leaks,Deep Learning,Intel Mkl,Mxnet,Numpy Ndarray,在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(

在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

环境信息:

python 2.7.15

通用条款4.2.1

mxnet mkl 1.3.1


gluoncv 0.3.0

MXNet正在运行一个异步引擎,以最大限度地提高操作的并行性和并行执行,这意味着对排队操作/复制数据的每次调用都会急切地返回,并且操作会在MXNet后端排队。通过按编写的方式运行循环,可以有效地提高操作排队速度

您可以添加一个显式的同步点,例如
.asnumpy()
.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异步执行的更多信息: