Python multiprocessing.Pool не может выбрать объект mxnet.mod.Module - PullRequest
0 голосов
/ 15 мая 2018

вот примерно то, что я сделал:

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.Pool сmx.mod.Module объект, я получаю ошибку в python3.6:

TypeError: can't pickle module objects

или в python2.7:

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

любое предложение будет оценено.

1 Ответ

0 голосов
/ 15 мая 2018

Причина, по которой вы получаете это исключение, заключается в том, что multiprocessing должен иметь возможность выбирать переменных, которые вы передаете своим работникам, чтобы передавать их между различными процессами, которые он порождает.

Ошибка:

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 экземпляры внутри них сами по себе.

...