从Python和PySpark——统一的单台主机和玛吉分布式深度学习

下载幻灯片

分布式深入学习提供了许多好处——更快的训练模型使用更多的gpu,在许多gpu并行hyperparameter优化,并行消融研究来帮助理解深层神经网络的行为和性能。3.0与火花,火花gpu来执行人,分布深度学习使用PySpark现在是可能的。然而,迭代模型开发PySpark提出的挑战——在开发机器上开始(笔记本电脑),然后重写他们在基于集群的环境中运行。

在这次演讲中,我们将介绍一个开源框架,玛吉,可以写一次训练功能,可以在单台主机Python程序中重用和集群规模PySpark项目。培训功能与玛吉看起来像是我们提出最佳实践TensorFlow程序依赖项使用流行的编程习语(如函数来生成模型和数据批次)。在一个Jupyter笔记本,开发者可以混合香草Python代码开发和测试模型在他们的笔记本电脑PySpark-specific细胞时,可以运行一个集群使用PySpark内核是可用的,例如Sparkmagic。这种方式,深度学习模型的迭代开发成为可能,从笔记本到集群和回来,用干代码在训练函数,代码重用相同的所有阶段培训。

看更多的火花+人工智能会话

免费试着砖

视频记录

在这个演讲,所以,我们想给你如何进行机器运行模式发展。,特别是,当你做的事情,例如,探索性模型开发单个主机上的Python环境,然后你想要的规模在你所有的数据都在一个分布式环境中根本不需要重写代码之间移动这些步骤。

从Python和PySpark统一单台主机和玛吉分布式机器学习

如果我们看一下模型的发展

莫模型开发

和步骤,在这个演讲,我们不会覆盖特性工程和服务功能管道和模型,但我们可以大致分为四个步骤。

这四个步骤的数据通常涉及某种形式的探索。你的模型来构建一个初稿找到一个你想要使用的分类器。一旦你满意,你将进入一个实验阶段评估很多不同的试验在多个机器上,直到你发现了一个很好的为您的模型超参数配置。然后你可能会做一些验证,减少一些组件的模型实际上增加了多少价值最终的模型。然后一旦你满意,你将规模和培养大量的资源在一个分布式环境中。但问题是这些步骤之间的移动,你实际上需要重写代码。尤其是,当不同分布情况下或不同的设置,你可以单台主机的实验环境,但多主机上的实验环境,导致大量的工件和非干代码。所以你会重复的代码。您将添加这取决于你使用机器框架文件,您将添加冲突很难追踪。问题变得更糟的是当你开始迭代过程和回去重复之前的步骤,基本构件的数量将翻倍。 So the open source community has developed a lot of nice tools to tackle this problem, like MLflow to track your experiments, or TensorBoard to track the results of your training processes.

它真的很喜欢

但事实上他们并没有真正解决这个问题的根本原因。所以它很喜欢,这是一个痛苦。

和吉姆会谈论这个问题的根源。——这是一个软件工程的问题为主。和这里的问题是,当您开发一些代码,你可能会有一个小的子集的数据。

根源μ模型的迭代开发

你会有你的笔记本电脑。你会写一个笔记本和一个Python程序。如果你正在运行一个笔记本,你可能使用一个Jupyter面板,然后当你决定好了,我要进入实验阶段。我将工作在一个大的数据量,模型设计。这是如果我们看看莫里茨提出的图,我们可以看到,这是假设你前进,你永远前进。我们要尝试不同的超参数组合。然后你知道消融研究了解不同组件的影响在我的模型和最终模型的准确性。然后我将列车的大量数据在分布式模型的训练。然后我要做,但它从来没有像这样在实践中。我们总是需要回去。 We may decide that we need to add a new feature because the final accuracy is not good enough. We may decide we need to drop features. We just may decide we need to add new regularization components. And this continual process of iteration of development, basically means you need to move through the four different code bases that Moritz presented. Now not everyone will have all those four code bases. You may skip ablation studies. You may just have typically hyper parameter tuning. You will typically also work on the small subset of data and if you have a larger problem, you might have distributed training. In this case we mean data parallel synchronous stochastic gradient descent. But even if you don’t have all of the phases, models are getting bigger, datasets are getting bigger and distributed. Deep learning in particular is becoming a very important technology with which to develop models. So we know what the problem is and we know that there’s a software engineering issue which is related to how do we move between these different phases.

