在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 +)。
该问题在其他经过预先训练的模型以及我尝试使用的自定义模型中仍然存在。使用垃圾收集器不会显示任何对象增加。
此gist具有完整的代码段,其中包括imgbuf示例。
环境信息:
python 2.7.15
gcc 4.2.1
mxnet-mkl 1.3.1
gluoncv 0.3.0
答案 0 :(得分:1)
MXNet正在运行一个异步引擎,以最大程度地提高操作员的并行性和并行执行能力,这意味着对排队操作/复制数据的每次调用都急切返回,并且该操作在MXNet后端排队。通过有效地运行编写的循环,可以使操作入队的速度比处理它们的速度快。
您可以添加一个显式同步点,例如.asnumpy()
或.mx.nd.waitall()
或.wait_to_read()
,这样MXNet将在继续执行python之前等待排队的操作完成。 / p>
这将解决您的问题:
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