Scikit-Learn 和 Joblib
Scikit-Learn 和 Joblib¶
许多 Scikit-Learn 算法使用 Joblib 编写以实现并行执行,Joblib 原生支持基于线程和基于进程的并行。在 Scikit-Learn 的常规使用中,n_jobs=
参数就是由 Joblib 提供支持的。
Dask 可以通过提供另一种 Joblib 后端,将这些 Joblib 支持的算法扩展到机器集群上。以下视频演示了如何使用 Dask 在集群中并行化网格搜索。
要使用 Dask Joblib 后端,您需要创建一个 Client,并使用 joblib.parallel_backend('dask')
包装您的代码。
from dask.distributed import Client
import joblib
client = Client(processes=False) # create local cluster
# client = Client("scheduler-address:8786") # or connect to remote cluster
with joblib.parallel_backend('dask'):
# Your scikit-learn code
例如,您可以通过以下方式分布式执行随机交叉验证参数搜索
import numpy as np
from dask.distributed import Client
import joblib
from sklearn.datasets import load_digits
from sklearn.model_selection import RandomizedSearchCV
from sklearn.svm import SVC
client = Client(processes=False) # create local cluster
digits = load_digits()
param_space = {
'C': np.logspace(-6, 6, 13),
'gamma': np.logspace(-8, 8, 17),
'tol': np.logspace(-4, -1, 4),
'class_weight': [None, 'balanced'],
}
model = SVC(kernel='rbf')
search = RandomizedSearchCV(model, param_space, cv=3, n_iter=50, verbose=10)
with joblib.parallel_backend('dask'):
search.fit(digits.data, digits.target)
请注意,Dask joblib 后端适用于扩展 CPU 密集型工作负载;即数据集可放入 RAM,但有许多可以并行执行的独立操作的工作负载。要扩展到 RAM 密集型工作负载(大于内存的数据集),请使用以下替代方案之一