迭代开发是一种痛苦,我们需要干燥的代码每一步训练的需要不同的实现代码

现在目前,这些不同的阶段我们有第一个马克丹尼斯EDA或探索性数据分析。你会有一些例如Python代码在你的笔记本上。也许你不因素代码特别好,和你有一个培训循环和模型创建的数据集生成所有散落在代码和你去超参数调优和你说我要重写。我们有不同的形状,代表真的会不同的代码库。和并行也是一样消融研究如果你决定包括他们和分布式训练。所以如果你要重写代码,我们不希望你这样做,我们要做什么?所以我们都深深思考这个,我们想出了一个新的抽象,我们称之为一个无视训练函数。

的训练函数

一个无视训练函数是核心训练的一段代码,我们想要改变之间的所有这些四个阶段。所以这个核心代码是你要使用的核心代码来创建模型,得到你的数据集样本,编制和火车模型。我们希望这是不变的所有阶段。的好处,这显然将使(喃喃自语)的应用程序开发。所以从分布式训练回到你的笔记本电脑不应该添加一个新特性是一个很大的问题。所以无视训练函数来自这个想法的透明度,应该对应用程序透明,当你运行它,不管什么阶段你运行这段代码,和这个无视训练函数,它不应该关心它是否运行在你的笔记本电脑还是一个集群上运行。应该是透明的,代码或无视。现在的挑战我们在这样做,因为如果这是一个容易的事,有人会做了,是为每一个不同的机器学习框架,他们介绍不同的概念和库通过这些不同的阶段。

挑战:突兀的框架构件的例子:TensorFlow

那么如何分布?如何并行化实验?你好例如集体在使用如果你做分布式深度学习。我可以给TensorFlow的例子,因为我们今天所做的工作一直是TensorFlow和Keras。TensorFlow,如果你要做分布式深度学习。所以并行深度学习,你必须设置一个环境变量称为TF_CONFIG IP地址的所有工人。我们必须决定分销渠道策略。如果是(喃喃自语),例如,这将是一个分布策略。当我们共享数据集进行训练时,我们如何分享,在工人?我们有一个分布式文件系统可用吗? And then if we’re working with Keras or the estimator framework intensified, or if we have custom training loops, how do we integrate all this? So what the framework needs to do is abstract out these different components that you have in your existing machine learning frameworks, so that the core oblivious training function remains unchanged between the different phases. – So if we take a bigger picture and look at where deep learning is actually headed and how we can make use of this oblivious training function to keep our codes transparent, we can look at recent adoption of machine learning frameworks, like Keras and PyTorch, and why they’re actually so popular among data scientists.

生产高级api或数据科学家为什么喜欢Keras PyTorch

的主要原因是,他们非常高效和高水平。你也可以看到,通过使用Keras TensorFlow作为他们的主要API现在TensorFlow,这些高水平生产API,他们真的帮助我们从一个想法实现快速而来,我们就可以开始实验。从这一点上,它变得更加模糊。所以你需要考虑你要的基础设施上运行这些实验。例如,我们使用Hopsworks开源平台,我们正在开发。bob下载地址bob体育客户端下载您可以使用火花数据断裂。您可以使用纯Apache火花,或者每一个云提供商的产品来解决这个问题。一旦我们得到了我们实验的结果,实际上,我们应该利用工具MLflow和TensorBoard可视化结果跟踪结果,基本上迭代速度上我们的想法和更富有成效的迭代开发。

