Утечка памяти при запуске логического процессора mxnet - PullRequest
0 голосов
/ 12 октября 2019

Я протестировал 100 изображений, и анализ memory_profiler приведен ниже. Почему строка 308 вызывает большой рост памяти?

mxnet == 1.5.1

Line #    Mem usage    Increment   Line Contents
================================================
   297 8693.719 MiB   81.809 MiB           data = nd.array(im_tensor)
   298 8693.719 MiB    0.000 MiB           db = mx.io.DataBatch(data=(data,), provide_data=[('data', data.shape)])
   299 8630.039 MiB    2.840 MiB           self.model.forward(db, is_train=False)
   300 8630.039 MiB    2.320 MiB           net_out = self.model.get_outputs()
   301 8693.719 MiB    2.062 MiB           for _idx,s in enumerate(self._feat_stride_fpn):
   302 8693.719 MiB    2.062 MiB               _key = 'stride%s'%s
   303 8693.719 MiB    1.031 MiB               stride = int(s)
   304 8693.719 MiB    1.031 MiB               if self.use_landmarks:
   305 8693.719 MiB    1.031 MiB                 idx = _idx*3
   306                                         else:
   307                                           idx = _idx*2
   308 8693.719 MiB 4700.676 MiB               scores = net_out[idx].asnumpy()
   309 8693.719 MiB    1.289 MiB               print scores.shape
   310 8693.719 MiB    1.031 MiB               scores = scores[:, self._num_anchors['stride%s'%s]:, :, :]
   311 8693.719 MiB    1.031 MiB               idx+=1
   312 8693.719 MiB    2.836 MiB               bbox_deltas = net_out[idx].asnumpy()
   ...

1 Ответ

0 голосов
/ 14 октября 2019

Вызовы MXNet Python API на самом деле просто ставятся в очередь в бэкэнд-движке MXNet и обрабатываются асинхронно в C ++. Так что то, что вы видите в этом профайлере Python, может не отражать то, что на самом деле происходит под капотом. Для профилирования я рекомендую вам взглянуть на специальные инструменты: https://mxnet.apache.org/api/python/docs/tutorials/performance/backend/profiler.html

Я подозреваю, что ваш .asnumpy() вызов связан с высоким использованием памяти, потому что это блокирующий вызов: он требует немедленной доступности результатов и, следовательно, вызываетМеханизм mxnet для немедленного расчета необходимых зависимостей. Обычно рекомендуется избегать использования Numpy в коде MXNet и использовать вместо него MXNet NDArray, что больше подходит для глубокого обучения (асинхронный, совместимый с GPU, поддержка автоматической дифференциации), чемNumpy. Например, вы можете накапливать любую информацию, которая вам нужна, в MXNet NDArray, а затем делать с ней все, что вам нужно в конце выполнения (сохранить в файл, преобразовать в Numpy и т. Д.). Дополнительные ресурсы:

...