乐趣区

关于算法:Ray-Tune-炼丹师的调参新姿势

在机器学习的大多数丑陋的后果背地,是一个研究生 (我) 或工程师破费数小时训练模型和调整算法参数。正是这种乏味无聊的工作使得自动化调参成为可能。

在 RISELab 中,咱们发现越来越有必要利用尖端的超参数调整工具来跟上最先进的程度。深度学习性能的进步越来越依赖于新的和更好的超参数调整算法,如 基于散布的训练(PBT),HyperBand,和 ASHA。

Source: 基于散布的训练大大提高了 DeepMind 在许多畛域的算法。起源:https://deepmind.com/blog/population-based-training-neural-networks/

这些算法提供了两个要害的益处:

  • 他们最大化模型的性能: 例如,DeepMind 应用 PBT 在星际争霸中取得超人般的体现; Waymo 应用实现无人驾驶汽车的 PBT.
  • 他们将训练老本降到最低: HyperBand 和 ASHA 笼罩到高质量的配置 以前的办法所需工夫的一半; 基于总体的数据加强算法 实现指数级削减老本

然而,咱们看到,绝大多数钻研人员和团队没有利用这种算法。

为什么?大多数现有的超参数搜寻框架没有这些新的优化算法。一旦达到肯定的规模,大多数现有的并行超参数搜寻解决方案可能会很难应用ーー您须要为每次运行配置每台机器,并常常治理一个独自的数据库。

实际上,实现和保护这些算法须要大量的工夫和工程

但事实并非如此。咱们置信,没有理由说超参数调优须要如此艰难。所有的人工智能钻研人员和工程师都应该可能在 8 个 gpu 上无缝运行并行异步网格搜寻,甚至能够扩大到利用基于散布的训练或者云上的任何贝叶斯优化算法。

在这篇博客文章中,咱们将介绍 Tune, 一个基于 Ray 的弱小的超参数调整库,旨在打消艰苦、设置试验执行和超参数调整过程中的难度。

在不更改代码的状况下,优化从单个机器到大型分布式集群的扩大训练

Tune 是一个弱小的 Python 库,能够减速超参数调整:

  • 提供了开箱即用的分布式异步优化 Ray.
  • 您能够在不更改代码的状况下将超参数搜寻从单台机器扩大到大型分布式集群
  • Tune 提供了最先进的算法,包含(但不限于)ASHA 女名男子名, BOHB, 及 Population-Based Training 以人口为本的培训.
  • 主动可视化后果 TensorBoard or 或 MLFlow.
  • Tune 与许多优化库集成,如 Ax/Botorch, HyperOpt, 及 Bayesian Optimization 贝叶斯优化 并且能够让你通明地扩大它们
  • Tune 反对任何机器学习框架,包含 PyTorch、TensorFlow、XGBoost、LightGBM 和 Keras

除了 Tune 的外围个性,钻研人员和开发人员更喜爱 Tune 而不是其余现有的超参数调优框架有两个次要起因: 规模 灵活性

搜索算法留神: 从 2019 年 8 月 12 日起,HpBandSter 反对 HyperBand、Random Search 和 BOHB。反对随机搜寻、HyperBand 和 Bayesian 优化。Optuna 反对中位数 (百分位数) 进行,ASHA,随机搜寻和贝叶斯优化(TPE)。HyperOpt 反对贝叶斯优化和随机搜寻。Tune 反对 PBT,BOHB,ASHA,HyperBand,Median Stopping,Random Search,Bayesian Optimization (TPE,等等),以及许多其余因为库集成而产生的性能

Tune 简化了扩大

通过增加少于 10 行的 Python 代码,利用机器上的所有外围和 gpu 来执行并行异步超参数调优。

如果你遇到任何问题,请在评论中发表。

https://twitter.com/MarcCoru/status/1080596327006945281

应用另一个配置文件和 4 行代码,在云上启动一个大规模分布式超参数调优集群,并主动敞开计算机(咱们将在上面向您展现如何做到这一点)。

通过 Tune 的内置容错、试用迁徙和集群主动伸缩,您能够平安地利用 spot (抢占)实例,并将云老本升高高达 90%.。

Tune 是灵便的

Tune 与 MLFlow 和 TensorBoard 等试验管理工具无缝集成。

Tune 为优化算法提供了一个灵便的接口,容许您轻松地实现和扩大新的优化算法。

您能够应用 Tune 来利用和扩大许多尖端优化算法和库,比方 HyperOpt (上面)和 Ax,而无需批改任何模型训练代码。

