首页 > 解决方案 > 在模型上运行推理时 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

标签: memory-leaksdeep-learningintel-mklmxnetnumpy-ndarray

解决方案


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


推荐阅读