我正在尝试使用Python的多进程池来训练完全独立的任务,并使用Lightgbm进行训练(我不确定这是否与问题相关)。以下是代码
from sklearn.datasets import load_breast_cancerimport pandas as pdfrom sklearn.model_selection import train_test_split, KFoldimport lightgbm as lgbimport numpy as npdef 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 psutilprint(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笔记本上进行的操作,如果这有关系的话。
任何帮助都将不胜感激!谢谢!
回答:
我找到了原因,是因为lgb的内部线程与自定义池冲突。强制lgb不使用线程有助于解决问题。
results = lgb.cv({'num_threads':1}, lgb.Dataset(X_train, y_train), folds=folds,metrics=['rmse'])
谢谢Manzi,干杯