应用 Tune 很简略

当初让咱们深刻到一个具体的例子中,它展现了如何利用一个风行的晚期进行算法(ASHA)。咱们将首先在您的工作站上的所有外围上运行一个应用 Tune 的超参数调优脚本示例。而后,咱们将应用 10 行代码应用 Ray 在云上进行同样的超参数优化试验。

您能够在这里下载超参数调优代码的残缺版本(这里是分布式试验配置)。

咱们将在这个例子中应用 PyTorch,然而咱们也有 Tensorflow 和 Keras 可用的例子。

Tune 被包装成 Ray 的一部分。要运行这个示例,您须要装置以下命令:

pip install ray torch torchvision

让咱们用 PyTorch 编写一个神经网络:

要开始应用 Tune,向上面的 PyTorch 培训函数增加一个简略的日志记录语句。

留神,在下面的培训脚本中有一些辅助函数; 您能够在这里看到它们的定义。

运行 Tune

让咱们做一个试验,从学习率和动量的均匀分布中随机抽取样本。

当初,你曾经跑完了你的第一个 Tune!通过指定 GPU 资源,您能够很容易地启用 GPU 的应用ー参见文档理解更多细节。而后咱们能够绘制这个试验的体现(须要 matplotlib)。

并行执行和提前进行

ASHA 和提前进行

让咱们集成 ASHA,一个可扩大的晚期进行算法(博客文章和论文)。ASHA 终止了不那么有前途的试验,并为更有前途的试验调配了更多的工夫和资源。

应用 num_samples 在计算机上所有可用的核上并行搜寻(额定的试验将排队)。

您能够应用与后面的示例雷同的 DataFrame 绘图。运行后,如果装置了 Tensorboard,还能够应用 Tensorboard 来可视化后果: tensorboard --logdir ~/ray_results

分布式执行

启动一个分布式超参数搜寻通常工作量太大。然而 Ray 和 Tune 使得所有变得简略

应用简略的配置文件在云上启动

并在不更改代码的状况下启动集群散发超参数搜寻

首先,咱们将创立一个配置 Ray 集群的 YAML 文件。作为 Ray 的一部分,Tune 与 Ray cluster launcher 十分洁净地互操作。上面显示的雷同命令将用于 GCP、AWS 和本地公有集群。除了头节点之外,咱们还将应用 3 个工作节点,因而咱们应该在集群上共有 32 个 vcpu,这样咱们就能够并行地评估 32 个超参数配置。

整合

要在整个 Ray 集群中散布超参数搜寻,您须要在脚本的顶部附加以下内容:

思考到计算量的大幅增长,咱们应该可能减少搜寻空间和搜寻空间中的样本数量:

您能够在这个博客中下载脚本的残缺版本(作为 tune_script.py)。

开始你的试验

要启动试验,您能够运行以下命令(假如目前为止您的代码在一个文件 tune_script.py 中) :

$ ray submit tune-default.yaml tune_script.py --start 
     --args="localhost:6379"

这将在 AWS 上启动您的集群,将 tune_script.py 上传到 head 节点,并运行 python tune_script.py localhost: 6379,这是 Ray 为启用分布式执行而关上的一个端口。

脚本的所有输入都将显示在管制台上。请留神,集群将首先设置头节点,而后再设置任何工作节点,因而一开始您可能只看到 4 个 cpu 可用。一段时间后,您能够看到 24 个试验正在并行执行,其余试验将排队期待执行,只有试验是闲置的。

要敞开集群,能够运行:

$ ray down tune-default.yaml

理解更多:

Tune 有许多其余个性,使钻研人员和从业人员减速他们的倒退。这篇博客文章中没有提到的其余 Tune 性能包含:

  • 一个简略的 API 进行分布式容错试验
  • 分布式超参数搜寻 PyTorch 分布式数据并行训练
  • 基于群体散布的训练

对于那些能够拜访云的用户,Tune 和 Ray 提供了许多实用程序,能够在笔记本电脑的开发和云端的执行之间实现无缝的转换。文件包含:

  • 在后盾进行试验
  • 提交一个现有试验
  • 在 TensorBoard 中可视化一个分布式试验的所有后果

调整的目标是规模试验执行和超参数搜寻与不便。如果您有任何意见或倡议,或者有趣味为 Tune 做奉献,您能够分割我 或者 ray-dev 邮件列表。

代码: https://github.com/ray-project/ray/tree/master/python/ray/tune
文档: http://ray.readthedocs.io/en/latest/tune.html

退出移动版