使用 Ray Tune 进行超参数调优#

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

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

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

关键概念#

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

  • 你想要在一个 搜索空间 中调整的一组超参数。

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

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

  • 每个单独的超参数评估运行称为一个 试验

  • Tuner 将其结果作为 ResultGrid 返回。

备注

调谐器也可以在不使用 Ray Train 的情况下启动超参数调优。更多指南和示例请参见 Ray Tune 文档

基本用法#

你可以使用现有的 Trainer 并简单地将其传递给 Tuner

import ray
from ray import train, tune
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=train.ScalingConfig(num_workers=2),
)

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

如何配置一个调谐器?#

有两个主要的配置对象可以传递给一个 Tuner:TuneConfigRunConfig

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 参考

The RunConfig 包含比特定设置调整更通用的配置。这包括:

  • 失败/重试配置

  • 详细程度级别

  • 实验名称

  • 日志目录

  • 检查点配置

  • 自定义回调

  • 与云存储的集成

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

from ray.train import CheckpointConfig, RunConfig

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

更多详情请参阅 RunConfig API 参考

搜索空间配置#

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

根据模型和数据集的不同,您可能需要调整:

  • 训练批次大小

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

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

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

了解更多关于 调整搜索空间的信息

训练 - 调优陷阱#

在使用调优器(Tuners)与训练器(Trainers)时,关于参数指定有几个需要注意的地方:

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

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

  • 异常: RunConfigTuneConfig 的所有参数本质上都是不可调的。

参见 获取数据进出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 = tune.Tuner(
    trainer,
    param_space={
        "datasets": {
            "train": tune.grid_search([dataset_1, dataset_2]),
        }
        # Your other parameters go here
    },
)