尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Ray Tune 异步连续减半(ASHA)调度器实战:用 AsyncHyperBandScheduler 高效加速超参数搜索

Ray Tune 异步连续减半(ASHA)调度器实战:用 AsyncHyperBandScheduler 高效加速超参数搜索 人工智能分布式训练强化学习任务调度模型推理服务【免费下载链接】rayRay is an AI compute engine. Ray consists of a core distributed runtime and a set of AI Libraries for accelerating ML workloads.项目地址https://gitcode.com/gh_mirrors/ra/ray点击查看免费下载在机器学习超参数搜索中最耗时的问题莫过于大量试错几十个候选配置并行训练其中大部分在早期就已经明显落后却仍要占用算力跑完全程。Ray Tune 的ASHAAsynchronous Successive Halving Algorithm异步连续减半算法正是针对这一痛点设计的高效调度器它以异步方式持续评估每个 trial试验的中间结果主动终止表现不佳的 trial从而把算力集中到最有希望的配置上。本文以仓库中的官方示例 async_hyperband_example.py 为骨架结合 AsyncHyperBandScheduler 源码完整讲解 ASHA 的用法、全部可调参数及其底层实现原理读完即可在自己的调参任务中落地这套「早停 资源聚焦」的优化流程。ASHA 是什么从 Successive Halving 到异步化Successive Halving连续减半是一种朴素的早停思想让一批 trial 先跑少量迭代淘汰表现最差的一半把预算翻倍投给幸存者如此反复直至选出冠军。HyperBand在此基础上引入多组不同「淘汰强度」的 bracket缓解了单轮连续减半中「初始淘汰过早」的问题。而ASHA是 HyperBand 的异步改进版不再要求一批 trial 同步跑到同一个里程碑再集体淘汰而是每个 trial 各自上报中间结果调度器独立、即时地作出继续CONTINUE或停止STOP决策新 trial 可以随时加入资源空闲即被利用避免同步版本中「先到者等后到者」的 straggler掉队者问题从理论复杂度上ASHA 与 HyperBand 提供相近的优化性能但对真实集群资源的使用效率显著更高算法论文见 arXiv 1810.05934即 ASHA 原始论文。在 Ray Tune 中ASHA 由ray.tune.schedulers.AsyncHyperBandScheduler实现模块内同时导出了别名ASHAScheduler AsyncHyperBandScheduler两种写法等价。从源码继承关系看它继承自FIFOSchedulertrial_scheduler.py即按提交顺序运行 trial并在每个 trial 产生中间结果时介入决策。环境准备安装 ray[tune]运行本示例只需安装带 Tune 扩展的 Raypip install ray[tune]如果希望在集群/分布式环境运行可在各节点上同样安装并参考仓库根目录 README.rst 中关于 Ray 集群启动的说明。本文示例单机即可完整演示 ASHA 的调度过程。官方示例全解读从模拟目标函数到完整 Tuner仓库中的官方示例 async_hyperband_example.py 结构非常精简但覆盖了使用 ASHA 的全部关键要素下面分段拆解。1. 定义目标函数通过 tune.report 上报中间结果import argparse import time from typing import Any, Dict from ray import tune from ray.tune.schedulers import AsyncHyperBandScheduler def evaluation_fn(step, width, height) - float: # simulate model evaluation time.sleep(0.1) return (0.1 width * step / 100) ** (-1) height * 0.1 def easy_objective(config: Dict[str, Any]) - None: # Config contains the hyperparameters to tune width, height config[width], config[height] for step in range(config[steps]): # Iterative training function - can be an arbitrary training procedure intermediate_score evaluation_fn(step, width, height) # Feed the score back back to Tune. tune.report({iterations: step, mean_loss: intermediate_score})这里evaluation_fn用time.sleep(0.1)模拟一次模型评估的开销easy_objective则是完整的可训练目标函数。最关键的一行是tune.report({iterations: step, mean_loss: intermediate_score})它把每个 step 的中间指标上报给 Tune 控制器。ASHA 正是依赖这类中间结果才能做「边训练边早停」的决策——如果你的训练函数从不调用tune.report调度器将永远拿不到可供比较的中间指标。从 async_hyperband.py 源码 可以看到on_trial_result中会直接检查self._time_attr not in result or self._metric not in result缺失时跳过本轮决策。2. 创建 ASHA 调度器# AsyncHyperBand enables aggressive early stopping of poorly performing trials scheduler AsyncHyperBandScheduler( grace_period5, # Minimum training iterations before stopping max_t100, # Maximum training iterations )这里只显式设置了两个最常用参数grace_period5宽限期。trial 至少跑满 5 个迭代此处以training_iteration计才会被允许提前终止避免因早期噪声误杀有潜力的配置max_t100单 trial 的最大迭代上限。达到该上限后 trial 将被强制停止。其余参数time_attr、reduction_factor、brackets、stop_last_trials均使用默认值详见下文参数表。3. 组装 Tuner搜索空间、评估指标与采样数tuner tune.Tuner( tune.with_resources(easy_objective, {cpu: 1, gpu: 0}), run_configtune.RunConfig( nameasynchyperband_test, stop{training_iteration: 1 if args.smoke_test else 9999}, verbose1, ), tune_configtune.TuneConfig( metricmean_loss, modemin, schedulerscheduler, num_samples20, # Number of trials to run ), param_space{ steps: 100, width: tune.uniform(10, 100), height: tune.uniform(0, 100), }, ) # Run the hyperparameter optimization results tuner.fit() print(fBest hyperparameters found: {results.get_best_result().config})各配置项的作用配置位置键说明Tuner第 1 参tune.with_resources(easy_objective, {cpu: 1, gpu: 0})指定每个 trial 占用 1 个 CPU、0 个 GPU{cpu: n}即为分布式并行度控制RunConfigname实验目录名结果保存在~/ray_results/asynchyperband_test/下RunConfigstop外部停止条件smoke-test 时跑 1 个 iteration 就结束正常模式上限 9999实际由 ASHA 的max_t100控制终止RunConfigverbose控制台日志详细程度1为默认级别TuneConfigmetric/mode优化目标为mean_loss方向为min最小化。调度器与搜索算法共用这一目标TuneConfigscheduler挂载 ASHA 调度器TuneConfignum_samples采样 trial 总数这里为 20param_spacewidth/height使用tune.uniform(10, 100)、tune.uniform(0, 100)定义连续搜索空间steps固定为 100最后results.get_best_result().config输出最优配置对应的超参数组合。注意在 TuneConfig 源码 中metric/mode会被传递给调度器的set_search_properties若你实例化AsyncHyperBandScheduler时未传metric/mode也可以在TuneConfig中统一指定二者等价。4. 运行方式与 smoke-test示例自带--smoke-test参数用于 CI 或快速自检# 正式运行 20 个 trial python python/ray/tune/examples/async_hyperband_example.py # 冒烟测试仅 1 个 iteration秒级结束 python python/ray/tune/examples/async_hyperband_example.py --smoke-testsmoke 模式下stop{training_iteration: 1}每个 trial 只跑一步就结束便于验证代码链路是否通畅。正式运行时ASHA 会随着中间结果的上报逐渐终止表现较差的 trial你会在日志中看到Using AsyncHyperBand: num_stopped...这样的调度器状态输出——它来自源码中的debug_string()方法实时统计被提前终止的 trial 数量。AsyncHyperBandScheduler 参数完全手册以 async_hyperband.py 的构造函数签名与断言逻辑为准全部参数如下AsyncHyperBandScheduler( time_attr: str training_iteration, metric: Optional[str] None, mode: Optional[str] None, max_t: int 100, grace_period: int 1, reduction_factor: float 4, brackets: int 1, stop_last_trials: bool True, )参数默认值含义合法性约束来自源码断言time_attrtraining_iteration用于衡量时间/进度的结果字段只需单调递增即可任何通过tune.report上报的数字型单调字段如timesteps_total都可用training_iteration与time_total_s由框架自动填充无metricNone优化目标字段名为None且给了mode时使用匿名默认指标DEFAULT_METRIC实例化后若仍未设置on_trial_add会抛出ValueErrormodeNonemin或max决定目标最小化还是最大化必须在[min, max]中max_t100单个 trial 的最大时间单位按time_attr计达到后停止 0且 grace_periodgrace_period1宽限期至少训练这么久才允许被早停 0且 max_treduction_factor4减半率对应 HyperBand 中的eta决定每级 rung 的淘汰强度与 rung 间距 1brackets1bracket 数量不同 bracket 具有不同的减半速率由 rung 起点偏移s决定 0stop_last_trialsTrue是否在 trial 达到max_t后强制终止布尔值值得注意的默认行为差异示例把grace_period显式设为5而源码默认值为1。对于真实训练任务建议根据「单个评估 step 的开销 × 期望最少观察次数」来设置宽限期——太小的grace_period可能因冷启动阶段的随机波动误杀好配置。源码级原理Bracket、Rung 与异步早停决策理解 ASHA 的精髓可以看 async_hyperband.py 中的_Bracket类——它是整个算法的核心记账单元。Rung 的构造与里程碑self.rf reduction_factor MAX_RUNGS int(np.log(max_t / min_t) / np.log(self.rf) - s 1) self._rungs [ (min_t * self.rf ** (k s), {}) for k in reversed(range(MAX_RUNGS)) ]一个 bracket 内维护若干rung横档每个 rung 对应一个迭代里程碑如min_t, min_t*rf, min_t*rf², ...和一张「已记录成绩表」。rungs 以倒序创建使得循环判断可以从最大里程碑向下匹配当前迭代。例如grace_period1, max_t10, reduction_factor2时rung 里程碑依次为 1、2、4、8相当于在 4 个里程碑各做一次减半筛选。决策逻辑cutoff 与 on_resultdef cutoff(self, recorded) - Optional[Union[int, float, complex, np.ndarray]]: if not recorded: return None return np.nanpercentile(list(recorded.values()), (1 - 1 / self.rf) * 100) def on_result(self, trial: Trial, cur_iter: int, cur_rew: Optional[float]) - str: action TrialScheduler.CONTINUE for milestone, recorded in self._rungs: if cur_iter milestone or trial.trial_id in recorded: continue cutoff self.cutoff(recorded) if cutoff is not None and cur_rew cutoff: action TrialScheduler.STOP if cur_rew is None: logger.warning(...) else: recorded[trial.trial_id] cur_rew break return action逻辑可概括为当 trial 的当前迭代越过某个里程碑、且该里程碑尚未记录过此 trial 的成绩时进入决策用np.nanpercentile(..., (1 - 1/rf) * 100)计算该 rung 现有成绩的分位阈值rf4时取第 75 分位即只保留前 25%若新成绩低于阈值返回STOP终止该 trial否则记录成绩并返回CONTINUE。注意源码里决策方向已由self._metric_op * result[self._metric]统一转成「越大越好」的奖励空间modemin时metric_op -1.0所以内部比较统一使用。异步调度入口on_trial_result调度器对每个上报结果做决策的入口是on_trial_resultaction TrialScheduler.CONTINUE if self._time_attr not in result or self._metric not in result: return action if result[self._time_attr] self._max_t and self._stop_last_trials: action TrialScheduler.STOP else: bracket self._trial_info[trial.trial_id] action bracket.on_result( trial, result[self._time_attr], self._metric_op * result[self._metric] ) if action TrialScheduler.STOP: self._num_stopped 1 return action这印证了两点设计一是结果字段缺失时调度器安全跳过返回CONTINUE二是达到max_t且开启stop_last_trials时直接停止否则交给所属 bracket 做 rung 决策。TrialScheduler.STOP / CONTINUE这些决策常量定义在 trial_scheduler.py 中。多 bracket 与随机分配实例化时若brackets 1源码会创建多个_Bracket当新 trial 加入时on_trial_add按「当前 rung 越少的 bracket 越容易被选中」的 softmax 概率随机分配sizes np.array([len(b._rungs) for b in self._brackets]) probs np.e ** (sizes - sizes.max()) normalized probs / probs.sum() idx np.random.choice(len(self._brackets), pnormalized)即默认单 bracket 时不存在分配问题多 bracket 场景下trial 以偏向「进度较浅」的 bracket 的概率被分散让不同减半强度的 bracket 并行推进。此外调度器实现了save/restore基于 pickle支持实验故障恢复。与同步 HyperBand 的对比何时选 ASHA仓库同时实现了同步版HyperBandSchedulerhyperband.py二者核心差异如下维度HyperBandScheduler同步AsyncHyperBandSchedulerASHA调度方式按 band/bracket 分批同步推进一批 trial 跑齐里程碑后集体减半每个 trial 独立上报、独立决策随时加入/停止资源利用存在等待掉队者的空隙空闲资源即时被新 trial 填充调度精度批内比较、整体裁剪基于 rung 内已记录成绩的分位阈值裁剪_supports_buffered_resultsFalseTrue支持缓冲的批量结果上报典型场景集群规模有限、希望严格分批对齐时大规模并行、资源密集、希望最大化吞吐时从实现看同步版维护_hyperbands列表并按_get_n0/_get_r0计算各 bracket 的初始 trial 数与初始迭代数而 ASHA 用 softmax 随机分配 rung 分位阈值天然适配异步流水线。官方示例hyperband_example.rstdoc/source/tune/examples/includes/hyperband_example.rst演示了同步版的用法可对照阅读。从模拟函数到真实模型替换目标函数的实战建议示例中的easy_objective是占位实现迁移到真实任务只需做三处替换训练循环内调用tune.report把每个 epoch / 固定 step 间隔的验证指标上报出来例如tune.report({mean_loss: val_loss, accuracy: val_acc})并在TuneConfig中把metric/mode指向它调整宽限期与上限让grace_period覆盖足够观察期如 510 个 epochmax_t设为完整训练轮数用tune.with_resources控制并行度在 GPU 集群上设为{cpu: 2, gpu: 1}即每个 trial 独占一张卡num_samples对应并发规模。仓库中 mnist_pytorch.pyPyTorch ASHA、cifar10_pytorch.py、tune_mnist_keras.pyKeras都是把 ASHA 应用到真实训练任务的现成参照它们在训练回调/循环中上报mean_accuracy等指标配合AsyncHyperBandScheduler实现早停。更详细的 API 说明可查阅 doc/source/tune/api/schedulers.rst。常见问题与注意事项指标/方向未配置时报错若实例化调度器时未传metric/mode且TuneConfig也未指定on_trial_add会抛出ValueError提示「instantiated without a valid metric or mode parameter」。在TuneConfig中统一配置是最省心的做法。grace_period大于max_t会直接断言失败源码assert max_t grace_period设置时注意上限约束。time_attr必须单调递增training_iteration与time_total_s自动满足自定义字段如timesteps_total需确保单调否则 rung 匹配可能错乱。结果字段缺失时调度被跳过on_trial_result对缺失time_attr/metric的结果直接返回CONTINUE不会误杀但也会损失调度信息建议训练函数稳定上报目标指标。stop_last_trialsFalse的效果开启后默认trial 到达max_t即被终止关闭则幸存到最后一级 rung 的 trial 可以继续训练直至自然结束适合「最后一轮想多跑几步」的场景。结果持久化调度器支持save/restore配合 Ray 的容错机制可在训练中断后恢复调度状态结果日志与最优配置统一落在RunConfig.name对应的~/ray_results/目录中。小结ASHA 用「异步上报 分位阈值早停」替代同步的批量减半是 Ray Tune 处理大规模超参数搜索的默认利器。通过官方示例 async_hyperband_example.py 的 60 余行代码你可以快速掌握AsyncHyperBandSchedulertune.Tuner的完整接线方式深入 async_hyperband.py 的_Bracket/rung 实现则能理解每个参数如何影响淘汰强度与资源分配。把easy_objective换成你自己的训练函数、上报真实验证指标ASHA 就能立刻开始替你淘汰低效配置、把算力聚焦到最有潜力的超参数组合上。赞分享人工智能分布式训练强化学习任务调度模型推理服务【免费下载链接】rayRay is an AI compute engine. Ray consists of a core distributed runtime and a set of AI Libraries for accelerating ML workloads.项目地址https://gitcode.com/gh_mirrors/ra/ray点击查看免费下载相关推荐Ray Tune HyperBand 示例实战用 HyperBandScheduler 实现超参数搜索的早停调度Ray Tune HyperBand 示例实战用 HyperBandScheduler 实现超参数搜索的早停调度 本文围绕 Ray 仓库中的 HyperBan人工智能分布式训练强化学习任务调度模型推理服务Ray Tune 实战使用 HyperBandScheduler 对 Trainable 函数做超参搜索与早停Ray Tune 实战使用 HyperBandScheduler 对 Trainable 函数做超参搜索与早停 本文以 Ray Tune 官方示例 hyper人工智能分布式训练强化学习任务调度模型推理服务Ray Tune 条件搜索空间实战:用 HyperOpt 建模「参数依赖」的超参调优任务Ray Tune 条件搜索空间实战:用 HyperOpt 建模「参数依赖」的超参调优任务 本文基于 Ray Tune 官方示例 hyperopt_conditi人工智能分布式训练强化学习任务调度模型推理服务上一篇Puck 如何用 Permissions API 按组件实例动态控制编辑权限下一篇Zod Enum完全指南从基础用法到高级技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表