我们如何保持我们的高级api

所以问题是,我们如何保持这种高水平的api和我们如何保持透明和高效?吉姆已经说过,实际透明代码是什么?

透明的代码是什么?

用透明代码的意思是,当你在纯Python开发模型,标准Python,我们想要在Apache火花或其他执行引擎无需做任何更改这个模型的核心代码。

所以要做到这一点,我们需要意识到,我们需要有一些构建块。第一个是,我们需要看到实际分布上下文,我们都在。单一主机环境解释本身。这是我们的单台主机Python环境,我们知道。当你搬到实验,如类型的参数调优或烧蚀研究中,它实际上是一个平行的多宿主环境,我们训练大量的并行模型,但它们是相互独立的。所以没有这些模型之间的通信需要。然后当我们搬到分布式训练,它实际上是分布式多主机之间的协调和沟通,我们需要某种工人。我们通常使用一个环或减少算法来实现这一交流。

模型开发最佳实践

和第二部分实现的训练函数几个核心模型开发最佳实践,和我们看到的社区已经开始采用这种,我们的意思是你应该封装模型生成代码在一个类或一个Python函数,返回模式,这样你可以参数化函数并根据例如更改模型超参数。和相同的数据集,你想封装在一个类或函数,这样您可以稍后,只是开关和其他地区。然后最后但并非最不重要的是你需要某种训练逻辑,描述核心训练循环,或假设这将梯度下降优化循环。然后我们有另一个工具,它是使用回调,允许我们钩到训练循环运行时拦截它,或从中获得更多的信息,当我们需要它。

的训练函数作为一个抽象让系统处理的复杂性

如果我们手头有这两个概念,那么我们可以让系统照顾很多参与分配的复杂性,并使我们的代码透明的。单台主机环境中,我的意思是,例如,只是修复超参数和启动功能,参数调优,它只是启动试验或有不同的参数化实例化的函数从旧生成新的试验结果和收集并记录结果。和在分布式训练,比如设置TF_CONFIG、包装模型和分配策略和发射的工人在他们的不同的角色分配培训。

玛吉

去年在火花峰会上,我们介绍了玛吉火花作为超参数优化的框架。今天我们想让玛吉更全面,并允许这些无视训练函数执行在不同的分布情况下,让我们的模型开发透明。

Hopsworks——获奖Pam

与Hopsworks,我们这样做,我们赢得了几个价格Hopworks都是开源的,所以你可以去开始自己玛吉和Hopsworks。bob下载地址

回顾:玛吉-异步bulk-synchronous试验引发火花

只是快速回顾一下,玛吉允许我们安排机器学习试验异步火花。这意味着我们绕过障碍阶段结束时的同步火花像同步执行模型。因此我们不要浪费计算,我们通过阻断执行人很长时间运行的任务,允许一些任务和司机之间的通信。

回顾:解决方案

从而我们能够运行多个机器学习试验相同的任务。因此我们有一个同步节约资源。,今天我们介绍的是还不仅这些任务要求新的试验当他们完成培训前一个,但是他们也可以注册信息与司机,这样司机就可以发送信息,建立上下文之前发射训练函数分布在这些工人或执行人。

如果我们看看API,我们真正想要的是我们有一个培训功能和培训功能只是纯Python函数没有任何进一步的修改。我们刚刚推出,训练函数启动Python库,通过玛吉在不同的背景下,没有做任何进一步的修改。通过这样做你可以单台主机之间移动和多主机很容易,因为你可以把Python函数并执行它在Python内核,你通常会做的事情。

