使用 Ray Tune 进行超参数调优(已弃用 API)#
Ray Train 原生支持使用Ray Tune进行超参数调优。
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:TuneConfig
和 ray.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 的大多数参数和配置,包括但不限于
Ray
Datasets
以及其他超参数。
在此阅读更多关于Tune 搜索空间的信息。
Train - Tune 注意事项#
将 Tuner 与 Trainer 一起使用时,参数规范有一些需要注意的地方
默认情况下,配置字典和配置对象将进行深度合并。
在 Trainer 和 Tuner 中重复的参数将被 Tuner 的
param_space
覆盖。例外:
ray.tune.RunConfig
和ray.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
},
)