基于HorovodRunner的Apache Spark集群上卷积神经网络的基准测试和操作方法

下载幻灯片

分布式深度学习任务快速迭代的自由对于小型公司从大型科技巨头那里获得竞争优势和市场份额至关重要。Horovod Runner将这个过程带到相对容易访问的火花集群。然而,在Horovod Runner本身上还没有基准测试,在Horovod上的可伸缩性基准测试也非常有限,因为它的前身需要自定义构建GPU集群。我们第一次展示了Databricks的Horovod Runner在GPU和CPU集群上基于卷积神经网络(CNN,下文)的任务上实现了显著的缩放效率提升。

我们还在《Horovod Runner》中首次实现了修正的Adam优化器。除了展示测试结果,我们还将讨论我们在如何做到这一点上学到的经验教训,例如:

  1. 集群设置
  2. 分布式模型检索
  3. 如何避免Horovod时间线,但仍然得到培训时间
  4. 如何使用矫正亚当
  5. 什么类型的模型将获得扩展效率,为什么,等等。

点击这里观看更多Spark + AI课程

免费试用Databricks

视频记录

大家好,我是文道。感谢你今天来参加我们的演讲,今天我将向你介绍潘静,关于基准测试以及如何在HorovodRunners上分发深度学习。所以我们都看了eHealth,你们可能不熟悉eHouse是一个保险经纪人,帮助人们找到最适合的,负担得起的保险计划和医疗保险计划。我在eHealth担任高级数据科学家,我的工作是将工程和数据科学结合起来,因此数据管道和最终数据产品。目前我正在攻读工商管理博士学位。-大家好,我是潘静,今天我和文道一起主持。我在eHealth工作,是一名高级员工用户体验研究员和数据科学家。-在这次演讲中,我们开始讨论霍洛维德及其工作原理。然后我们会跳到霍洛维德狂人和霍洛维德基准。最后,我们将深入了解如何使用HorovodRunners。 So the first question that I wanted to address here is why do we need a distributed deep learning system?

为什么是分布式深度学习?

因此,随着数据规模的增加和更深层次模型结构的日益不同,改变过程可能需要几天甚至几周的时间,而加快速度的方法是利用分布式深度学习系统。有很多系统,但其中最受欢迎的是Horovod,它是开源的,并且是一个维护良好的库,这使得分布式深度学习非常容易使用和快速。bob下载地址

满足HOROVOD

因此使用它只需要稍微修改一个注释,深度学习代码就可以在Horovod上进行分布式学习,它已经被证明具有很高的扩展效率,目前支持四种流行的框架Tensorflow, Keras, pyTorch和MIXNet,它还支持Horovod深度学习系统的两个主要类别,即数据和模型并行。所以在这种模型并行方法中,我们本质上是在不同的处理单元上实现相同的模型,不管你是否将数据的不同部分适合于个人单元。但另一方面,模型并行性是一种通过拆分模型改变当前单元上的相同数据并将其纳入不同进程单元的方法。在大多数情况下,你可以把你的模型装进一个GPU,但不能装进数据。因此,数据更有可能成为瓶颈。所以在这次演讲中,我们只关注数据并行,我会带你们通过直观的方式了解Horovod在数据并行之前是如何工作的。

因此,就数据能力监听方法而言,本质上,你的数据被划分为接近均匀大小的数据块,并发送到不同的处理单元。不同的处理单元接收相同的模型。所以当他们开始训练时,他们将有相同的模型设置,每个处理单元将独立计算梯度。但在每个过程结束时,你需要与其他设备通信,以确保它们可以平均梯度。所以在下一次迭代中,他们使用了相同的模型权重集。最直观的方法是将所有的梯度平均值发送到一台机器,然后再将所有的梯度平均值发送回所有的处理单元。这种方法叫做参数服务器方法。许多深度分布式学习系统实际上实现了这一点,例如TensorFlow。但是你会注意到,很多人都知道是在和OneNote通信,这会让这台机器很快成为网络通信成本的瓶颈。随着规模的增加系统的复杂性也会增加模型的使用。 So instead the Horovod was used for what’s so-called Ring-AllReduce Approach. To explain this more intuitively I would like to use where the Horovod name come from.

HOROVOD

Horovod实际上是以传统的民间舞蹈命名的,舞蹈参与者用液体的手在这种圆形的形状跳舞。