和演示演示所需要的最少的代码变更和需要遵循的最佳实践来达到这种程度的透明度。(吉姆),所以现在我要演示的培训功能,展示所有这一切看起来就像额外的代码。所以我开始Hopsworks集群。如果你想尝试一下自己,您可以创建自己的Hopsworks实例。ai我创建了一个项目对于此演示,我们将使用主要Jupyter服务和实验服务。我已经开始与火花笔记本服务器会话,与六动态执行人。我们有六个的并行性。通常当你想做模型开发,你一开始就像我说的,一个简单的Python的内核。所以我有一个笔记本和一个Python内核。我只是把一个例子从Keras网站,MNIST模型,幸运的是它已经重构是根据我们的最佳实践,我们需要能够运行这个的培训功能。 So we have a model of function containing our model logic. We’re turning the Keras model, a dataset function to return the TF datasets. And then you can do your model debugging or model development by simply getting the model. You can look at the summary at the training logic. So compile the model, get the datasets and start training. This is nice in a Python (mumbles), because you get immediate feedback on the progress and on possible errors. So however we wanna take this model now and move to hyper parameter optimization once you think it’s ready for that.

如果我们在这里,我们有PySpark内核在这个时间,我们需要做什么改变,以便利用超参数优化和功能紊乱吗?所以我们需要一些超参数。我将使用在这种情况下,内核大小池大小,也或许辍学率。为了可以参数化这个模型中,我们也需要将这些超参数添加到我们的函数签名。

在这种情况下,数据保持不变,因此我们可以重用相同的功能。现在我们来到了模型逻辑。这个我们要做的是将它在另一个Python函数,所以我们可以船这个Python函数执行人执行不同的超参数组合。所以我们需要添加内核,池和辍学可参数化的。为了能消融之后,我们还需要使模型功能,以及数据集函数实际上是可插拔的。这里同样的事情,我们希望能够将模型自动替换为低质的,所以你需要交换这个模型基本功能的占位符。又需要通过超参数,这作品和相同的数据集。

现在我们有了这个完全可插拔,可参数化的培训功能。唯一剩下的只是因为我们想优化一些,我们简单地返回我们要优化的指标。在这种情况下这火花类别像你看到的。

另外对于超参数优化,我们需要一个搜索空间,所以我们定义的超参数,画出样本的可行区间。然后我们可以导入实验模块,设置此实验的名称,

设置数据集发电机,发电机的模型,设置上下文,通过优化器,在这种情况下我们要使用随机搜索,但是我们也在研究通过添加用户优化。和搜索空间,然后我们可以登录这个实验,这将启动与不同组合的训练函数的执行人。

因此,尽管这是跑步,我也会消融研究解释。如你所见,我们得到好的反馈在实验的进展在Jupyter笔记本。所以没有必要去引发UI。如你所见,它还包括早期停止,这意味着我们可以停止不佳的早期试验,为了节省资源,尝试更多的组合在同一时间。如果你感兴趣,我建议你看我从去年的火花峰会讨论。

在烧蚀研究中我们要放下某些组件的模型,看看他们的实际贡献模型。在这种情况下我想保留回旋的层。我们利用Keras的特性,它可以让你给Keras模型的组件名称。这些是将使用这里定义,玛吉为了从模型中删除这些组件。然后当我们开始消融研究中,我们需要解决一些固定的超参数值。你可以修复一个随机值,但在本例中,我们想要使用之前最好的类型的参数组合优化被发现的实验。然后再一次,我们切换上下文消融传递一个烧蚀体在这种情况下,离开一个组件。这一次将一个组件,消融研究对象和参数,我们想要修复。我们做一个登录。现在我们做一个快速的脚快进,直到这两个实验已经完成了。

所以我们两个实验已经完成了正如你所看到的,我们也得到了所有的打印Keras执行人在我们的笔记本,这很好有时做调试。

相同的烧蚀实验。我已经开始分发培训,这种情况下我也只是设置上下文分布式训练。我通过我想使用策略,因为我使用六个执行人,我想做多工作策略。而且如果举个例子,如果你有多个gpu在一台机器上,你可以做一个执行人与多个gpu和镜像策略。我又一次进入超参数训练为了修复它们。

