多进程池与Lightgbm

4

我正在尝试使用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

为了进行并行化处理,我使用多进程池(pool),比如说使用2个进程池工作。但是它非常低效,因为使用2个进程池完成任务所需的时间是只使用一个进程池的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笔记本上进行操作,如果相关的话,请问我做错了什么吗?

任何帮助都将不胜感激!谢谢!


不要陷入这么多麻烦之中,你可以通过使用num_threads来将CPU数量减半来解决问题。默认情况下,num_threads为-1,允许lgbm在所有核心上运行。 - em_bis_me
1个回答

2
我找到了原因,那是因为lgb的内部线程与自定义池发生了冲突。强制lgb不使用线程可以解决问题。
results = lgb.cv({'num_threads':1}, lgb.Dataset(X_train, y_train), folds=folds,metrics=['rmse'])

感谢Manzi,祝好。

另一个选择是在预测函数中直接设置num_threads参数。我还没有测试过,但我认为你在训练时想要使用所有线程。https://github.com/microsoft/LightGBM/issues/1534 - Caleb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接