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

重要提示

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

请参阅此处了解关于弃用和迁移的信息。

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
    },
)