多处理池和 Lightgbm

Multiprocessing Pooling and Lightgbm

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

为了并行化,我将多处理池与 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

这实际上不是最初的任务,但我在那里做类似的事情。但是对于那个单一的任务大约需要一分钟,而 pool 2 进程永远不会在那里结束。 我在这里做错了什么吗?我在 jupyter notebook 上做这个,如果相关的话。

感谢任何帮助!谢谢!

找到原因了,是因为lgb的内线程和custom pooling冲突了。强制 lgb 不使用线程有帮助。

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

谢谢曼子, 干杯