ray.tune.search.optuna.OptunaSearch#

class ray.tune.search.optuna.OptunaSearch(space: Dict[str, None] | List[Tuple] | Callable[[None], Dict[str, Any] | None] | None = None, metric: str | List[str] | None = None, mode: str | List[str] | None = None, points_to_evaluate: List[Dict] | None = None, sampler: None = None, seed: int | None = None, evaluated_rewards: List | None = None)[源代码]#

基类:Searcher

一个围绕 Optuna 的包装器,用于提供试验建议。

Optuna 是一个超参数优化库。与其他库不同,它采用定义即运行风格的超参数定义。

这个搜索器是围绕 Optuna 搜索算法的一个薄包装。你可以传递任何 Optuna 采样器,它将被用来生成超参数建议。

支持多目标优化。

参数:
  • space – Optuna 采样器的超参数搜索空间定义。这可以是一个 字典,其中参数名作为键,optuna.distributions 作为值,或者是一个可调用对象——在这种情况下,它应该是一个使用 optuna.trial 获取超参数值的运行时定义函数。该函数应返回一个带有名称作为键的常量值 字典,或者返回 None。更多信息,请参见 https://optuna.readthedocs.io/en/stable/tutorial/10_key_features/002_configurations.html。 .. 警告:

  • metric – 训练结果目标值属性。如果为 None 但传递了模式,默认将使用匿名指标 _metric。可以是多目标优化的指标列表。

  • mode – 其中之一 {min, max}。确定目标是最小化还是最大化指标属性。可以是多目标优化模式的列表(对应于 metric)。

  • points_to_evaluate – 初始参数建议首先运行。当你已经有一些好的参数想要首先运行以帮助算法为未来的参数做出更好的建议时,可以使用此功能。需要是一个包含配置的dict列表。

  • sampler – Optuna 采样器用于抽取超参数配置。默认情况下,对于 Optuna<2.9.0 的多目标优化使用 MOTPESampler,其他情况下使用 TPESampler。有关可用的 Optuna 采样器,请参阅 https://optuna.readthedocs.io/en/stable/reference/samplers/index.html。 .. warning:

  • seed – 用于初始化采样器的种子。仅当 sampler=None 时使用此参数。在所有其他情况下,您传递的采样器应已使用种子初始化。

  • evaluated_rewards – 如果你之前已经评估了作为 points_to_evaluate 传递的参数,你可以通过传递奖励属性作为列表来避免重新运行这些试验,这样优化器就可以被告知结果而不需要重新计算试验。必须与 points_to_evaluate 的长度相同。 .. 警告:

Tune 自动将搜索空间转换为 Optuna 的格式:

from ray.tune.search.optuna import OptunaSearch

config = {
    "a": tune.uniform(6, 8)
    "b": tune.loguniform(1e-4, 1e-2)
}

optuna_search = OptunaSearch(
    metric="loss",
    mode="min")

tuner = tune.Tuner(
    trainable,
    tune_config=tune.TuneConfig(
        search_alg=optuna_search,
    ),
    param_space=config,
)
tuner.fit()

如果你想手动传递搜索空间,代码会是这样的:

from ray.tune.search.optuna import OptunaSearch
import optuna

space = {
    "a": optuna.distributions.FloatDistribution(6, 8),
    "b": optuna.distributions.FloatDistribution(1e-4, 1e-2, log=True),
}

optuna_search = OptunaSearch(
    space,
    metric="loss",
    mode="min")

tuner = tune.Tuner(
    trainable,
    tune_config=tune.TuneConfig(
        search_alg=optuna_search,
    ),
)
tuner.fit()

# Equivalent Optuna define-by-run function approach:

def define_search_space(trial: optuna.Trial):
    trial.suggest_float("a", 6, 8)
    trial.suggest_float("b", 1e-4, 1e-2, log=True)
    # training logic goes into trainable, this is just
    # for search space definition

optuna_search = OptunaSearch(
    define_search_space,
    metric="loss",
    mode="min")

tuner = tune.Tuner(
    trainable,
    tune_config=tune.TuneConfig(
        search_alg=optuna_search,
    ),
)
tuner.fit()

支持多目标优化:

from ray.tune.search.optuna import OptunaSearch
import optuna

space = {
    "a": optuna.distributions.FloatDistribution(6, 8),
    "b": optuna.distributions.FloatDistribution(1e-4, 1e-2, log=True),
}

# Note you have to specify metric and mode here instead of
# in tune.TuneConfig
optuna_search = OptunaSearch(
    space,
    metric=["loss1", "loss2"],
    mode=["min", "max"])

# Do not specify metric and mode here!
tuner = tune.Tuner(
    trainable,
    tune_config=tune.TuneConfig(
        search_alg=optuna_search,
    ),
)
tuner.fit()

你可以使用 points_to_evaluate 传递将被首先评估的配置:

from ray.tune.search.optuna import OptunaSearch
import optuna

space = {
    "a": optuna.distributions.FloatDistribution(6, 8),
    "b": optuna.distributions.FloatDistribution(1e-4, 1e-2, log=True),
}

optuna_search = OptunaSearch(
    space,
    points_to_evaluate=[{"a": 6.5, "b": 5e-4}, {"a": 7.5, "b": 1e-3}]
    metric="loss",
    mode="min")

tuner = tune.Tuner(
    trainable,
    tune_config=tune.TuneConfig(
        search_alg=optuna_search,
    ),
)
tuner.fit()

通过将奖励与 points_to_evaluate 一起传递,避免重新运行已评估的试验:

from ray.tune.search.optuna import OptunaSearch
import optuna

space = {
    "a": optuna.distributions.FloatDistribution(6, 8),
    "b": optuna.distributions.FloatDistribution(1e-4, 1e-2, log=True),
}

optuna_search = OptunaSearch(
    space,
    points_to_evaluate=[{"a": 6.5, "b": 5e-4}, {"a": 7.5, "b": 1e-3}]
    evaluated_rewards=[0.89, 0.42]
    metric="loss",
    mode="min")

tuner = tune.Tuner(
    trainable,
    tune_config=tune.TuneConfig(
        search_alg=optuna_search,
    ),
)
tuner.fit()

Added in version 0.8.8.

方法

add_evaluated_trials

传递已单独评估的试验结果。

restore_from_dir

从给定的 checkpoint_dir 恢复搜索器的状态。

save_to_dir

自动将给定的搜索器保存到 checkpoint_dir。

set_max_concurrency

设置此搜索器可以运行的最大并发试验次数。

属性

CKPT_FILE_TMPL

FINISHED

metric

训练结果目标值属性。

mode

指定是否最小化或最大化指标。