Scikit-Learn & Joblib

Scikit-Learn & Joblib

许多 Scikit-Learn 算法使用 Joblib 编写,以实现并行执行,Joblib 原生支持基于线程和基于进程的并行性。Joblib 是支持 Scikit-Learn 常规使用中 n_jobs= 参数的后端。

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 密集型工作负载非常有用;适用于数据集适合内存,但有许多可以并行执行的独立操作的工作负载。要扩展到内存密集型工作负载(大于内存的数据集),请使用以下替代方案之一:

  • 并行元估计器

  • 超参数.增量

  • 或来自 API 参考 的估计器之一