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

Why running Sklearn machine learning with Dask doesn't result in parallelism?

我想使用 Daskjoblib 库在我的所有内核上执行 Sklearn 库中的 Machine Learning 算法。

我的 joblib.parallel_backend with Dask 代码:

#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)

不幸的是,当我查看我的任务管理器时,我可以看到我所有的工作人员都在放松,什么也不做,只有 1 个新的 Python 任务完成了所有工作:

即使在客户端的 Dask 可视化中,我也看到工作人员无所事事:

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

我的整个代码尝试遵循 this tutorial from docs:

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)

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

Dask 将只能并行化具有 n_jobs 参数的模型,这表明 scikit-learn 模型是以支持并行训练的方式编写的。 RFEDecisionTreeClassifier 没有 n_jobs 参数。我写道 this gist 你可以 运行 获得支持并行训练的模型的完整列表