在这张图中,我们有16个舞蹈参与者,你可以看到他们中的一个,每个人都像一个处理单元。然后我们给它们从0到15的单元数一旦每个处理单元完成分类和梯度就会开始以这种圆形的形式传递梯度从0到1,从1到2。一旦第1圈回到了0级的机器这个机器就拥有了所有链上的梯度。然后取出平均值并广播给每个处理单元。所以在开始到下一个过程中,所有的模型都将开始完全相同的方式。所以通过这种方式,我们可以确保座右铭以一种非常一致的方式改变。

这是霍洛维德理论的一个简单的转移。但是现在你应该已经有了大致的概念,当Jing Pan带着你所有的代码细节,然后你就有了第二部分,你临时的第一个概念,希望你能帮助你更好地理解它。那么缩放效率如何,Uber实际上在ResNet 101和VGG-16部分发布了基准答案报告,其中XXS的GPU数量,而每秒NH可以用于性能指标。

HOROVOD基准

你会看到透明的矩形条,这是最优的缩放效率。想象一下,你有线性的GPU,你会得到更多的性能,比如GPU上的32核,我们比单个GPU快32倍。其中蓝色条是实际性能,深蓝色只表示使用数据网络。因此,这个基准测试确实证明了它具有非常出色的技术和效率,即使是在网络相对密集和相对浅的VGG 16的情况下。但它的技能还是相当不错的。但我想在这里提到的一件事是,这个基准测试是基于优化的网络和基础设施。因此,你将需要专门的工程资源来设置它,包括容器MPI和NCCL,即使许多大型实现了Horovod并实现了很大的扩展效率,微调也不是一项微不足道的任务。但有一篇学术论文试图复制这样的系统,没有全面的技巧。事实上,这样的暗示,建立这样的系统不是一个微不足道的任务,我们是一个小公司从这样做。

所以他们得到了突破,提供了HorovodRunner。因此,HorovodRunner是一个通用的API,可以使用整个产品手册在Databricks上分布式深度学习工作负载。它是建立在Horovod之上的,没有必要在线路基础设施上设置。如果你使用了错误的时间5.0或两者兼有,你可以享受可怕的开箱运行,你可以从AWS和敏捷中选择云提供商,因为我们在数据库上运行,所以它将在Databricks Spark生态系统上运行。所以你会有数据准备和数据培训。然后我们用Horovod来查看一个窗口实际上假设你已经有了所有的数据已经被传播或预处理并放入不同的机器。所以这实际上是一个独立的过程,但如果你使用Horovod,你就会在一个地方,你也会享受Spark带来的所有好处,比如随机洗牌,容错,你可以使用笔记本。最后,我想提一下Databricks spark实际上是使用barrier执行模式来调度所有的作业,因为spark作业通常是独立运行的,它们只是运行得很明显,但Horovod实际上你需要协调所有不同的音符来同步所有的梯度。让我们快速看一下HorovodRunners图表。HorovodRunners你们看到的那个图正在运行你们会有Spark驱动程序和在Horovod上运行的处理单元的数量。 and you were using the barrier as solution mode to enable synchronized shootings you synchronize all the gradients and at the end of each batch and they will start all tasks gather and restart all tasks in case of a failure.

HOROVODRUNNER图

所有这些听起来都很有趣,但它的实际表现如何呢?没有可用的基准测试,所以我们决定继续执行我们的基准测试。但在我深入讨论细节之前,我想提一下,Horovod和Horovodrunner实际上提出了一些Horovod时间线,可以跟踪每个单元的状态和性能。但它对性能的影响会很严重,甚至文档也这么说,所以在Spark中,我们只是使用来自机器的标准输出日志,我们组织它来获得它们的实际性能。

基准mnist

