繁体   English   中英

为什么cuda model不能在继承multiprocessing.process的class中的__init__方法下初始化?

[英]why cannot cuda model be initialized under the __init__ method in a class that inherits multiprocessing.process?

这是我的代码:

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()

如您所见,class 'Processor' 继承了 multiprocessing.Process,而 Helmet_Detector 是使用 cuda 的 YOLO model。 但是当我运行它时,错误发生如下:

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()

没有发生错误。 谁能告诉我这个问题的原因,我该如何解决这个问题? 谢谢!

发生错误是因为在 python 中,多处理要求进程 class 对象是可挑选的,以便可以将数据传输到正在创建的进程,即 object 的序列化和反序列化。 建议解决这个问题,惰性实例化 Helmet_Detector object(提示:在 python 中尝试属性)。

编辑:

根据@jodag 的评论,您应该使用 pytorch 的多处理库而不是标准的多处理库

例子:

import torch.multiprocessing as mp

class Processor(mp.Process):
.
.
.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM