Свободная память после запуска обученной модели нейронной сети в веб-приложении - PullRequest
0 голосов
/ 28 января 2020

Я запускаю демонстрационное веб-приложение, используя предварительно обученную сеть. У меня проблема в том, что для каждого изображения, которое я тестирую по сети, память сильно увеличивается и никогда не освобождается, поэтому мне нужно перезапустить веб-сервер, чтобы освободить память от старых объектов, которые я больше не использую. Это сеть, которую я запускаю:

from torchvision import models

fcn = models.segmentation.fcn_resnet101(pretrained=True).eval()

И это код, в котором накоплена наиболее значительная часть памяти:

out = net(inp)['out']

Где net - это псевдоним (параметр функции) для fcn и inp - это ввод изображений, преобразованный в соответствующую форму для использования сетевой моделью.

Работает на apache веб-сервере с использованием flask и wsgi. У меня много кода, поэтому я ставлю только самое важное. Я не знаю, как решить проблему, и поэтому, если какой-то дополнительный фрагмент кода важен для показа здесь, я не знаю, какой именно.

Я провел некоторое исследование и нашел несколько «быстрых» решений (некоторые здесь на SO), но они не очень помогли. Это то, что я пытался, например. Я разделил результат вызова модели и присвоил его явной переменной, затем использовал очиститель мусора:

mr = net(inp)
out = mr['out']

, а затем

del net
del mr
gc.collect()

Это не помогло. Я предполагаю, что живущие объекты создаются под кодом внешней модели, и я ожидаю увидеть какое-то решение для освобождения памяти из этих объектов с использованием nn функций модели, но не уверен, что я нахожусь в правильном направлении.

Также я считаю какой-то «стандартный» способ сделать это в python, например, создать отдельный поток или что-то подобное, чтобы лучше контролировать память. Я здесь не эксперт, поэтому буду благодарен за хороший совет. И он должен работать с apache, flask и wsgi_mod.

...