Python многопоточный сбой программы без ошибок - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь распараллелить загрузку данных и обучение в проекте 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?

...