почему модель cuda не может быть инициализирована с помощью метода __init__ в классе, который наследует multiprocessing.process? - PullRequest
0 голосов
/ 06 апреля 2020

Вот мой код:

from MyDetector import Helmet_Detector
from multiprocessing import Process

class Processor(Process):
    def __init__(self):
        super().__init__()
        self.helmet_detector = Helmet_Detector()

    def run(self):
         print(111)


    if __name__ == '__main__':
         p=Processor()
         p.start()

Как видите, класс 'Processor' наследует multiprocessing.Process, а Helmet_Detector - модель YOLO, использующая cuda. Но когда я запустил его, ошибка произошла следующим образом:

THCudaCheck FAIL file=C:\w\1\s\tmp_conda_3.7_075911\conda\conda-bld\pytorch_1579075223148\work\torch/csrc/generic/StorageSharing.cpp line=245 error=71 : operation not supported
Traceback (most recent call last):
  File "E:/python-tasks/WHU-CSTECH/Processor.py", line 17, in <module>
    p.start()
  File "C:\Anaconda\lib\multiprocessing\process.py", line 112, in start
    self._popen = self._Popen(self)
  File "C:\Anaconda\lib\multiprocessing\context.py", line 223, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Anaconda\lib\multiprocessing\context.py", line 322, in _Popen
    return Popen(process_obj)
  File "C:\Anaconda\lib\multiprocessing\popen_spawn_win32.py", line 89, in __init__
    reduction.dump(process_obj, to_child)
  File "C:\Anaconda\lib\multiprocessing\reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
  File "C:\Anaconda\lib\site-packages\torch\multiprocessing\reductions.py", line 242, in reduce_tensor
    event_sync_required) = storage._share_cuda_()
RuntimeError: cuda runtime error (71) : operation not supported at C:\w\1\s\tmp_conda_3.7_075911\conda\conda-bld\pytorch_1579075223148\work\torch/csrc/generic/StorageSharing.cpp:245

, затем я попытался инициализировать Helmet_Detector в методе запуска:

def run(self):
     print(111)
     self.helmet_detector = Helmet_Detector()

Ошибка не возникла. Может ли кто-нибудь сказать мне причину этого и как я могу решить эту проблему? Спасибо!

1 Ответ

1 голос
/ 06 апреля 2020

Ошибка возникает из-за того, что в python многопроцессорная обработка требует, чтобы объекты класса процесса могли быть перехвачены, чтобы данные могли быть переданы в создаваемый процесс, то есть сериализацию и десериализацию объекта. Предложение, чтобы решить эту проблему, ленивый экземпляр объекта Helmet_Detector (подсказка: попробуйте свойство в python).

Редактировать:

Согласно комментарию @jodag, вы должны использовать Pytorch's многопроцессорная библиотека вместо стандартной многопроцессорной библиотеки

Пример:

import torch.multiprocessing as mp

class Processor(mp.Process):
.
.
.
...