超参数优化
什么是超参数优化?
超参数是直接控制训练算法行为的变量,对最终机器学习模型的性能有显著影响。找到能产生最佳性能模型的超参数值可能很复杂。在许多训练试验过程中手动调整超参数可能既缓慢又繁琐。幸运的是,您可以使用ClearML的HyperParameterOptimizer
类来自动化和加速超参数优化(HPO)。
ClearML的超参数优化
ClearML 提供了 HyperParameterOptimizer
类,它通过一个简单的界面为用户处理整个优化过程。
ClearML的超参数优化方法具有可扩展性,易于设置和管理,并且使得结果比较变得容易。
工作流程
前面的图表展示了超参数优化的典型流程,其中基础任务的参数被优化:
- 配置一个优化任务,包括一个基础任务(其参数将被优化)、优化目标以及一组要测试的参数值
- 克隆基础任务。每个克隆的参数都会被优化任务中的值覆盖
- 将每个克隆加入队列,由ClearML代理执行
- 优化任务记录并监控克隆任务的配置和执行细节,并以表格和平行坐标格式以及标量图的形式返回优化结果的摘要。
支持的优化器
HyperParameterOptimizer
类包含了 ClearML 的超参数优化模块。其模块化设计使得可以使用不同的优化器,包括现有的软件框架,从而实现简单、准确和快速的超参数优化。
- Optuna -
automation.optuna.OptimizerOptuna
. Optuna 是 ClearML 中的默认优化器。它使用了不同的采样器,如网格搜索、随机、贝叶斯和进化算法。 有关更多信息,请参阅 Optuna 文档。 - BOHB -
automation.hpbandster.OptimizerBOHB
. BOHB通过将Hyperband搜索的速度与贝叶斯优化的指导和收敛保证相结合,实现了大规模、稳健且高效的超参数优化。有关HpBandSter BOHB的更多信息,请参阅HpBandSter文档和代码示例。 - 随机均匀采样超参数 -
automation.RandomSearch
. - 全网格 采样策略,用于每个超参数组合 -
automation.GridSearch
。 - 自定义 -
automation.optimization.SearchStrategy
- 使用自定义类并从ClearML自动化基础策略类继承。
定义超参数优化搜索示例
-
导入ClearML的自动化模块:
from clearml.automation import UniformParameterRange, UniformIntegerParameterRange
from clearml.automation import HyperParameterOptimizer
from clearml.automation.optuna import OptimizerOptuna -
初始化任务,当代码运行时,它将被存储在ClearML服务器中。代码至少运行一次后,可以重现,并且可以调整参数:
from clearml import Task
task = Task.init(
project_name='Hyper-Parameter Optimization',
task_name='Automatic Hyper-Parameter Optimization',
task_type=Task.TaskTypes.optimizer,
reuse_last_task_id=False
) -
定义优化配置和资源预算:
optimizer = HyperParameterOptimizer(
# specifying the task to be optimized, task must be in system already so it can be cloned
base_task_id=TEMPLATE_TASK_ID,
# setting the hyperparameters to optimize
hyper_parameters=[
UniformIntegerParameterRange('number_of_epochs', min_value=2, max_value=12, step_size=2),
UniformIntegerParameterRange('batch_size', min_value=2, max_value=16, step_size=2),
UniformParameterRange('dropout', min_value=0, max_value=0.5, step_size=0.05),
UniformParameterRange('base_lr', min_value=0.00025, max_value=0.01, step_size=0.00025),
],
# setting the objective metric we want to maximize/minimize
objective_metric_title='accuracy',
objective_metric_series='total',
objective_metric_sign='max',
# setting optimizer
optimizer_class=OptimizerOptuna,
# configuring optimization parameters
execution_queue='default',
max_number_of_concurrent_tasks=2,
optimization_time_limit=60.,
compute_time_limit=120,
total_max_jobs=20,
min_iteration_per_job=15000,
max_iteration_per_job=150000,
)Locating Task ID要定位基础任务的ID,请前往WebApp中的任务信息面板。ID会显示在任务标题中。
Multi-objective Optimization如果您正在使用Optuna框架(请参阅支持的优化器),您可以列出多个优化目标。 这样做时,请确保
objective_metric_title
、objective_metric_series
和objective_metric_sign
列表 长度相同。每个标题将与其相应的系列和符号匹配。例如,下面的代码设置了两个目标:最小化
validation/loss
指标和最大化validation/accuracy
指标。objective_metric_title=["validation", "validation"]
objective_metric_series=["loss", "accuracy"]
objective_metric_sign=["min", "max"]
优化器执行选项
HyperParameterOptimizer
提供了在本地或通过 ClearML queue 启动优化任务的选项。
使用 HyperParameterOptimizer.start()
或 HyperParameterOptimizer.start_locally()
启动 HyperParameterOptimizer
实例。
这两种方法都在本地运行优化器控制器。start()
通过实例化控制器时指定的队列启动基础任务克隆,而 start_locally()
则在本地运行任务。
你也可以通过队列启动优化器控制器,在启动优化器之前使用Task.execute_remotely()
。
教程
查看超参数优化教程以获取逐步指南。
SDK 参考
有关详细信息,请参阅完整的HyperParameterOptimizer SDK参考页面。
命令行界面
ClearML 还提供了 clearml-param-search
,一个用于管理超参数优化过程的 CLI 工具。更多信息请参见
ClearML Param Search。
UI 应用程序
ClearML HPO 应用程序可在 ClearML Pro 计划下使用。
ClearML 提供了 超参数优化 GUI 应用程序 用于启动和管理超参数优化过程。