+-
Ray Tune: 炼丹师的调参新姿势

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

Image for post

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

Image for post

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

这些算法提供了两个关键的好处:

他们最大化模型的性能: 例如,DeepMind 使用 PBT在星际争霸中获得超人般的表现; Waymo 使用实现无人驾驶汽车的 PBT. 他们将训练成本降到最低: HyperBand 和 ASHA 覆盖到高质量的配置 以前的方法所需时间的一半; 基于总体的数据增强算法 实现指数级削减成本

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

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

实际上,实现和维护这些算法需要大量的时间和工程

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

在这篇博客文章中,我们将介绍 Tune, 一个基于 Ray 的强大的超参数调整库,旨在消除艰辛、设置实验执行和超参数调整过程中的难度。

Image for post

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

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 而不是其他现有的超参数调优框架有两个主要原因: 规模灵活性

Image for post

搜索算法注意: 从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 来执行并行异步超参数调优。

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

Image for post

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

使用另一个配置文件和4行代码,在云上启动一个大规模分布式超参数调优集群,并自动关闭计算机(我们将在下面向您展示如何做到这一点)。

通过 Tune 的内置容错、试用迁移和集群自动伸缩,您可以安全地利用 spot (抢占)实例,并将云成本降低高达 90%.。

Tune 是灵活的

Image for post

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)。

并行执行和提前停止

Image for post

ASHA 和提前停止

让我们集成 ASHA,一个可扩展的早期停止算法(博客文章和论文)。ASHA 终止了不那么有前途的试验,并为更有前途的试验分配了更多的时间和资源。

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

您可以使用与前面的示例相同的 DataFrame 绘图。运行后,如果安装了 Tensorboard,还可以使用 Tensorboard 来可视化结果: tensorboard --logdir ~/ray_results

Image for post

分布式执行

启动一个分布式超参数搜索通常工作量太大。但是 Ray 和 Tune 使得一切变得简单

使用简单的配置文件在云上启动

Image for post

并在不更改代码的情况下启动集群分发超参数搜索

首先,我们将创建一个配置 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