Как исправить многопроцессорные проблемы в python в windows10 - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь использовать этот учебник для обучения своей модели распознавания моделей автомобилей: https://github.com/Helias/Car-Model-Recognition. И я хочу использовать Coda и производительность моего GPU для повышения скорости обучения (шаг предварительной обработки был выполнен без ошибок). Но когда я пытаюсь обучить свою модель, у меня появляются следующие ошибки:

######### ERROR #######

        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.


######### batch #######
Traceback (most recent call last):
  File "D:\Car-Model-Recognition\main.py", line 78, in train_model


######### ERROR #######
[Errno 32] Broken pipe
    for i, batch in enumerate(loaders[mode]):


######### batch #######  File "C:\Program Files\Python37\lib\site-packages\torch\utils\data\dataloader.py", line 279, in __iter__

    return _MultiProcessingDataLoaderIter(self)
Traceback (most recent call last):
  File "C:\Program Files\Python37\lib\site-packages\torch\utils\data\dataloader.py", line 719, in __init__
  File "main.py", line 78, in train_model
    w.start()
  File "C:\Program Files\Python37\lib\multiprocessing\process.py", line 112, in start
    for i, batch in enumerate(loaders[mode]):
  File "C:\Program Files\Python37\lib\site-packages\torch\utils\data\dataloader.py", line 279, in __iter__
    self._popen = self._Popen(self)
  File "C:\Program Files\Python37\lib\multiprocessing\context.py", line 223, in _Popen
    return _MultiProcessingDataLoaderIter(self)
  File "C:\Program Files\Python37\lib\site-packages\torch\utils\data\dataloader.py", line 719, in __init__
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Program Files\Python37\lib\multiprocessing\context.py", line 322, in _Popen
    w.start()
    return Popen(process_obj)
  File "C:\Program Files\Python37\lib\multiprocessing\popen_spawn_win32.py", line 46, in __init__
  File "C:\Program Files\Python37\lib\multiprocessing\process.py", line 112, in start
    prep_data = spawn.get_preparation_data(process_obj._name)
  File "C:\Program Files\Python37\lib\multiprocessing\spawn.py", line 143, in get_preparation_data
    self._popen = self._Popen(self)
  File "C:\Program Files\Python37\lib\multiprocessing\context.py", line 223, in _Popen
    _check_not_importing_main()
  File "C:\Program Files\Python37\lib\multiprocessing\spawn.py", line 136, in _check_not_importing_main
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Program Files\Python37\lib\multiprocessing\context.py", line 322, in _Popen
    is not going to be frozen to produce an executable.''')
RuntimeError:
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.
    return Popen(process_obj)

Я использовал точный код по данной ссылке, и если я запускаю свой код с помощью wsl, все в порядке, но я не могу использовать свой gpu из wsl. Где я должен вставить эту name == ' main ', чтобы предотвратить такую ​​ошибку или как я могу отключить эту многопроцессорную обработку

1 Ответ

3 голосов
/ 17 февраля 2020

Глядя на main.py, вы запускаете много кода на уровне модуля. В Windows, python модуль multiprocessing запустит новый интерпретатор python, импортирует ваши модули, откроет снимок вашего родительского контекста и затем вызовет вашу рабочую функцию. Проблема заключается в том, что весь этот код уровня модуля выполняется просто путем импорта, и вы, по сути, запускаете новую копию своей программы вместо создания контекста для своего работника.

Решение двоякое. Сначала переместите весь код уровня модуля в функции. Вы хотите иметь возможность импортировать свой модуль без побочных эффектов. Во-вторых, вызовите функцию (и), которая запускает вашу программу с условного

def main():
    the stuff you were doing a module level

if __name__ == "__main__":
    main()

Причина, по которой это работает, заключается в имени модуля. Когда вы запускаете скрипт верхнего уровня python (например, python main.py), это скрипт с именем "__main__", а не модуль. Если другая программа импортирует main, это модуль с именем "main" (или как вы назвали свой скрипт). Это «если» останавливает выполнение вашего основного кода, если он импортирован каким-либо другим python кодом, например, многопроцессорным модулем.

Хорошо иметь некоторый исполняемый код на уровне модуля, особенно если вы устанавливаете до значений по умолчанию и тому подобное. Но не делайте на уровне модуля ничего такого, чего не хотелось бы делать, если какой-то другой код импортирует ваш скрипт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...