ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于 Syne Tune 的异步随机搜索:用多 worker 并行加速超参数优化(D2L 实战指南)

基于 Syne Tune 的异步随机搜索:用多 worker 并行加速超参数优化(D2L 实战指南) 文档教程人工智能深度学习NLP计算机视觉强化学习【免费下载链接】d2l-enInteractive deep learning book with multi-framework code, math, and discussions. Adopted at 500 universities from 70 countries including Stanford, MIT, Harvard, and Cambridge.项目地址https://gitcode.com/gh_mirrors/d2/d2l-en点击查看免费下载导读顺序执行的随机搜索Random Search往往需要数小时甚至数天才能找到满意的超参数组合原因在于每个超参数配置的评估如完整训练一个神经网络代价高昂。本文以《动手学深度学习》D2L超参数优化章节中的实战方案为核心讲解如何借助 Syne Tune 框架把随机搜索分发到同一台机器上的多个进程worker中异步并行执行在不改变算法本身的前提下获得近乎线性的加速比。读完本文你将掌握异步 HPO 的核心思想、Syne Tune 的PythonBackend/RandomSearch/Tuner配置方法、基于report回调的流式评估以及实验结果incumbent 轨迹与学习曲线的读取与可视化。随机搜索之所以是超参数优化HPO中最容易并行化的算法是因为它对每个新配置的采样都独立于其他所有配置尤其是不依赖任何先前评估的观测结果——这正是它能够被平凡地trivially异步并行的根本原因。本文档对应的完整代码位于仓库的 rs-async.md与之配套的基础 APIsearcher/scheduler/tuner 三件套见 hyperopt-api.md同章节的异步连续减半ASHA实现见 sh-async.md。为什么要异步同步调度的等待瓶颈上一章 HPO API 中实现的是一个顺序执行的 tunerHPOTuner.run在一个循环里依次执行suggest→ 评估目标函数 →update见 d2l/torch.py。当每个 trial 都要完整训练一个卷积网络时这种串行方式会把等待时间无限拉长。在实践中我们通常拥有一批资源同一台机器上的多张 GPU或多台各带一张 GPU 的机器。于是问题变成如何高效地分发随机搜索一般地分布式 HPO 分为两种调度方式见下图即本文档中的distributed_scheduling示意图同步调度Synchronous等待同一批次的所有 trial 全部结束后才开始下一批。当配置空间中包含滤波器数量网络层数这类超参数时层数/滤波器更多的配置天然耗时更长而同一批里的其他 trial 必须在同步点图中灰色区域干等之后才能继续优化流程。异步调度Asynchronous只要有资源空闲立刻调度新的 trial。由于完全避免了同步开销资源利用达到最优。对随机搜索而言每个新配置的采样与其他配置彼此独立、不利用历史观测因此可以轻松异步并行而基于历史观测做决策的高级方法如贝叶斯优化则不那么直接相关内容见 sh-async.md。异步随机搜索的收益可以量化在总计算量总 trial 数不变的前提下若同时并行 $K$ 个 trial达到同等性能所需的墙钟时间约为顺序执行的 $1/K$即线性加速比。当然其前提是你必须拥有比顺序设置更多的可用资源。环境准备Syne Tune 与依赖导入Syne Tune 提供了简单的异步 HPO 接口其设计目标是支持不同的执行后端本地多进程、集群、云环境等。本文档头部声明了版本依赖#required_libs(syne-tune[gpsearchers]0.3.2)随后导入所需组件并把 D2L 的日志级别设为 INFO 以便观察调度过程from d2l import torch as d2l import logging logging.basicConfig(levellogging.INFO) from syne_tune.config_space import loguniform, randint from syne_tune.backend.python_backend import PythonBackend from syne_tune.optimizer.baselines import RandomSearch from syne_tune import Tuner, StoppingCriterion from syne_tune.experiments import load_experiment其中syne_tune.config_space提供与 scipy 分布对应的搜索空间采样器loguniform、randint等PythonBackend负责把目标函数包装为可在子进程中执行的任务RandomSearch是 Syne Tune 内置的随机搜索调度器Tuner统一管理主实验循环与账本bookkeeping并协调 scheduler 与 backend 之间的交互StoppingCriterion定义实验停止条件本文用总墙钟时间上限load_experiment用于在实验过程中随时加载已收集的结果。第一步改造目标函数通过 report 回调流式回报性能与上一章顺序版hpo_objective_lenet见 d2l/torch.py相比异步版本的关键差异在于目标函数不再返回单个标量而是通过 Syne Tune 的Reporter在每一轮迭代epoch把性能回调给调度器。def hpo_objective_lenet_synetune(learning_rate, batch_size, max_epochs): from d2l import torch as d2l from syne_tune import Reporter model d2l.LeNet(lrlearning_rate, num_classes10) trainer d2l.HPOTrainer(max_epochs1, num_gpus1) data d2l.FashionMNIST(batch_sizebatch_size) model.apply_init([next(iter(data.get_dataloader(True)))[0]], d2l.init_cnn) report Reporter() for epoch in range(1, max_epochs 1): if epoch 1: # Initialize the state of Trainer trainer.fit(modelmodel, datadata) else: trainer.fit_epoch() validation_error d2l.numpy(trainer.validation_error().cpu()) report(epochepoch, validation_errorfloat(validation_error))逐段解读模型与数据d2l.LeNet是 D2L 实现的 LeNet-5 卷积网络见 d2l/torch.py其lr由被调优的超参数learning_rate决定d2l.FashionMNIST是 Fashion-MNIST 数据模块model.apply_init(..., d2l.init_cnn)用 Xavier 初始化卷积层与全连接层init_cnn见 d2l/torch.py。训练节奏控制HPOTrainer是 D2L 专为 HPO 设计的轻量 Trainer见 d2l/torch.py其validation_error()返回 1 减去验证集平均准确率。首次迭代用trainer.fit初始化训练器状态之后每轮用trainer.fit_epoch()只训练一个 epoch——这样我们可以在每个 epoch 结束时就把当前验证误差回报出去而不必等完整训练跑完。流式回报report(epochepoch, validation_errorfloat(validation_error))把 (epoch, validation_error) 键值对发送给调度器。这里的validation_error名称必须与后文metric参数保持一致否则调度器无法识别要优化的指标。注意Syne Tune 的PythonBackend要求相关依赖如d2l、syne_tune在函数定义内部导入因为目标函数会在独立子进程中执行导入语句必须随函数序列化到子进程环境。第二步配置异步调度器1. 资源与时间预算n_workers 2 # Needs to be the number of available GPUs max_wallclock_time 12 * 60 # 12 minutesn_workers并发评估 trial 的 worker 数必须小于等于可用 GPU 数每个 trial 占用一张 GPU。max_wallclock_time随机搜索允许运行的总墙钟时间上限秒本文示例为 12 分钟。它同时充当StoppingCriterion的参数。2. 优化指标与方向mode min metric validation_errormetric必须与传给report回调的参数名完全一致mode取min或max决定优化方向。验证误差自然是越小越好故为min。3. 配置空间与初始配置config_space { learning_rate: loguniform(1e-2, 1), batch_size: randint(32, 256), max_epochs: 10, } initial_config { learning_rate: 0.1, batch_size: 128, }Syne Tune 的配置空间字典有两个用途声明被搜索的超参数及其采样分布learning_rate在 $[10^{-2}, 1]$ 上对数均匀采样batch_size在 $[32, 256)$ 上均匀整数采样传递常量属性字典中也可以放固定值作为常量直接传给训练脚本——这里把max_epochs固定为 10避免它被随机化。initial_config指定第一个被评估的配置相当于上一章RandomSearcher中先用默认配置、再随机采样的做法见 d2l/torch.py。它通过points_to_evaluate参数注入调度器值取上一章 LeNet 实验的默认配置lr0.1、batch_size128。4. 执行后端PythonBackendtrial_backend PythonBackend( tune_functionhpo_objective_lenet_synetune, config_spaceconfig_space, )PythonBackend把上面的目标函数包装成可在多个 Python 子进程中并行执行的作业。本文只讨论单机多进程分发在更大规模的 HPO 中同一套接口也可对接集群或云环境让每个 trial 独占一整台实例。5. 调度器RandomSearchscheduler RandomSearch( config_space, metricmetric, modemode, points_to_evaluate[initial_config], )RandomSearch的行为与上一章手写的BasicScheduler见 d2l/torch.py一致——每当有资源可用就采样一个新配置——但它在 Syne Tune 内部与异步调度机制深度集成trial 结束后立即触发下一次suggest无需任何同步点。points_to_evaluate列表中的配置会优先于随机采样被评估。6. 组装 Tuner 并运行stop_criterion StoppingCriterion(max_wallclock_timemax_wallclock_time) tuner Tuner( trial_backendtrial_backend, schedulerscheduler, stop_criterionstop_criterion, n_workersn_workers, print_update_intervalint(max_wallclock_time * 0.6), )Tuner是主控组件集中管理主实验循环与账本调解调度器scheduler与后端backend之间的所有交互print_update_interval控制状态打印的频率这里设为总预算的 60%即约 7.2 分钟打印一次进度避免日志刷屏调用tuner.run()即启动分布式 HPO 实验按停止条件将运行约 12 分钟tuner.run()第三步读取结果与可视化Syne Tune 会把所有已评估超参数配置的日志保存下来在调优作业进行中的任意时刻都能读取到目前为止的结果并绘制 incumbent当前最优配置的轨迹d2l.set_figsize() tuning_experiment load_experiment(tuner.name) tuning_experiment.plot()tuner.name指向实验存储位置load_experiment从其中加载结果.plot()直接给出 incumbent 的 any-time performance 曲线横轴墙钟时间、纵轴目标函数值。除了 incumbent 轨迹还可以逐 trial 绘制学习曲线直观观察异步调度过程d2l.set_figsize([6, 2.5]) results tuning_experiment.results for trial_id in results.trial_id.unique(): df results[results[trial_id] trial_id] d2l.plt.plot( df[st_tuner_time], df[validation_error], markero ) d2l.plt.xlabel(wall-clock time) d2l.plt.ylabel(objective function)图中每种颜色代表一个 trial 的学习曲线每个 epoch 回报一次验证误差。关键观察点任意时刻并发的 trial 数恰好等于 worker 数——某个 trial 一结束立刻启动下一个绝不等待其他 trial从而把 worker 的空闲时间压到最低。异步调度为何对随机搜索零成本从代码结构上可以印证其原理。上一章 hyperopt-api.md 把 HPO 拆成两个决策原语搜索searchingHPOSearcher.sample_configuration()采样新配置。RandomSearcher的实现只是对config_space中每个域的分布调用.rvs()见 d2l/torch.py采样结果与历史观测完全无关调度schedulingHPOScheduler决定何时、运行哪个配置。BasicScheduler.suggest()只是把sample_configuration的结果原样返回见 d2l/torch.py。正因为决策不依赖观测异步化不需要对算法本身做任何修改——随机搜索天然就是异步友好的。对比之下连续减半SH必须在每个梯级rung收齐该梯级全部观测后才能决定晋级名单天然需要同步点直接异步化会引入大量空闲时间因此需要专门的 ASHA 式改造见 sh-async.md。这种是否依赖历史观测的分水岭正是选择并行调度策略时最重要的判断依据。小结把 trial 分发到并行资源上可以大幅缩短随机搜索的等待时间。调度方式分为同步与异步两种同步调度等上一批全部结束后再采下一批一旦出现落后者stragglers即比其他 trial 耗时长得多的 trialworker 就会在同步点空转异步调度则一有资源空闲就立即评估新配置保证任意时刻所有 worker 都在忙碌。随机搜索的异步化无需改变算法本身且能获得接近线性的加速比并行 $K$ 个 trial同等性能约快 $K$ 倍其他依赖历史观测的方法则必须做额外的异步化改造。落地路径很简洁把目标函数改为通过Reporter按 epoch 流式回报 → 用PythonBackend包装为子进程任务 → 用RandomSearch做调度 → 用TunerStoppingCriterion限定总墙钟时间 → 用load_experiment随时绘制 incumbent 轨迹与各 trial 学习曲线。进阶练习DropoutMLP 上的异步优化以 dropout.md 中的DropoutMLP为模型参考上一章 hyperopt-api.md 练习 1 的设置实现目标函数hpo_objective_dropoutmlp_synetune确保每个 epoch 后都回报验证误差用随机搜索与贝叶斯优化Syne Tune 提供syne_tune.optimizer.baselines.BayesianOptimization对比在至少 4 个 CPU 核的实例上对随机搜索分别用n_workers1、n_workers2、n_workers4运行并比较 incumbent 轨迹——随机搜索应呈现随 worker 数线性扩展为保证结论稳健建议每个设置重复多次取平均。高级在 Syne Tune 中实现自定义调度器准备同时包含 d2lbook 与 syne-tune 源码的虚拟环境安装方式见仓库 INFO.md 中的开发者安装说明把上一章练习 2 中的LocalSearcher实现为 Syne Tune 的新 searcher参考 Syne Tune 开发者教程中launch HPO experiment with home-made scheduler示例在DropoutMLP基准上对比你的LocalSearcher与RandomSearch的 any-time performance。赞分享文档教程人工智能深度学习NLP计算机视觉强化学习【免费下载链接】d2l-enInteractive deep learning book with multi-framework code, math, and discussions. Adopted at 500 universities from 70 countries including Stanford, MIT, Harvard, and Cambridge.项目地址https://gitcode.com/gh_mirrors/d2/d2l-en点击查看免费下载相关推荐D2L项目教程异步随机搜索在超参数优化中的应用D2L项目教程异步随机搜索在超参数优化中的应用 引言 在深度学习模型的训练过程中超参数优化 HPO 是一个至关重要的环节。传统的网格搜索和随机搜索方法虽然简文档教程人工智能深度学习NLP计算机视觉强化学习超参数优化HPO完全指南从随机搜索到多保真度与异步并行超参数优化HPO完全指南从随机搜索到多保真度与异步并行 超参数hyperparameter直接决定机器学习模型的泛化能力却缺少通用的选取规则。本篇基文档教程人工智能深度学习NLP计算机视觉强化学习Ray Tune 超参数搜索入门tune_basic_example 随机搜索与网格搜索实战解析Ray Tune 超参数搜索入门tune_basic_example 随机搜索与网格搜索实战解析 本篇指南围绕 Ray Tune 官方基础示例 tune_ba人工智能分布式训练强化学习任务调度模型推理服务后端上一篇大麦自动抢票完整指南从配置到抢票只需三步下一篇Vuls配置文件加密性能影响基准测试与优化建议创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表