Карта многопроцессорного пула: AttributeError: Невозможно выбрать локальный объект - PullRequest
3 голосов
/ 07 февраля 2020

У меня действительно очень похожая проблема с Python Карта пула многопроцессорной обработки: AttributeError: Невозможно выбрать локальный объект

Мне кажется, я понимаю, в чем проблема, я просто не уверен, как это исправить. «Pool.map» нуждается в функции верхнего уровня в качестве входных данных. Но я не знаю, как мне переписать эту проблему:

Упрощенная версия кода:

import os as os
from multiprocessing import Pool
import numpy as np
def opti_fun_data(prediction):
    def opti_fun(x):
        def error_fun(i):
            return error_fun_opti(x,prediction,i)
        try:
            pool = Pool(np.max([os.cpu_count()-1,1]))
            error = np.mean(pool.map(error_fun, range(M)))
        finally: # To make sure processes are closed in the end, even if errors happen
            pool.close()
            pool.join()
        return error
    return opti_fun

Если я запускаю opti_fun_data(prediction)(x0), я получаю

Can't pickle local object 'opti_fun_data.<locals>.opti_fun.<locals>.error_fun'

Я новичок в многопроцессорной библиотеке и могу использовать руку помощи. Для тех, кто интересуется небольшим опытом: я хочу минимизировать функцию «opti_fun» для множества различных сценариев / прогнозов. Вычисление моего показателя ошибки / эталона ("error_fun_opti") является достаточно интенсивным вычислительным процессом, поэтому я пытаюсь распараллелить этот шаг.

1 Ответ

2 голосов
/ 07 февраля 2020

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

def error_fun(x, prediction, i):
    return error_fun_opti(x, prediction, i)

error = np.mean(pool.map(functools.partial(error_fun, x, prediction), range(M)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...