Я пытаюсь распараллелить загрузку данных и обучение в проекте pytorch. Из основного потока я создаю 2 потока, один загружает следующий пакет, а другой учится на текущем пакете. Загрузка потока передает загруженные данные через очередь.
Моя проблема заключается в следующем: программа внезапно останавливается при случайном состоянии выполнения без сообщения об ошибке (отладка выполнения или нет). Иногда в первую эпоху, иногда после 7 эпох (50 минут) ... Можно ли как-то получить сообщение об ошибке? Кто-нибудь сталкивался с этой проблемой?
Это заставляет меня задуматься об утечке памяти, но я проверяю весь код об общих данных. Я также видел вещи о том, что распечатки не являются потокобезопасными, поэтому я удалил их ... Обратите также внимание, что в коде не было этой проблемы до распараллеливания.
Я использую:
- conda environement.
- Threading.thread
- pytorch
- Windows сервер
Обновление : очевидно, код Pytorch, ссылающийся на изучение cuda, не любит, когда его вызывают из отдельного потока. Если я продолжу учить куда в главном потоке, он останется живым ...
Код : Так как у меня менее неожиданные сбои при обучении куда в главном потоке. Я держал только одну ветку. (это также имеет больше смысла)
часть основного:
dataQueue = queue.Queue()
dataAvailable = threading.Event()
doneComputing = threading.Event()
# Create new thread
loadThread = LoadingThread(1,dataQueue)
#learningThread.daemon = True
loadThread.daemon=True
# Add threads to thread list
threads = []
threads.append(loadThread)
print(" >> Parrallel process start")
# Start new Thread
loadThread.start()
doneComputing.set()
# Learning process
for i_import in range(import_init['n_import_train']):
# Wait for data loaded
dataAvailable.wait()
data = dataQueue.get()
dataAvailable.clear()
# DO learning
net,net_prev,y_all,yhat_all = doLearning(data, i_import, net, net_prev, y_all, yhat_all)
doneComputing.set()
# Wait for all threads to complete
for t in threads:
t.join()
Один интересный факт заключается в том, что кажется, что программа вылетает чаще, если модель, отправляемая в cuda, тяжелая. Тат может быть только проблемой cuda?