我有一个包含 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
or HyperBandSearchCV
。
那么它是如何工作的呢?我应该如何并行化这段代码?我不清楚如何使它工作,特别是如果我使用类似的sklearn
估计器GridSearchCV
或ColumnTransformer
使用哪个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
任何帮助如何解决这个问题将不胜感激。谢谢