Hyper Parameter 优化¶
概述和用法¶
该模块包含一些模块和函数,您可以
可用于构建超参数优化 (HPO) 应用程序。注意
HPO 应用程序是协调 HPO 搜索的实体
不要与为每个 “试用版” 运行的应用程序混淆
的搜索。通常,HPO 作业中的“试用”是
训练一个 ML 模型,给定 HPO 任务指定的一组参数。torchx.runtime.hpo
对于网格搜索,HPO 作业可能就像 for parallel 循环一样简单,即 详尽地运行 User-defined 中的所有参数组合 搜索空间。另一方面,贝叶斯优化需要优化器 state 在 Trial 之间保留,这会导致一个更加重要的实现 的 HPO 应用程序。
目前该模块使用 Ax 作为 HPO 的底层大脑 并提供了一些扩展点,用于将 Ax 与 TorchX 运行器集成。
快速入门示例¶
以下示例演示了在 TorchX 组件上运行 HPO 作业。
我们使用内置组件,它只运行一个应用程序
,用于计算 处的 booth 函数。目标是
find 并最小化 booth 功能。utils.booth
(x1, x2)
x1
x2
import os
from ax.core import (
BatchTrial,
Experiment,
Objective,
OptimizationConfig,
Parameter,
ParameterType,
RangeParameter,
SearchSpace,
)
from ax.modelbridge.dispatch_utils import choose_generation_strategy
from ax.service.scheduler import SchedulerOptions
from ax.service.utils.best_point import get_best_parameters
from ax.service.utils.report_utils import exp_to_df
from ax.utils.common.constants import Keys
from pyre_extensions import none_throws
from torchx.components import utils
from torchx.runtime.hpo.ax import AppMetric, TorchXRunner, TorchXScheduler
from torchx.specs import RunConfig
# Run HPO on the booth function (https://en.wikipedia.org/wiki/Test_functions_for_optimization)
parameters = [
RangeParameter(
name="x1",
lower=-10.0,
upper=10.0,
parameter_type=ParameterType.FLOAT,
),
RangeParameter(
name="x2",
lower=-10.0,
upper=10.0,
parameter_type=ParameterType.FLOAT,
),
]
objective = Objective(metric=AppMetric(name="booth_eval"), minimize=True)
runner = TorchXRunner(
tracker_base=tmpdir,
component=utils.booth,
component_const_params={
"image": "ghcr.io/pytorch/torchx:0.1.0rc0",
},
scheduler="local", # can also be [kubernetes, slurm, etc]
scheduler_args=RunConfig({"log_dir": tmpdir, "image_type": "docker"}),
)
experiment = Experiment(
name="torchx_booth_sequential_demo",
search_space=SearchSpace(parameters=parameters),
optimization_config=OptimizationConfig(objective=objective),
runner=runner,
is_test=True,
properties={Keys.IMMUTABLE_SEARCH_SPACE_AND_OPT_CONF: True},
)
scheduler = TorchXScheduler(
experiment=experiment,
generation_strategy=(
choose_generation_strategy(
search_space=experiment.search_space,
)
),
options=SchedulerOptions(),
)
for i in range(3):
scheduler.run_n_trials(max_trials=2)
print(exp_to_df(experiment))
Ax (自适应实验)¶
- torchx.runtime.hpo.ax 类。TorchXRunner(tracker_base: str, component: Callable[[...], torchx.specs.api.AppDef], component_const_params: 可选[dict[str, any]] = 无,调度器:str = 'local',scheduler_args:可选[torchx.specs.api.RunConfig] = None)[来源]¶
委托作业提交的实现 到 TorchX Runner。此 runner 与 torchx 组件耦合 因为 Ax runners 运行具有不同参数的单个组件的试验。
ax.core.runner.Runner
试验参数名称和类型应匹配 EXACTLY 与组件的函数 args 一起使用。Component 函数 arg 中 NOT 部分可以作为 . 以下 args(前提是组件函数声明了它们 在函数签名中),作为自动传递的
component_const_params
trial_idx (int)
: 当前试验索引tracker_base (str)
: torchx 跟踪链接的 base (通常是一个 URL,表示跟踪链接的 base 目录)
例:
def trainer_component( x1: int, x2: float, trial_idx: int, tracker_base: str, x3: float, x4: str) -> spec.AppDef: # ... implementation omitted for brevity ... pass
实验应设置为:
parameters=[ { "name": "x1", "value_type": "int", # ... other options... }, { "name": "x2", "value_type": "float", # ... other options... } ]
其余参数可以设置为:
TorchXRunner( tracker_base="s3://foo/bar", component=trainer_component, # trial_idx and tracker_base args passed automatically # if the function signature declares those args component_const_params={"x3": 1.2, "x4": "barbaz"})
按照上述设置运行实验会导致每个试验运行:
appdef = trainer_component( x1=trial.params["x1"], x2=trial.params["x2"], trial_idx=trial.index, tracker_base="s3://foo/bar", x3=1.2, x4="barbaz") torchx.runner.get_runner().run(appdef, ...)
- torchx.runtime.hpo.ax 类。TorchXScheduler(实验:ax.core.experiment.Experiment,generation_strategy:ax.modelbridge.generation_strategy.GenerationStrategy,选项:ax.service.scheduler.SchedulerOptions,db_settings:Optional[ax.storage.sqa_store.structs.DBSettings] = None,_skip_experiment_save: bool = False)[来源]¶
Ax Scheduler 的实现,它与 .
TorchXRunner
这个调度器不是一个真正的调度器,而是一个 Facade 调度器 该 Scheduler 将 Scheduler Client 委托给各种远程/本地 Scheduler 的 Scheduler 客户端。 有关支持的调度器列表,请参阅 TorchX 调度器文档。
- torchx.runtime.hpo.ax 类。AppMetric(name: str, lower_is_better: Optional[bool] = None, properties: Optional[dict[str, 任意]] = 无)[来源]¶
获取 AppMetric(试用作业/应用程序返回的观察) 通过模块。假设应用使用 跟踪链接:
torchx.tracking
tracker = torchx.runtime.tracking.FsspecResultTracker(tracker_base) tracker[str(trial_index)] = {metric_name: value} # -- or -- tracker[str(trial_index)] = {"metric_name/mean": mean_value, "metric_name/sem": sem_value}