分布式 Scikit-learn / Joblib#

Ray 支持通过为 joblib 实现一个 Ray 后端来运行分布式 scikit-learn 程序,该后端使用 Ray Actors 而不是本地进程。这使得将使用 scikit-learn 的现有应用程序从单个节点扩展到集群变得容易。

备注

此API是新的,可能在未来的Ray版本中进行修订。如果您遇到任何错误,请在GitHub上提交`问题`_。

快速入门#

要开始使用,首先 安装 Ray,然后使用 from ray.util.joblib import register_ray 并运行 register_ray()。这将注册 Ray 作为 scikit-learn 使用的 joblib 后端。然后在 with joblib.parallel_backend('ray') 内部运行您的原始 scikit-learn 代码。这将启动一个本地 Ray 集群。有关在多节点 Ray 集群上运行的说明,请参阅下面的 在集群上运行 部分。

import numpy as np
from sklearn.datasets import load_digits
from sklearn.model_selection import RandomizedSearchCV
from sklearn.svm import SVC
digits = load_digits()
param_space = {
    'C': np.logspace(-6, 6, 30),
    'gamma': np.logspace(-8, 8, 30),
    'tol': np.logspace(-4, -1, 30),
    'class_weight': [None, 'balanced'],
}
model = SVC(kernel='rbf')
search = RandomizedSearchCV(model, param_space, cv=5, n_iter=300, verbose=10)

import joblib
from ray.util.joblib import register_ray
register_ray()
with joblib.parallel_backend('ray'):
    search.fit(digits.data, digits.target)

你也可以在 parallel_backend 中设置 ray_remote_args 参数来 配置构成池的 Ray Actors 。这可以用来例如 为 Actors 分配资源,如 GPU

# Allows to use GPU-enabled estimators, such as cuML
with joblib.parallel_backend('ray', ray_remote_args=dict(num_gpus=1)):
    search.fit(digits.data, digits.target)

在集群上运行#

本节假设您已经有一个正在运行的 Ray 集群。要启动 Ray 集群,请参阅 集群设置 说明。

要将 scikit-learn 连接到正在运行的 Ray 集群,您必须通过设置 RAY_ADDRESS 环境变量来指定头节点的地址。

你也可以通过在调用 with joblib.parallel_backend('ray') 之前调用 ``ray.init()``(使用其任何支持的配置选项)来手动启动 Ray。

警告

如果你没有设置 RAY_ADDRESS 环境变量,并且在 ray.init(address=<address>) 中没有提供 address,那么 scikit-learn 将在单个节点上运行!