Многопроцессорный пул и Lightgbm - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь обучать полностью независимые задачи, используя многопроцессорное объединение в python, которое lightgbm для обучения (я не уверен, актуально ли это для проблемы). Вот код

from sklearn.datasets import load_breast_cancer
import pandas as pd
from sklearn.model_selection import train_test_split, KFold
import lightgbm as lgb
import numpy as np

def functionToParallize(splitnumber=2):

    data = load_breast_cancer()
    X = pd.DataFrame(data.data, columns=data.feature_names)
    y = pd.Series(data.target)
    X_train, X_test, y_train, y_test = train_test_split(X, y)
    folds = KFold(splitnumber)
    results = lgb.cv({}, lgb.Dataset(X_train, y_train), folds=folds,metrics=['rmse'])
    return results

для распараллеливания. Я использую многопроцессорный пул, скажем, с двумя рабочими пулами. Но это действительно неэффективно, поскольку на выполнение sh задачи с двумя пулами требуется в 1000 раз больше времени, чем с одним. Например,

from multiprocessing import Pool 
import psutil
print(psutil.cpu_count())

вывод

4

starttime=time.time()
pool = Pool(2)
multiple_results = [pool.apply_async(functionToParallize) for i in [3]]
p=[res.get() for res in multiple_results]
print((time.time()-starttime)/60)

вывод

0.007067755858103434

, но с двумя пулами

starttime=time.time()
pool = Pool(2)
multiple_results = [pool.apply_async(functionToParallize) for i in [2,3]]
p=[res.get() for res in multiple_results]
print((time.time()-starttime)/60)

1.026989181836446

На самом деле это не исходная задача, но я делаю там нечто подобное. Но для этой единственной задачи требуется около минуты, и процесс пула 2 на этом никогда не заканчивается. Я что-то здесь делаю не так ?? Я делаю это на ноутбуке jupyter, если это актуально.

Любая помощь приветствуется! Спасибо!

1 Ответ

0 голосов
/ 05 мая 2020

Я нашел причину, потому что внутренняя потоковая передача lgb конфликтует с настраиваемым пулом. Помогает заставить lgb не использовать потоки.

results = lgb.cv({'num_threads':1}, lgb.Dataset(X_train, y_train), folds=folds,metrics=['rmse'])

Спасибо, Манзи, Ура

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...