我们最初开源霍洛维多自那以后,它已经成长为行业中的标准解决方案,用于将深度学习训练扩展到数百个gpu。使用Horovod,只需在现有的TensorFlow、PyTorch或Apache MXNet培训脚本中添加几行Python代码,就可以将培训时间从几天或几周减少到几小时或几分钟。
Horovod社区持续增长,最近在GitHub上超过了1万颗星星毕业Linux基金会内的AI和数据库中的状态。今天,我们很高兴地宣布v0.21,这为Horovod社区带来了一些强大的新功能,以便比以往任何时候都更快,更容易培训深入学习模型。
v0.21中的新特性包括:
- TensorFlow v1和v2的局部梯度聚合确定人工智能。
- 分组已释放以减少延迟和改善决定歧视nvidia.。
- 支持易于配置弹性Horovod工作射线经过Anyscale。
- 支持DataBricks运行时Horovod Spark估算砖。
局部梯度聚合
局部梯度聚合是一种在网络带宽受限的设置下减少通信开销的技术,当你的GPU处理批次的速度比你的网络传输梯度在工人之间聚合的速度快得多。它的工作原理是将梯度更新累积到GPU内存中的局部模型中,将最新的更新与上次通信以来累积的更新相加。当配置了N个小批量后,Horovod执行一个重新征求到网络上的平均渐变,然后将更新应用于模型。
本地梯度聚合等同于使用较大的有效批量尺寸。但是,与直接增加批量大小不同,当您使用本地梯度聚合时,有效的批量尺寸增加不受可用GPU内存的限制。工人每单位沟通增加他们的计算量。实际上,局部梯度聚合都增加了批量大小并减少了n的因子。如果通信开销限制了模型训练性能,则可以启用本地梯度聚合以增加吞吐量。
在过去,Horovod仅支持使用Pytorch的局部梯度聚集。现在在V0.21中,确定的AI在TensorFlow中为局部梯度聚集进行了贡献,包括v1和v2,渴望和图形模式和keras。
通过设置该参数,可以启用局部梯度聚合backward_passes_per_step初始化HOROVOD Optimizer时需要的聚合频率:
关于局部梯度聚合如何工作的更多细节,以及你如何开始在Determined平台上使用它,请参阅Determined AI的完整博文:雷竞技到底好不好用利用局部梯度聚合优化Horovod。
分组重新征收
这篇论文科学逆问题的百亿亿次深度学习介绍了分组的解除寿司作为优化Horovod在超级计算规模训练时优化Horovod性能的方法。在V0.21中,NVIDIA贡献了一般的API,以使分组的霍罗夫多德社区分组的绩效改进。
分组Allreduce让用户可以显式控制Horovod如何为Allreduce融合(或“分组”)张量。特别地,当你提供一个张量列表时hvd.grouped_allreduce,它在逻辑上将其视为单个请求,并且后端只在列表中的所有张量都可用时才会处理它。
这与霍洛维德的正常做法形成了对比张解融合它将小请求批量处理成单个请求重新征求。没有分组的,Horovod会贪婪地融合了任何准备的张量重新发布当它们可用时。虽然这种贪婪的融合在许多情况下都是合适的,但是在许多情况下,您可能希望更好地控制这种融合的完成方式。
一种情况是,当您希望通过减少来降低Horovod协调/谈判的延迟HOROVOD_CYCLE_TIME,还要确保融合的所有reduce消息不变得太小。这在以前是不可能的,因为融合消息大小和周期时间是紧密耦合的。通过定义显式组,您可以自由地将周期时间减少到更快的协商和协调所需的最低值,同时保持合理的消息大小以提高网络效率。
第二种情况是当你想从Horovod得到确定性操作时。融合缓冲的动态填充会导致所有的减少结果不确定性。这是因为张量在融合缓冲中的位置会影响求和顺序。在此之前,从Horovod得到确定性结果的唯一方法是通过设置完全禁用融合HOROVOD_FUSION_THRESHOLD = 0。然而,这带来了吞吐量的相关损失。现在,通过明确地定义融合组,您可以获得确定性的融合,因为分组可以通过设置环境变量,保证Horovod以确定性的顺序(迭代到迭代,运行到运行)打包融合缓冲区HOROVOD_DISABLE_GROUP_FUSION。此设置可防止组融合到更大的群体中,否则将重新引入非确定性。
属性可以启用分组Allreducenum_groups参数的分布式Optimizer,或直接调用hvd.grouped_allreduce在张量列表中:
通过设置num_groups, Horovod自动将梯度张量列表分割成请求数量的组。对于组放置的更多控制,您可以应用hvd.grouped_allreduce函数直接指向一组张量。
射线上的弹性霍罗夫
在v0.20中,我们介绍了弹性Horovod,我们的TensorFlow和Pytorch的自动缩放和容错API。现在在v0.21中,您可以使用只使用几行代码在抢占云实例上发布此类作业霍罗夫德在雷的弹性执行者:
这个API为现有的Ray集群带来了容错、自动扩展的分布式训练。与传统的分布式培训工作不同,使用ElasticRayExecutor,您可以安全地在一个可抢占/现场实例集群上进行培训,这些实例在整个培训过程中可能会在集群中出现或消失。
Horovod Spark Estimators on Databricks
Horovod火花估计使您可以使用Horovod培训深入学习模型,作为任何Pyspark管道的一部分。现在在V0.21.0中,Databricks已添加支持在Databricks运行时运行Horovod Spark Estimators进行机器学习环境(AWS.|Azure)。
要开始,只需创建一个DBFSLocalStoreDatabricks将存储中间培训数据:
这DBFSLocalStore使用DBFS本地文件api (AWS.|Azure)作为中间数据和培训伪影的商店。
Apache Spark 3.0为Spark添加了GPU感知调度,在Databricks Runtime 7.0 ML GPU及以上版本中,这种能力是预先配置好的。见GPU调度说明(AWS.|Azure)有关详细信息。
通过估算器API,Horovod在每个工作人员上启动任务等于每个工作人员的GPU的数量,每个任务都将介入由Spark分配的单个GPU。
对于更细粒度的控制,Horovod还提供运行API,因此可以使用指定训练逻辑的lambda函数进行训练。有了这个API,函数get_available_devices ()从horovod.spark.task返回调用它的Spark任务的分配GPU列表。看keras_spark3_rossmann.py以获取使用的例子get_available_devices ()使用RUN API。
下一步是什么?
我们的下一个主要的里程碑是Horovod项目的v1.0,巩固了核心API和新推出的弹性Horovod API。作为这项努力的一部分,我们将重点关注以下优先事项:
- 更高级别的API,用于简化弹性训练和数据加载。
- 所有支持的框架之间的特征奇偶校验:TensorFlow,Pytorch和MXNet。
- 改进错误处理,消息传递和调试性。
- 使用弹性Horovod减缓/移除工人。
此外,在未来几周,我们将更多地讨论我们最近与AnyScale合作分布式Hyperparameter搜索使用雷调我们计划在不久的将来扩展这项工作。
要了解更多信息,请访问Horovod网站GitHub.和v0.21.0的完整发行说明在这里。期待在那里见到你!
致谢
我们要感谢我们了不起的个人和企业贡献者社区,包括:
- 亚伦Harlap和尼尔康威从确定人工智能获奖原因是他们在局部梯度聚合方面的研究。
- 乔什·罗梅罗从nvidia.获奖原因是他在分组Allreduce和其他方面对霍洛维德的性能进行了改进。
- 理查德Liaw从Anyscale是,他在Ray上的Horovod工作,包括射线和射线曲调集成的弹性Horovod。
- 梁张和Xiangrui孟从砖他们致力于将Horovod集成到Databricks运行时中。
- enrico minack.从G-雷竞技是骗人的Research为改善火花集成和Horovod的连续集成系统的工作。
- Leonard Lausen.从亚马逊他在支持MXNet集成和改进Horovod构建系统方面的工作。
- 尼古拉斯队伍从英特尔他致力于将Horovod构建系统迁移到CMake。
我们还要感谢Linux基金会继续支持Horovod项目,感谢AWS为我们的持续集成系统提供信用支持。