现在这是运行在所有六个执行人。,例如,如果您会注意到,有了你的模型在消融研究或超参数优化过程中,如果你想要回到一个宿主环境很简单,你的训练函数,传递函数模型中,数据集函数和一组固定的超参数,再次手动启动它在Python内核。所以没有更多的变化。这就是我想告诉你,你可以运行相同的功能在所有的三个不同的情况下,无需修改。现在你也可以得到更多的反馈从模型训练,如果你想使用TensorBoard我们提供使用正常TensorBoard回调的可能性。和你唯一必须使用TensorBoard从玛吉为了调用模块动态生成每个试验的锁定装置在一个实验目录。如果你这样做…现在我当前运行的分布式训练实验。正如你可以看到我们的实验步骤记录所有这些,因为它实际上啤酒花首先推出的训练函数,我们可以收集大量的元数据,您不需要显式的日志调用

跟踪你的元数据。我们都知道跟踪元数据是很困难的,但这种方式我们称之为隐性出处相比,例如明确的出处,如果你会使用MLflow,必须显式地调用MLflow锁定某些参数。这已经结束了。,这些都是前两个实验是消融局部实验,和超参数优化实验。正如你所看到的,它记录所有的试验训练。你可以看看日志,它生产,生产和度规。我们甚至把iPad笔记本的快照

并检查出你的模型看起来就像在那个时间点当你训练来做这个实验。

我说你可以使用TensorBoard。例如,我跑一个额外的实验之前,我已经推出了TensorBoard。我们利用新时代HParams TensorBoard插件。你可以看看你的单身试验。在这种情况下我只训练两个顶点为每个审判。您可以使用该视图平行坐标检查超参数导致良好的精度为例,通常或你可以看看你的标量图在标量步骤为每个审判。如果你运行试验,这当然会有点混乱,但是你可以选择你想要的试验看看例如在特定的。是的演示到此结束。我希望它是有帮助的。

让我们回到演示。谢谢你!——所以接下来是什么?现在我们已经遗忘的训练函数,分布环境我们想利用另一个开源Netflix的造纸厂,这将允许我们实际上也,即使代码还在笔记本上,我们可以安排在不同的上下文中通过参数化整个笔记本与上下文。bob下载地址例如,然后我们可以简单地把一个笔记本已经和再培训,例如如果我们前面漂移检测模型,与另一个上下文,而无需再次完全重写代码用于分布式训练。

总而言之,我们显示移动的不同分布之间的上下文实际上需要重写代码。但是我们要做的是使用突兀的框架构件。我们想把它们,这样我们真的只保留纯Python代码模型的定义。然后我们可以做所有的复杂性与框架的范围之外的Python代码。让系统为您处理的复杂性和分布上下文。通过这样做,我们能保持这个高水平生产api,我们一直在努力工作,并希望将导致更好的模型和对我们的机器学习模型发展更快的迭代。

非常感谢你的注意。这里的资源,你可以开始以及如何联系我们在推特上,或通过网站。我想特别感谢我们的团队,Sinha罗宾·亚历克斯凯,他们也在这工作。

看更多的火花+人工智能会话

免费试着砖
«回来
对莫里茨迈斯特

逻辑时钟AB

莫里茨迈斯特是一个软件工程师在逻辑时钟AB, Hopsworks的开发人员。莫里茨在计量经济学背景,持有米兰理工大学计算机科学硕士学位和大学为马德里。他曾担任过项目数据科学家为德国电信在德国和德国汉莎航空公司,帮助他们productionize机器学习模型来改善客户关系管理。

关于吉姆·道林

逻辑时钟AB

吉姆Dowling的首席执行官逻辑时钟和k皇家理工学院的副教授。他是首席架构师的开源Hopsworks平台,横向可伸缩的数据机器学习的平台,包括存储行业的第一个特征bob体育客户端下载。