为什么使用 Dask 运行 Sklearn 机器学习不会产生并行性?

Jak*_*aur 5 python pandas scikit-learn joblib dask

我想在所有使用库的核心上执行库中Machine Learning的算法。SklearnDaskjoblib

我使用 Dask 编写的 joblib.parallel_backend 代码:

#Fire up the Joblib backend with Dask:
with joblib.parallel_backend('dask'):
    model_RFE = RFE(estimator = DecisionTreeClassifier(), n_features_to_select = 5)
    fit_RFE = model_RFE.fit(X_values,Y_values)
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我查看我的任务管理器时,我可以看到所有工作人员都在冷漠地无所事事,只有 1 个新的 Python 任务正在完成所有工作: 在此输入图像描述

即使在客户端上的 Dask 可视化中,我也看到工作人员什么也没做:

在此输入图像描述

  1. 你能告诉我我做错了什么吗?
  2. 是我的代码吗(下面的完整代码)?
  3. 我真的只是想并行运行机器学习以加快速度。如果我不需要使用joblib我会欢迎任何其他想法。

我的整个代码尝试遵循文档中的本教程

import pandas as pd

import dask.dataframe as df
from dask.distributed import Client

import sklearn
from sklearn.feature_selection import  RFE
from sklearn.tree import DecisionTreeClassifier

import joblib

#Create cluset on local PC
client = Client(n_workers = 4, threads_per_worker = 1, memory_limit = '4GB')
client

#Read data from .csv
dataframe_lazy = df.read_csv(path, engine = 'c', low_memory = False)
dataframe = dataframe_lazy.compute()

#Get my X and Y values and realse the original DF from memory
X_values = dataframe.drop(columns = ['Id', 'Target'])
Y_values = dataframe['Target']

del dataframe 

#Prepare data
X_values.fillna(0, inplace = True)

#Fire up the Joblib backend with Dask:
with joblib.parallel_backend('dask'):
    model_RFE = RFE(estimator = DecisionTreeClassifier(), n_features_to_select = 5)
    fit_RFE = model_RFE.fit(X_values,Y_values)
Run Code Online (Sandbox Code Playgroud)

rik*_*urr 11

Dask joblib 后端将无法并行化所有 scikit-learn 模型,只能并行化文档中指出的其中一些模型。这是因为许多 scikit-learn 模型由于算法实现或尚未添加并行支持而仅支持顺序训练。

Dask 只能并行化具有n_jobs参数的模型,这表明 scikit-learn 模型的编写方式支持并行训练。RFE并且DecisionTreeClassifier没有n_jobs参数。我写了这个要点,您可以运行它来获取支持并行训练的模型的完整列表