介绍
2017年,我们介绍了霍洛维多,一个开源框架,用于缩放跨越数百个GPU的深度学习训练。当时,优步的大多数深入学习用例与研究和开发有关雷竞技是骗人的无人驾驶车辆, 而在米开朗基罗,绝大多数生产机器学习模型是基于树模型XGBoost..
现在在2021年,深度学习的状态正在发生变化。越来越多的深度学习模型是表现表格数据问题的基于树的模型,而且更多的深度学习模型正在从研究中转向生产。雷竞技是骗人的因此,我们必须重新思考我们现有的深度学习平台以满足日益增长的需求和新要求:
- 自动造流和容错
- HyperParameter搜索
- 统一计算基础架构
自动造流和容错
我们之前的深度学习平台分配了一个固定大小的Horovod集群来训练单个模型。当在本地运行时,用户经常会发现自己无法开始大量的培训工作,因为缺乏资源。我们提供了在云数据中心进行培训的选项,但缺乏自动伸缩意味着运行在专用实例上,这通常是运行在可抢占或“现场”实例上的3-5倍。
即使产能不是主要关注的时候,通常也是普遍的容差。随着乔布斯列车为更多的时代拥有更多机器,失败的可能性增加。频繁检查点可以帮助缓解此操作,但需要大量的其他定制平台工具来支持。
弹性霍罗维多
在Horovod V0.20中,我们介绍了弹性霍罗维多允许在整个培训过程中动态地缩放工人数量的分布式培训。在现有的Horovod培训脚本中添加了几行代码,当机器来自作业时,就可以在最小的中断继续培训。
从API抽象级别,Elastic Horovod解决了培训过程的问题,但不能运作它。我们将Elastic Horovod写入任何特定的编排系统或云提供商的通用,这意味着将以下组件留成为要实现的接口:
- 发现可以添加到(或者应该从)培训工作中的主机
- 资源请求对于额外的工人,当他们变得可用和工作可以利用他们
我们的原始假设是我们需要在每个主要云提供商(例如,AWS,AWS,Azure,GCP)或Orchestration系统(例如,Kubernetes,Peloton),我们希望为内部和开源用户提供支持。
事实证明,已经有一个开源解决方案对这个多云分布式计算问题:射线.
射线上的弹性霍罗夫
射线是分布式执行引擎用于并行和分布式编程。Ray是在加州大学伯克利分校开发的,最初构建它是为了通过一个简单的基于类/函数的Python API扩展机器学习工作负载和实验。
自成立以来,光线生态系统已经增长,包括各种特性和工具,可用于卷云的ML模型,包括雷调对于分布式的超级参数调谐,雷集群启动器用于集群供应,基于负载的自动阶段.现在,Ray还集成了各种机器学习库,如RLLib、XGBoost和PyTorch。
与新的弹性圈线教室Horovod能够利用Ray来简化底层主机的发现和编排。要利用Ray和Horovod进行弹性训练,首先需要启动包含多个节点(一个Ray集群)的Ray运行时
射线运行时/群集:光线程序能够通过利用潜在的潜在并行化和分配雷运行时.可以在一个或多个节点上启动射线运行时,形成射线簇。
雷捆绑在一起轻量级集群启动器这简化了任何云(AWS,Azure,GCP,甚至像Kubernetes和Yarn等群集管理器)的群集。)。群集启动器提供根据给定群集配置的集群,例如如下所示的示例:
要在AWS上启动Ray Cluster,您可以简单地将上述配置保存为“CFG.YAML”,然后呼叫“光线”CFG.YAML`。在上面的示例中,请注意,HEAD节点是仅CPU节点,而工人是GPU抢占的实例。
此外,Ray集群可以配置为“自动伸缩”,这意味着雷可以透明地提供新节点根据不同的工作量要求。例如,如果RAY程序在应用程序的中间需要GPU,则Ray可以在实例上运行廉价的GPU实例,在实例上运行Ray Task或Actor,然后在完成后终止实例。
您可以查看Ray文档以实现创建示例自动缩放射线程序在AWS/GCP.
ElicallayRayexecutor API:ElicallayRayexecutor可以利用AutoScalling Ray Cluster来简化主机的发现并在适当时请求更多资源。要使用此API,请定义包含更高级别功能的培训函数HOROVOD弹性状态同步装饰员:
然后,您可以附加到底层射线群集并执行培训函数:
在此示例中,EliCallayRayExecutor将创建多个GPU工作人员,每个工人参与数据并行培训例程。工作人员的数量将由群集中的GPU工作台数量自动确定 - 这意味着即使在通过预先清空任意删除节点时,也不会停止培训。
如您所见,Ray与Horovod的集成导致解决方案,即简化了在主要云提供商中使用Horovod运行的运行弹性培训工作。
基准和实验
在考虑采用弹性训练时,我们的最大未知数之一是收敛.具体而言,我们不确定如果在培训期间可以调整工作大小的频率和程度的程度,我们是否需要在培训期间进行任何调整,以平滑缩放运行时缩放工作人员数量的影响?
为了测量动态调整工人数量对模型收敛的影响,我们在AWS (AWS)中使用8x v100 gpu在Cifar10数据集上运行3个工作训练ResNet50模型(p3.2xlarge固定数量的90个时期)的实例。我们调整了工人数量上下调整的频率,以及一次将在3个实验配置中添加/删除多少工人:
- 固定数量的8个GPU工人,没有自动播放(8 gpu_fixed)。
- 最初的8个GPU工人每60秒向上或向下缩放1(8 gpu_60_1)。
- 最初的8个GPU工人每180秒按3升起3:8GPU_180_3.)。
对于每个调整大小的事件,如果工作人员的数量已经在Max(8)中,我们总是缩减,如果工人的数量是MIN(2),我们将始终扩展。否则,我们随机选择增加或减少具有相同概率的工人数量。
如图所示在上面的结果中,我们发现,增加的幅度大小调整事件(以一次主机添加/删除)和频率成比例地下降,时代之间的方差模型的整体性能增加,实际上提高了整体模型泛化对基线。
弹性训练的另一个好处是,它甚至可以用来减少培训过程中的整体方差可以通过培训过程来控制调整大小事件的时序。如Smith等人所示。在不要腐烂学习率,增加批量大小,我们可以利用这样一个事实,即增加批量大小会导致模拟退火效应,将模型训练从早期的探索阶段移动到接近末期的开发阶段。
在实践中,通过增加工人的数量来定期缩放批量大小的这种过程允许模型训练到较少的墙钟时间,通常具有更高的概括精度,而不是与持续时间保持初始工人数量训练。
为了说明这一效果,我们进行了另一组实验:重复上述训练过程,但使用两种新的配置:
- 固定2名GPU工作人员(2 gpu_fixed)
- 每30个时期加倍的动态数量,从2起开始,并以8名工人结尾(8 gpu_exp)。
正如预期的那样,减少8到2的工人数量改善了整体模型融合。这揭示了当模型被调整以较小的批量大小时数据并行分布式训练的常见缺陷之一。在实践中,建议使用像学习率预热/衰变,Quand参数搜索等技术(见下文),Adasum来抵消这些影响。
通过上面所示的第三个实验说明了具有高量平行度的良好收敛的另一种解决方案:随着时间的推移缩放并行性。不仅是这种方法完整的较少的总壁钟时间比2个gpu基线,它这样做了验证准确性更高!!
如史密斯等人的上述文件所解释的那样,训练过程的直觉是训练过程从“探索”阶段从开始到结束时的“剥削”阶段。增加并行性具有增加批量尺寸的效果,这有助于平滑训练示例之间的差异,从而在培训的后期阶段较少探索。
将此功能添加到射线上的弹性堀hor od可以使用Horovod在Ray的情况下完成打回来API:
这些回调也可用于简化培训的其他方面,包括从工人到驱动程序的消息转发消息。
当这种方法有可能提供最大改进的潜力是在与封锁率搜索结合时的最大改进。类似于缩放批量大小的模拟退火比较,许多现代的高级计数器搜索算法也遵循探索/利用范例,可以与弹性训练相结合,以实现最佳模型性能和最佳资源利用率。
HyperParameter搜索
在开发深度学习模型的过程中,用户通常需要在尺度训练时重新调整超级参数,因为许多超级参数在更大的尺度上表现出不同的行为。当在自动缩放群集中培训时,这更为真实,因为还有额外的卓越的超参数,可能会影响培训吞吐量,收敛和成本,包括:
- 增加频率增加工作人员的最大数量/有效批量大小
- 多久到多频繁犯罪共享工作者状态,以最少的时间实现最多的时代数量
- 我们允许一次进入/删除作业的工作人员
使用Horovod大规模调优超参数通常有点棘手。执行并行的超参数搜索将需要一个单独的更高级别的系统来协调和调度可用资源上的多节点Horovod训练作业。的自动运动Michelangelo在Michelangelo中支持的服务涉及协调长期运行的超级参数搜索工作的一些基本挑战,但不支持基于人口的培训和早期停止策略,以便我们重新分配GPU资源以加快最佳表现的审判。
射线是支持嵌套并行性的支持 - 这意味着它能够轻松地处理推出本身分布的任务的分布式程序。利用这一点,我们开发了HOROVOD + RAY TUNE集成通过分布式训练启用并行的HyperParameter调整。
雷调是一个流行的超参数调整图书馆与光线捆绑在一起。Ray Tune包括最新的HyperParameter搜索算法(如基于人口的培训,贝叶斯优化和超带),也支持故障处理因此,用户可以更好地利用模型性能的权衡来实现云成本,以进行HyperParameter调整。
如Liaw等人所证明的那样超高速:截止日期模型开发的动态资源重新分配,将超参数搜索与分布式训练相结合,可以在固定的时间和计算资源下进行优化,找到最优模型。这对像我们在Uber这样的机构特别有用,因为大多数培训都是在固定大小的内部GPU集群上进行的。
下一步:统一机器学习和深度学习的计算基础设施
我们将Elastic Horovod与Ray和Ray Tune集成的早期结果已经证明了Ray作为一种将复杂的分布式计算系统脚本化为统一工作流的手段的灵活性和易用性。
除了我们讨论的以前的挑战外,机器学习平台通常需要集成多种不同的技术,如SparkML,XGBoost,Sklearn和Rllib等。这些不同的技术在不同的计算平台上运行。例如,在优步,ML工作负载可以在一般容器化的计算红外线(Peloton,Kubernetes),火花(纱,Peloton)和Ray(Peloton,Kubernetes)等上运行。结果,生产M1流水线通常被打破进入不同的任务,并由管道调节器(如气流或Kubeflow管道)策划。这增加了平台的软件和操作复杂性。
在过去,我们已经投资于创建定制系统,以提供和运行深入学习工作流程,但与霍洛夫在雷比相比,有很多缺点:
- 可扩展性:由于内部系统被设计用于特定应用程序,而不是一般计算,因此为eLastic Horovod等框架添加支持需要代码库的主要Rechicition,并实现类似于射线提供的自定义自动播放器。
- 灵活性:构建的系统内置的分布式深度学习不能轻易调整以运行其他工作负载,例如数据处理(DASK,MODIN),HyperParameter搜索(RAY TUNE)或加强学习(RLLIB)。
- 维护:与射线一样的开源系统不同,我们的内部深度学习基础设施必须由专门的工程师组维护,其时间和精力可以替代地解决更高级别的问题。
通过在Ray上巩固更多的深度学习堆栈,我们可以进一步优化深入学习工作流程内的更多端到端。例如,目前特征工程(Apache Spark)和分布式训练(Horovod)之间存在尖锐的边界。对于工作流的每个阶段,我们必须配置必须独立运行的单独计算基础架构,并将火花过程的输出物质化为磁盘,因此可以通过HOROVOD过程消耗。如果我们希望探索工作流的不同阶段,这不仅难以维护,而且难以替换。
能够交换和出不同的分布式框架是光线的核心优势之一。因为光线是一般分布式计算平台,所以光线的用户可以自由选择越来越多的分布式数据处理框架,包括Spark,以光线为深度学习工作流程提供的相同资源运行。这简化了计算基础架构,因为火花和Horovod工作量之间不再存在上述锋利的边界。在实践中,根据数据卷,计算强度和可用群集资源,针对不同的工作负载进行了优化的不同框架。此外,一些框架比其他框架更容易集成到现有的项目中。
我们正在加强这些能力的这样一个项目是Ludwig,由优步开发的开源深度学习自动机框架。
过去,Ludwig由于其依赖于对数据处理的熊猫框架而被依赖于单个机器的内存中的处理数据集。现在在即将到来的Ludwig 0.4版本中,我们正在整合Dask在雷用于分布式内存存储数据预处理,霍洛夫在雷用于分布式训练,Ray Tune用于超参数优化。
通过利用DASK,Ludwig现有的Pandas预处理可以缩放以处理具有最小代码更改的大型数据集,并且通过利用射线,我们可以将预处理,分布式训练和超级计数器搜索所有运行单个训练脚本。
对于路德维希用户来说,除了在命令行中添加' ray submit '和' -backend ray '之外,这些功能无需修改任何代码或额外的基础设施配置:
我们认为,在优步和行业中,射线将继续发挥对生产机器学习生态系统的许多必要的普通基础设施和标准化的越来越重要的作用。在未来的几个月里,我们将更多地分享我们努力将Ray的能力带到优步的深度学习平台。与此同时,退房射线上的弹性霍罗夫如果你有任何问题、评论或贡献,请随时联系我。
致谢
我们想承认以下个人的工作:
- 理查德Liaw和任何夸张团队努力融入Horovod与Ray,包括Horovod在Ray Tune,他们继续支持射线在优步
- Fardin Abdi和Qiyan张他们在将弹性霍罗夫与佩罗顿集成的工作
- enrico minack.从G-雷竞技是骗人的研究为了他对弹性霍洛夫的工作及其与之集成Horovod在火花
- 易王为了他的工作Elastictl.整合和基准测试弹性霍罗维多
- 作者的https://github.com/kuangliu/pytorch-cifar.用于提供用于培训模型的Pytorch模型定义
我们还要感谢所有Horovod贡献者,没有这项工作,不可能是持续支持Horovod项目的Linux基础,以及为支持我们的持续整合系统提供学分的AWS。









