【发布时间】:2020-10-04 14:50:26
【问题描述】:
我有一个包含 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)
但是假设模型本身需要产生进程,例如,如果模型是一个包含交叉验证的管道,例如 GridSearchCV 或 HyperBandSearchCV。
那么它是如何工作的呢?
我应该如何并行化这段代码?
我不清楚如何使它工作,特别是如果我使用 sklearn 估计器,例如 GridSearchCV 或 ColumnTransformer,它们使用 joblib 而不是 dask 来并行化计算。
实际上,取决于我是否使用Client 或不这样:
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
任何帮助如何解决这个问题将不胜感激。 谢谢
【问题讨论】:
标签: python multiprocessing dask dask-distributed dask-ml