0

我有一个包含 100000 个样本的数据集。

我需要将此数据集拆分为 100 个子集,并为每个子集训练一个 ML 模型。由于经过训练的模型是独立的,因此很容易将这部分并行化,例如

from dask import compute, delayed
from sklearn.linear_model import Lasso

X, y = load_data()
n_windows = 100
model = Lasso()

results = []
for i in range(0, len(X), n_windows):
    results.append(delayed(model.fit)(X, y))
    
results = compute(results)

但是假设模型本身需要产生进程,例如,如果模型是一个包含交叉验证的管道,例如GridSearchCVor HyperBandSearchCV

那么它是如何工作的呢?我应该如何并行化这段代码?我不清楚如何使它工作,特别是如果我使用类似的sklearn估计器GridSearchCVColumnTransformer使用哪个joblib而不是dask并行化计算。

事实上,取决于我是否使用 aClient或不这样:

from dask.distributed import Client
client = Client()

并且根据这个实例化client是在主脚本中创建还是从不同的模块导入,我会收到警告或错误。

在第一种情况下,代码已成功执行,但我收到一条警告:

Multiprocessing-backed parallel loops cannot be nested, setting n_jobs=1

在第二种情况下,代码永远不会完成,解释器堆栈和我得到这个错误:

daemonic processes are not allowed to have children

任何帮助如何解决这个问题将不胜感激。谢谢

4

1 回答 1

0

看看Dask ML,它有很多你需要的东西。

于 2020-10-05T18:09:06.917 回答