使用 Ray Tune 进行超参数调优#
使用 Ray Tune 进行超参数调优在 Ray Train 中得到原生支持。
关键概念#
在使用 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:TuneConfig
和 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 参考
。
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 的大多数参数和配置,包括但不限于:
Ray
数据集
以及其他超参数。
了解更多关于 调整搜索空间的信息。
训练 - 调优陷阱#
在使用调优器(Tuners)与训练器(Trainers)时,关于参数指定有几个需要注意的地方:
默认情况下,配置字典和配置对象将会进行深度合并。
在 Trainer 和 Tuner 中重复的参数将被 Tuner 的
param_space
覆盖。异常:
RunConfig
和TuneConfig
的所有参数本质上都是不可调的。
参见 获取数据进出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
},
)