#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)
fromtourchvision.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. В конце концов я действительно обнаружил некоторую регулярную утечку памяти, из-за чего иногда изображения не выпускаются.