Uber一个跨多台机器的分布式深度学习训练框架引入开源项目LF深度学习基金会

描述

世界顶尖科技公司的工程师常常发现,为了满足公司的独特需求,他们不得不为现有软件基础上开发定制替代方案。

近日,Uber将自己的Horovod(一个跨多台机器的分布式深度学习训练框架)引入开源项目LF深度学习基金会。Uber利用Horovod支持自动驾驶汽车、欺诈检测和出行预测,该项目的贡献者包括Amazon、IBM、Intel和Nvidia。

Horovod是一个分布式的TensorFlow训练框架,目标是使分布式深度学习快速且易于使用。在Uber内部,他们发现MPI模型比带参数服务器的分布式TensorFlow简单得多,所需的代码更改也少得多。

除了Uber,阿里巴巴、亚马逊和Nvidia也在使用Horovod。Horovod项目可以与TensorFlow、Keras和PyTorch等流行框架一起使用。

Uber上个月加入了Linux基金会,并加入了AT&T和诺基亚等其他科技公司的行列,支持LF深度学习基金会的开源项目。LF深度学习基金会成立于3月,旨在支持针对深度学习和机器学习的开源项目,是Linux基金会的一部分。

自该基金会成立以来,其他项目还包括机器学习平台Angel和弹性深度学习(Elastic Deep learning),这是一个帮助云服务提供商利用TensorFlow等框架制作云集群服务的项目。

根据Uber的说法,Horovod让开发人员只需几行代码就可以完成任务。这不仅加快了初始修改过程,而且进一步简化了调试。考虑到深度学习项目的高度迭代性,这同样可以节省大量时间。

在过去的几年里,深度学习的进步推动了图像处理、语音识别和预测的巨大进步。在Uber,深度学习应用于整个业务,从自动驾驶研究到出行预测和欺诈预防,并为用户创造更好的体验。

由于种种原因,TensorFlow已经成为Uber首选的深度学习库。首先,该框架是用于深度学习的最广泛使用的开源框架之一,这使得新用户很容易上手。

它还结合了高性能和修补低级模型细节的能力——例如,可以同时使用高级api,如Keras,并使用NVIDIA的CUDA工具包实现自己的自定义操作符。

此外,TensorFlow还支持各种深度学习用例的端到端支持,从进行探索性研究到将模型部署到云服务器、移动应用程序甚至自动驾驶汽车上。

去年,Uber Engineering推出了米开朗基罗(Michelangelo),这是一个内部的“mvc即服务”(mvc -as-a-service)平台,它让机器学习自主化,让大规模构建和部署这些系统变得容易。

Horovod正是这个米开朗基罗复杂平台的组成部分,Uber开发这个平台是为了为其内部的深度学习努力奠定基础。该公司将该软件描述为管理AI开发生命周期各个方面的端到端系统。

鉴于Uber此次宣布开放Horovod,它可能还会随着时间的推移发布米开朗基罗其他组件的代码。

Horovod的出现,也反应不同企业在纵深涉及深度学习时遇到了不少问题。

随着Uber使用越来越多的机器学习模型,它们的规模和数据消耗显著增长。在大多数情况下,模型仍然足够小,可以容纳一个服务器中的一个或多个GPU,但是随着数据集的增长,训练时间也在增加,有时需要一周甚至更长时间。

此后,Uber转向了分布式深度学习训练。标准的分布式TensorFlow包引入了许多新概念:workers、参数服务器、tf.Server()、tf.ClusterSpec()、tf.train. syncreasoptimizer()和tf.train.replicas_device_setter()等等。虽然对某些场景有益,但这也引入了难以诊断的bug,从而减慢了训练速度。

第二个问题是关于Uber规模计算的挑战。在运行了一些基准测试之后,他们发现不能使标准的分布式TensorFlow按比例扩展,以及需要的服务。例如,在128个GPU上进行训练时,由于效率低下,损失了大约一半的资源。

当Uber在128个NVIDIA Pascal GPU上运行标准的TensorFlow基准测试套件时,他们发现Inception V3和ResNet-101模型都无法利用将近一半的GPU资源。

标准的分布式TensorFlow包使用参数服务器方法来平均梯度。在这种方法中,每个流程都有两个潜在角色之一:Worker或参数服务器。Worker用于处理训练数据,计算梯度,并将它们发送到参数服务器进行平均。

Uber认为,虽然这种方法提高了性能,但遇到了两个挑战:确定Worker与参数服务器的正确比例。

如果使用一个参数服务器,它可能会成为网络或计算瓶颈。如果使用多个参数服务器,通信模式将变成“all-to-all”,这可能会使网络互连饱和。

处理增加TensorFlow程序复杂性:在测试中,每个用户的分布式TensorFlow必须显式启动每个Worker和参数服务器,通过服务发现周围信息,如所有的Worker和参数服务器的主机和端口,并修改培训计划构建tf.Server()和一个适当的tf.ClusterSpec()。

此外,用户必须确保使用tf.train.device_replica_setter()适当地放置所有操作,并修改代码以使用towers来利用服务器中的多个GPU。这通常会导致陡峭的学习曲线和大量的代码重构,从而占用实际建模的时间。

2017年初,百度发表了一篇文章《将HPC技术深度学习》,涉及到不同的算法平均梯度和沟通这些梯度(上面的第2步和第3步),该算法基于Patarasuk和Yuan在2009年的论文《工作站集群带宽最优全约算法》中引入的方法。

在环约简算法中,每个N个节点与两个节点通信2*(N-1)次。在此通信过程中,节点发送和接收数据缓冲区的块。在前N-1次迭代中,接收到的值被添加到节点缓冲区的值中。在第二次N-1迭代中,接收到的值替换节点缓冲区中保存的值。

百度的论文认为,该算法是带宽最优的,这意味着如果缓冲区足够大,它将最优地利用可用网络。

Uber也意识到,采用环减少(ring-allreduce)方法可以提高可用性和性能,这促使我们自己开发实现,以满足Uber的TensorFlow需求。随后,Uber采用了百度的TensorFlow ring-allreduce算法,并在此基础上进行了构建。

Uber将代码转换为一个名为Horovod的独立Python包,这个包是以俄罗斯传统的民间舞蹈命名的,在这种舞蹈中,表演者挽着手臂绕圈跳舞,就像分布式TensorFlow进程使用Horovod彼此通信一样。

Uber目前的不同团队都可能使用不同版本的TensorFlow,但他们希望所有团队都能够利用ring-allreduce算法,而不需要升级到TensorFlow的最新版本,对自己的版本应用补丁,甚至不需要花时间构建框架。

有了一个独立的包,Uber表示就可以根据硬件的不同,将安装Horovod所需的时间从大约1小时缩短到几分钟。Horovod在Inception V3和ResNet-101中都达到了90%的缩放效率,在VGG-16中达到了79%的缩放效率。

此外,Uber用NCCL替换了百度ring-allreduce实现,NCCL是NVIDIA的集合通信库,它提供了高度优化的ring-allreduce版本。NCCL 2引入了跨多台机器运行ring-allreduce的能力,能够利用它的许多性能提升优化。

Uber还在此基础上增加了对适合单个服务器模型的支持,可能是在多个GPU上,而原来的版本只支持适合单个GPU的模型。

Horovod项目负责人亚历克斯•瑟盖夫(Alex Sergeev)表示,Horovod是为了让各行各业的人工智能研究人员能够更快、更直观地进行深度学习模型训练。后续随着Horovod在功能和应用方面的不断成熟,加入LF将使我们能够进一步扩大它在开源生态系统中的影响。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分