Python PyTorch, выполняющийся в нескольких потоках, исчерпывает память и уничтожается операционной системой

#python #linux #pytorch #python-multithreading #nvidia-jetson

#python #linux #pytorch #python-многопоточность #nvidia-jetson

Вопрос:

Я пытаюсь выполнить переобученный PyTorch FasterRCNN в нескольких потоках на Nvidia Jetson Xavier.

Основные потоки добавляют путь к изображению в очередь. Четыре рабочих потока выполняют следующие действия:

  • загрузка изображения с помощью PIL img = Image.open(imgPath)
  • преобразуйте его в тензор с помощью img = to_tensor(img) from tourchvision.transforms
  • поместите его в GPU img = img.to(device)
  • запустите сеть RCNN pred = model([img])
  • сохраните результаты в обычном списке resultList.append(pred)
  • удалите переменную, содержащую изображение с помощью del img

Тем не менее, у процесса заканчивается память примерно после 10.000 изображений и он уничтожается операционной системой.

Я попытался выполнить следующие шаги после 1000 изображений:

  • остановить все потоки
  • выполните сборку мусора с помощью gc.collect()
  • очистите память графического процессора с помощью torch.cuda.empty_cache()
  • перезапуск потоков

Однако, как и ожидалось, это не решает проблему.

Я знаю, что в PyTorch есть загрузчик данных для многопоточности. Поскольку я использую RCNN в более крупном проекте, я попробовал его без загрузчика данных в задаче выполнения.

Я почти уверен, что нет списка, в котором хранятся изображения, так как тогда память будет заканчиваться быстрее. Результаты сети — это просто ограничительные рамки. Следовательно, они также не должны потреблять так много памяти. Кроме того, потребление памяти не растет медленно, вместо этого оно иногда увеличивается примерно на 1 ГБ.

Я надеюсь, что у кого-то есть идея для решения проблемы или как лучше отлаживать.

Спасибо, Питер

Комментарии:

1. Можете ли вы добавить свой код? Возможно, какая-то переменная, содержащая большой объем данных, не выходит за пределы области видимости, и поэтому Python не может освободить память.

2. Спасибо за ваш реплей. Я должен написать сопоставимый пример, поскольку код встроен и его трудно прочитать. Однако, прежде чем я использовал многопоточность, код смог без проблем обработать более 30.000 изображений.

3. Глупое предложение — google.com/search ? q= python threading memory leak Проверяет некоторые из этих ответов StackOverflow. Один из них может решить вашу проблему. Без просмотра кода трудно устранить неполадки.

4. В конце концов я действительно обнаружил некоторую регулярную утечку памяти, из-за чего иногда изображения не выпускаются.