基准测试的第一个任务,我们复制了Databrick的例子作为我们的教程,我们只是使用了非常简单的CNN模型,在两个卷积层中有两个。我们正在使用AWS C4.2xlarge实例,它是CPU,以比较从单个实例到这个核心CPU集群(最多32个核)的50个epoch上的错误时间。在图的右上角,是单个实例的性能。大约花了15秒,1500秒完成,但当我们在集群中增加大约10个cpu时,在Horovod集群中,他能够将运行时间减少一半以上,但随着GPU的增加,你会发现技术和效率逐渐下降。但这只是因为数据量相对较小,但这证明了HorovodRunner在CPU集群上可以有很大的倾斜效率。我们一直用这个数组,没有做任何优化。所以它是可复制的。接下来,我们试图复制Uber的Benchmark,并将Epoch与Epoch进行比较,看看HorovodRunner的实际表现有多好,但它实际上不是Epoch与Epoch,因为我们无法使用相同的基础设施。但是如果你使用整个舍入发件箱,你会得到相同的性能我们没有在1 - 1到2 - 2版本容量问题上用HorovodRunner和Horovod的十进制方法那实际上是Caltech101的其他部分使用的。所以我们在这里展示了Inception V3和VCG-16基准。 So the graph is to follow the same format of Uber’s benchmark so(internet breaks) representing the optimal efficiency. So you will see the injection at a core of GPU. (internet breaks) if 80% of us go in efficiency, which quite amazing. And, but as we increasing the number of a GPU, you reduce the skill efficiency to 63% and a 49% respectfully at serge 16 Cores and 32 core. But even the 32 core the 50% of us give efficiency, it’s essentially 16 times faster than running on a single machine. On the other hand the VGG is slightly harder to scale, which is same as Uber’s benchmark, but we were able to scaling Fonda 50% to 20%. So overall he demonstrated it can scale pretty well, but it wasn’t good as performance as Uber’s benchmark.

我们也尝试过其他模型,我们也尝试过在图形卷积网络上出错,这有点像一个主要的动机,一开始就尝试一下。因为图形卷积现在会有多种性能但它与更高的额外成本是分开的。我们能够在HorovodRunner上实现它,但目前没有缩放效率,因为TCA的输入实际上是一个相邻的矩阵,不能被除,所以我们无法利用数据流行的好处。我们认为股票有GCN可能能够帮助解决这个问题但我们还没有尝试过。Horovod通常优于多线程。所以如果你有一个单一的瞬间与多个GPU,我们将强烈建议你也尝试Horovod。通常大多数时候我们都在执行多线程。这就是我第一部分的总结。现在我将与Jing Pan一起深入探讨如何实际使用HorovodRunners。

-大家好,Databricks之前发布了如何用六个简单的步骤来减少大量的财富。我们将讨论如何使用Horovodrunner和避免坑软管。

当你第一次建立你的Databricks集群时,请确保使用Tensorflow 1。其次禁用SSL加密,最后但最重要的是在集群上运行这个初始化脚本,以修复除RMS prop之外的所有优化器的超时错误,并且它没有发布到任何地方。

Uber总结了五个步骤来实现HorovodRunner作为Horovod的前身。

在输入语句特定于更深层次的学习框架和初始化Horovod环境之后,您需要将整个单节点代码移动到您的Horovod HVD函数,字符串HVD然后将您的Horovod大小传递给您的实例和HorovodRunner。

初始化库

现在,恭喜你,你已经完成了第四步

Horovodrunner代码- barebone

如何画一匹马的方法都要加上小细节。

这张幻灯片显示了HorovodRunner代码中原始五个步骤的顺序和位置。初始化、引脚、换行、同步和检查点。

我们将解释另外三个引脚点、并行化数据、检索模型和记录时间。

接下来,对于环全化简为函数。我们需要确保每个worker都使用一个特定的GPU。我们不需要使用随机的GPU,而是需要列出从机中的所有GPU,然后为每个GPU分配一个不变的排名。

数据并行性

HorovodRunner的精髓来自于数据个性化。从概念上讲,训练HBD函数中的数据等于一个GPU中的数据,整个数据集应该均匀地分配到每个GPU。在一个索引解决方案中,你选择每一条按Horovod大小跳跃到一个特定GPU的下一条路。在这个例子中,所有红色的规则都到GPU 0,所有绿色的行都到GPU 1,所有紫色的滚动都到GPU k。在每个GPU中,角色的数量等于总行数除以Horovod大小。在这个问题上,每epoch的步数是多少,每epoch的步数等于GPU中的角色流除以批处理大小?

所以如果问题是绝对没有洗牌口袋文件petstorm可以洗牌默认。那么图像呢?

我们可以使用图像数据生成器在每个epoch进行洗牌,我们需要适当地设置步骤,以避免在一个epoch内重复训练图像。

