【问题标题】:Python multiprocessing.Pool cannot pickle mxnet.mod.Module objectPython multiprocessing.Pool 无法腌制 mxnet.mod.Module 对象
【发布时间】:2023-03-23 07:35:01
【问题描述】:

这大概是我所做的:

import mxnet as mx
import cv2
from multiprocessing import Pool
from itertools import repeat

num_worker=4
CNNNet=[]
img = cv2.imread('../datasets/1.jpg')
sym, arg_params, aux_params = mx.model.load_checkpoint('det1', 0)
for i in range(num_worker):
    worker_net = mx.mod.Module(symbol=sym,label_names=None)
    worker_net.bind(data_shapes=[('data', (1, 3, 1000, 1000))],for_training=False)
    worker_net.set_params(arg_params,aux_params)
    CNNNet.append(worker_net)
pool = Pool(num_worker)
threshold = 0.6
res = pool.map(do_work_warpper,zip(repeat(img),CNNNet[:num_worker],repeat(threshold)))

do_work_warpper() 函数是:

def do_work_warpper(args):
    return do_work(*args)
def do_work(img,net,threshold):
    #do image predict job here
    return res

我对使用multiprocessing.Poolmx.mod.Module 对象时出现python3.6 中的错误的问题感到困惑:

TypeError: can't pickle module objects

或在python2.7中:

PicklingError: Can't pickle <type 'module'>: attribute lookup __builtin__.module failed

任何建议将不胜感激。

【问题讨论】:

    标签: python mxnet


    【解决方案1】:

    您收到此异常的原因是因为 multiprocessing 需要能够 pickle 您传递给工作人员的变量,以便在它产生的各种进程之间传递它们。

    错误:

    TypeError: can't pickle module objects
    

    建议您传递给Pool 的变量之一包含模块(或具有模块作为属性的类)。

    为了演示这个问题,看看这两个类:

    import os
    
    class Pickable: 
        a = 1
    
    class UnPickable:
        def __init__(self):
            self.mod = os
    

    如果你尝试腌制这两个类的实例,你会得到:

    In [11]: pickle.dumps(Pickable())
    Out[11]: b'\x80\x03c__main__\nPickable\nq\x00)\x81q\x01.'
    
    In [10]: pickle.dumps(UnPickable())
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-10-7d4d725a1c6d> in <module>()
    ----> 1 pickle.dumps(UnPickable())
    
    TypeError: can't pickle module objects
    

    话虽如此 - 要么您创建自己的类来模仿 mx.mod.Module 的功能,但可以序列化 - 或者(我认为更好的解决方案)使用简单的 python 内置类型将变量传递给您的 Pool 的工作人员并自行在其中构造mx.mod.Module 实例。

    【讨论】:

    • 有道理,我将 mx.mod.Module 更改为 python 列表,并在那里自己构建,它可以工作。谢谢!
    猜你喜欢
    • 2020-04-07
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 2013-08-18
    • 2019-03-12
    相关资源
    最近更新 更多