【问题标题】:mxnet cpu memory leak when running inference on model在模型上运行推理时 mxnet cpu 内存泄漏
【发布时间】:2019-02-20 07:22:55
【问题描述】:

在对 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 有完整的代码sn-p,包括一个例子imgbuf。

环境信息:

python 2.7.15

gcc 4.2.1

mxnet-mkl 1.3.1

gluoncv 0.3.0

【问题讨论】:

    标签: memory-leaks deep-learning intel-mkl mxnet numpy-ndarray


    【解决方案1】:

    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 异步执行的更多信息:http://d2l.ai/chapter_computational-performance/async-computation.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 2021-12-01
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多