我们可以使用图像数据生成器来共享每个纪元以及您需要正确设置步骤的方式,以避免在一个纪元内训练图像的声誉。

给出生成器的批处理大小,也就是一个GPU的批处理大小,你就得到了训练的总步骤,在例子中是M。然后,将用于训练的总步长除以Horovod大小,得到每个GPU中每个纪元的步数,在本例中为4。如果没有适当的步骤设置,您的代码实际上将顺利运行。我想说,损害并不是有害的。但是,因为洗牌只在每个纪元结束时才停止。如果每个纪元的步数最多,您将使用相同的图像再次对该批进行训练。这不如在新闻中随机选择一批图像进行训练有效。

其次,避免过多的箭头请求。实际上,您需要知道来自S3的保存模型。

接下来,当以分布式方式包装单机优化器时,要做的最重要的事情是按Horovod大小线性缩放线性速率。

下面是它背后的逻辑。首先,您希望在HorovodRunner中保留相同数量的epoch,从而通过增加线性速率来实现与单机相当的精度。其次,由于增加了同步批处理大小,每个纪元的步骤更少。

Vwallah !你实际上可以一石二鸟。

整流Adam优化器是一种新型优化器,具有线性速率、预热速度快、收敛速度快、初始测向准确等特点。我们是第一个在Horovodrunner中实现它的人。在修正亚当的特定参数之上。我们需要为不同的学习率添加三个额外的回调,以便在HorovodRunner中工作。第一个指标平均回调将在纪元结束时对所有流程的指标进行平均。它是有用的结合降低线性速率在平台上,它需要在接下来的两个回调之前写。

让我来热身。我们从一个小得多的线性速率开始,然后增加它。减少一些平台将降低线性速率,同时接近平台。

耳朵或收音机GPU 0更新权重从平均值在梯度。

同步和检查ckpo

对于所有优化器,您需要将更新后的权重前端GPU 0广播到其他GPU。检查点是GPU时代更新的权重。

避免HVD。时间轴

最后,霍洛维德时间线花费了太多的时间,并阻止我们看到缩放效率。你如何得到时间使用的细节而不仅仅是挂钟的时间。我们将自己的时间戳添加到Spark Master输出标准中。使用Python日志库。实际上,可以使用ML流来召回细节,将日志输出到从包节点中。

最后,我们可以从日志中提取出我们在每个步骤上花费的时间。

添加输出的时间戳示例

该日志显示了每个GPU上每个epoch的每个步骤的进度。左边是我们在右边添加的时间戳。它是标准输出。它包含关于HorovodRunner的信息:当前步骤、每个epoch的总步数、当前epoch和总epoch。

综上所述,HorovodRunner是一个很好的选择,用于分布式深入学习。与单机实现相比,它实现了显著提升缩放效率。即使它是多线程的,与它的前任Horovod相比。它以很小的扩展效率成本,消除了工程工作的开销。寒冷易骑,简单易骑,数据需要划分。改进可以通过更好的带宽和易于即时存储来实现。不要使用时间轴,要使用网络安全级别。以下是我们的完整代码的链接,我们的论文在今年的顶级AI会议研讨会triple AI上获得了认可。感谢各位出席本次会议。我们尽了最大努力使它有用。 Please do not forget to rate and review the session because we way want to help you more next time.

点击这里观看更多Spark + AI课程

免费试用Databricks
«回来
潘静简介

电子健康公司。

潘静博士是eHealth Inc.的高级数据科学家/用户体验研究员。她监督所有面向客户的建模项目和第三方服务和/或并购的技术评估。她对Spark集群上深度学习模型的生产充满热情。她是世界上第一个在2019年将Rectified Adam optimizer应用于HorovodRunner启用的spark集群用于分布式深度学习培训的人。在Fanatics Inc.,她可能是世界上第一个在2017年在Spark从节点上以分布式方式为Keras训练的深度学习模型提供服务的人。

关于刘文道

电子健康公司。

刘文道毕业于著名的德雷塞尔大学雷博商学院,获得硕士学位。他是工商管理专业的博士生,同时在eHealth, Inc.担任全栈数据科学家。他拥有罕见的商业思维和强大的技术能力,不仅能解决数据问题,还能利用数据推动业务绩效。他发现商业机会,优化产品性能并提供建议。他构建了端到端客户统一数据产品,利用机器学习技术在不同的系统之间提供可靠的链接。