Многопроцессорная обработка с использованием чанков не работает сprent_proba - PullRequest
0 голосов
/ 21 февраля 2019

Когда я запускаю predict_proba на фрейме данных без многопроцессорной обработки, я получаю ожидаемое поведение.Код выглядит следующим образом:

probabilities_data = classname.perform_model_prob_predictions_nc(prediction_model, vectorized_data)

где: perform_model_prob_predictions_nc равно:

def perform_model_prob_predictions_nc(model, dataFrame): 
    try:
        return model.predict_proba(dataFrame)
    except AttributeError:
        logging.error("AttributeError occurred",exc_info=True)

Но когда я пытаюсь запустить ту же функцию, используя чанки и многопроцессорную обработку:

probabilities_data = classname.perform_model_prob_predictions(prediction_model, chunks, cores)

где perform_model_prob_predictions:

def perform_model_prob_predictions(model, dataFrame, cores=4): 
    try:
        with Pool(processes=cores) as pool:
            result = pool.map(model.predict_proba, dataFrame)
            return result
    except Exception:
        logging.error("Error occurred", exc_info=True)

Я получаю следующую ошибку:

PicklingError: Can't pickle <function OneVsRestClassifier.predict_proba at 0x14b1d9730>: it's not the same object as sklearn.multiclass.OneVsRestClassifier.predict_proba

В качестве ссылки:

cores = 4
vectorized_data = pd.DataFrame(...)
chunk_size = len(vectorized_data) // cores + cores
chunks = [df_chunk for g, df_chunk in vectorized_data.groupby(np.arange(len(vectorized_data)) // chunk_size)]

1 Ответ

0 голосов
/ 22 февраля 2019

Pool внутренне использует Очередь, и все, что идет туда, должно быть протравлено.Ошибка говорит вам, что PicklingError: Can't pickle <function OneVsRestClassifier.predict_proba не может быть засолен.

У вас есть несколько вариантов, некоторые описаны в этом SO сообщении .Другой вариант - использовать joblib с loky backend.Последний использует cloudpickle , который позволяет сериализовать конструкции, не поддерживаемые pickle по умолчанию.

Код будет выглядеть более или менее так:

from joblib import Parallel, delayed

Parallel(n_jobs=4, backend='loky')(delayed(model.predict_proba)(dataFrame=dataFrame) for chunk in chunks)

Mind the classicтравить такие методы на объектах - вообще не очень хорошая идея. укроп может хорошо сработать.

...