Утечка памяти процессора mxnet при выполнении логического вывода на модели - PullRequest
0 голосов
/ 20 февраля 2019

Я сталкиваюсь с утечкой памяти при выполнении логического вывода на модели 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 (с 700 МБ до 10 ГБ +).

Проблема сохраняется с другими предварительно подготовленными моделями и с пользовательской моделью, которую я пытаюсь использовать.И использование сборщиков мусора не показывает никакого увеличения объектов.

Этот gist содержит полный фрагмент кода, включая пример imgbuf. * ​​1012 *

Информация о среде:

python 2.7.15

gcc4.2.1

mxnet-mkl 1.3.1

gluoncv 0.3.0

1 Ответ

0 голосов
/ 12 апреля 2019

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

...