如下代码所示,使用torch.multiprocessing启动多进程,并传递了model和image_processor两个对象作为参数。
from torch.multiprocessing import Process, Queue, Manager
...
p3 = Process(target=frame_memory_manager,
args=(model, image_processor, frame_queue, log_queue))
processes.append(p3)
p3.start()
运行后报错"Can’t pickle local object",
AttributeError: Can't pickle local object 'add_hook_to_module.<locals>.new_forward'
解决办法是在创建进程前调用:
multiprocessing.set_start_method('fork', force=True)
如果是第一次调用set_start_method
,可以去掉force=True
。
本文只负责解决直接问题,假如这样改后导致了新的error,就需要重新检查。比如CUDA模型需要spawn模式才能传递模型参数。