使用 Ray Tune 进行超参数调优(已弃用 API)#

重要提示

本用户指南涵盖了已弃用的 Train + Tune 集成。有关新 API 用户指南,请参阅 使用 Ray Tune 进行超参数调优

有关弃用和迁移的信息,请参阅 此处

Ray Train 原生支持使用 Ray Tune 进行超参数调优。

../../_images/train-tuner.svg

Tuner 会接收一个 Trainer 并执行多次训练运行,每次使用不同的超参数配置。#

关键概念#

使用 Tuner 进行超参数优化时,有几个关键概念:

  • 一组您想在搜索空间中调优的超参数。

  • 一个搜索算法,用于有效地优化您的参数,并可选择使用调度器来提前停止搜索并加速您的实验。

  • 搜索空间搜索算法调度器Trainer 被传递给 Tuner,Tuner 通过并行评估多个超参数来运行超参数调优工作负载。

  • 每一次单独的超参数评估运行都称为一个trial

  • Tuner 以 ResultGrid 的形式返回其结果。

注意

Tuner 也可以用于在不使用 Ray Train 的情况下启动超参数调优。有关更多指南和示例,请参阅 Ray Tune 文档

基本用法#

您可以接受一个现有的 Trainer 并将其传递给 Tuner

import ray
import ray.tune
import ray.train
from ray.tune import Tuner
from ray.train.xgboost import XGBoostTrainer

dataset = ray.data.read_csv("s3://anonymous@air-example-data/breast_cancer.csv")

trainer = XGBoostTrainer(
    label_column="target",
    params={
        "objective": "binary:logistic",
        "eval_metric": ["logloss", "error"],
        "max_depth": 4,
    },
    datasets={"train": dataset},
    scaling_config=ray.train.ScalingConfig(num_workers=2),
)

# Create Tuner
tuner = Tuner(
    trainer,
    # Add some parameters to tune
    param_space={"params": {"max_depth": ray.tune.choice([4, 5, 6])}},
    # Specify tuning behavior
    tune_config=ray.tune.TuneConfig(metric="train-logloss", mode="min", num_samples=2),
)
# Run tuning job
tuner.fit()

如何配置 Tuner?#

有两个主要的配置对象可以传递给 Tuner:TuneConfigray.tune.RunConfig

TuneConfig 包含调优特定的设置,包括:

  • 要使用的调优算法

  • 用于排名结果的指标和模式

  • 要使用的并行度

以下是一些 TuneConfig 的常见配置:

from ray.tune import TuneConfig
from ray.tune.search.bayesopt import BayesOptSearch

tune_config = TuneConfig(
    metric="loss",
    mode="min",
    max_concurrent_trials=10,
    num_samples=100,
    search_alg=BayesOptSearch(),
)

有关更多详细信息,请参阅 TuneConfig API 参考

ray.tune.RunConfig 包含比调优特定设置更通用的配置。这包括:

  • 故障/重试配置

  • 详细程度级别

  • 实验名称

  • 日志记录目录

  • 检查点配置

  • 自定义回调

  • 与云存储集成

下面我们展示一些 ray.tune.RunConfig 的常见配置。

import ray.tune

run_config = ray.tune.RunConfig(
    name="MyExperiment",
    storage_path="s3://...",
    checkpoint_config=ray.tune.CheckpointConfig(checkpoint_frequency=2),
)

搜索空间配置#

一个 Tuner 接受一个 param_space 参数,您可以在其中定义将从中采样超参数配置的搜索空间。

根据模型和数据集,您可能想调优:

  • 训练批次大小

  • 深度学习训练(例如,图像分类)的学习率

  • 基于树的模型(例如,XGBoost)的最大深度

您可以使用 Tuner 来调优 Ray Train 的大多数参数和配置,包括但不限于:

在此处阅读有关 Tune 搜索空间 的更多信息。

Train - Tune 注意事项#

在使用 Tuner 和 Trainer 时,关于参数规范有几个注意事项。

  • 默认情况下,配置字典和配置对象将被深度合并。

  • 在 Trainer 和 Tuner 中重复的参数将被 Tuner 的 param_space 覆盖。

  • 例外: ray.tune.RunConfigray.tune.TuneConfig 的所有参数本质上是不可调优的。

有关示例,请参阅 将数据导入和导出 Tune

高级调优#

Tuner 还提供了调优不同数据预处理步骤和不同训练/验证数据集的能力,如下面的代码片段所示。

import ray.data
import ray.tune
from ray.data.preprocessors import StandardScaler


def get_dataset():
    ds1 = ray.data.read_csv("s3://anonymous@air-example-data/breast_cancer.csv")
    prep_v1 = StandardScaler(["worst radius", "worst area"])
    ds1 = prep_v1.fit_transform(ds1)
    return ds1


def get_another_dataset():
    ds2 = ray.data.read_csv(
        "s3://anonymous@air-example-data/breast_cancer_with_categorical.csv"
    )
    prep_v2 = StandardScaler(["worst concavity", "worst smoothness"])
    ds2 = prep_v2.fit_transform(ds2)
    return ds2


dataset_1 = get_dataset()
dataset_2 = get_another_dataset()

tuner = ray.tune.Tuner(
    trainer,
    param_space={
        "datasets": {
            "train": ray.tune.grid_search([dataset_1, dataset_2]),
        }
        # Your other parameters go here
    },
)