为什么 运行 使用 Dask 的 Sklearn 机器学习不会产生并行性?
Why running Sklearn machine learning with Dask doesn't result in parallelism?
我想使用 Dask
和 joblib
库在我的所有内核上执行 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 可视化中,我也看到工作人员无所事事:
- 你能告诉我我做错了什么吗?
- 是我的代码吗(下面的完整代码)?
- 我真的只想 运行 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 模型是以支持并行训练的方式编写的。 RFE
和 DecisionTreeClassifier
没有 n_jobs
参数。我写道 this gist 你可以 运行 获得支持并行训练的模型的完整列表
我想使用 Dask
和 joblib
库在我的所有内核上执行 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 可视化中,我也看到工作人员无所事事:
- 你能告诉我我做错了什么吗?
- 是我的代码吗(下面的完整代码)?
- 我真的只想 运行 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 模型是以支持并行训练的方式编写的。 RFE
和 DecisionTreeClassifier
没有 n_jobs
参数。我写道 this gist 你可以 运行 获得支持并行训练的模型的完整列表