【ML】第 1 章 :分布式机器学习:术语和概念

  🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​

📣系列专栏 – 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】

【ML】第 1 章 :分布式机器学习:术语和概念​​

 🖍foreword

✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。

如果你对这个系列感兴趣的话,可以关注订阅哟👋

文章目录


还记得数据科学家在适合笔记本电脑内存的数据集上运行他们的机器学习算法吗?还是自己生成数据?这与世界上缺乏数据无关。那时,世界已经进入了 Zettabyte 时代,从 Cisco Systems 宣布其全球 IP 流量在 20XX 年达到约 1.2 Zettabyte 的峰值开始。对于许多人来说,数据就在那里,但它被锁定在大规模创建、捕获、复制和处理数据的生产系统中。这样的规模本可以让数据科学家产生更好、更深刻的机器学习模型。

计算呢?当数据科学家最终获得数据时,数据非常庞大,他们不得不将其采样到有限数量的 CSV 或文本文件中。但是,在许多情况下,他们无法获得足够的计算能力或工具来支持在大型数据集上运行机器学习算法。

随着公有云革命在 2016 年至 2017 年左右逐步推进,我们终于可以获得所需的计算能力。我们只需要一只手拿着信用卡,另一只手拿着电脑鼠标。单击一下按钮和繁荣,现在有 100 台机器可供我们使用。但是我们仍然缺乏合适的开源工具。需要具有健康生态系统的分布式自动化工具。

企业使用数字技术改变商业模式并提供新的收入和价值创造机会的数字化发展增加了数据科学家的挫败感。等待数天以尝试一种机器学习算法或等待获得生产数据样本的繁琐过程阻碍了许多人充分发挥其潜力。改进和自动化的需求已经增长。

小型公司看到了大型软件公司如何对其业务产生积极影响。机器学习从一个幻想变成了一种热门商品。公司明白他们需要更多的工具和专门的团队来构建这些内部工具,这增加了对工程师构建可靠、可扩展、加速和高性能机器学习工作负载的需求。

Netflix 是世界领先的互联网电视网络,每天流式传输数亿小时的内容,表示他们在所有业务方面普遍使用机器学习。这包括为他们的客户推荐个性化内容,优化他们工作室的电影和节目制作流程,优化视频和音频编码,以及提高他们的广告支出和广告创意以支持吸引新的潜在客户。

他们并不孤单。机器学习在行业中的成熟度也反映了 IT 和软件特定业务之外的公司,例如荷兰皇家壳牌公司,简称壳牌。这家跨国石油和天然气公司在大规模数据集上利用机器学习。他们的数据科学家和分析团队通过有关产品机会、流程优化和测试不同行动方案有效性的见解来支持业务。一个例子是他们的库存预测模型,该模型运行了 10,000 多次模拟跨所有零件和设施,预测需求并改善库存。壳牌还使用机器学习为其名为 Go+ 的忠诚客户计划提供推荐引擎。在他们的推荐引擎中,他们为单个客户提供个性化的优惠和奖励。这种方法为壳牌提供了一种增强的参与模式,通过满足客户的个人需求来帮助留住客户。

其他行业使用 ML 进行欺诈检测、评估贷款风险、自动化金融系统交易活动等。

正如您现在可以想象的那样,大型数据集与经过验证的业务影响的结合让许多希望发展业务和提高收入的公司大开眼界。

计算机科学和工程研究社区在实现可扩展机器学习方面提供了巨大帮助。近年来,学术研究在机器学习、分布式计算和数据库方面进行了数百项研究,以构建更智能、更高效的算法来支持分布式机器学习。因此,出现了通用分布式平台,例如流行的 Apache Spark。Apache Spark 为分布式机器学习工作负载提供分布式通用计算抽象和优化功能。与通用相反,为仅在单台机器上支持工作负载而构建的机器学习库正在不知疲倦地添加后端支持以在分布式设置中执行。举几个例子:谷歌的 TensorFlow,这简化了深度神经网络的工作负载,增加了支持分布式机器学习的功能。Facebook 的 PyTorch 用于计算机视觉和自然语言处理,增加了分布式支持等。

欢迎来到您旅程的第一章。本章介绍了成功构建分布式机器学习系统应了解的许多基本概念。

我们将涵盖:

  • 机器学习工作流程简介。

  • Spark MLlib 的基础知识。

  • 分布式计算基础知识。

  • 分布式系统基础。

熟悉那些概念?我们将在第 2 章介绍 PySpark,并在第 3 章介绍机器学习生命周期。

兴奋的?让我们开始吧!

机器学习工作流程的阶段

今天的许多应用程序都是机器学习驱动的。他们使用机器学习模型来回答诸如我的应用程序如何自动适应客户需求等问题?我怎样才能使这个繁琐的过程自动化,使我的员工能够利用他们的时间做更多的事情?如果不花一整年的时间来检查这些数据,我怎么能从我的一堆数据中弄清楚呢?和许多其他人。然而,作为技术从业者,我们只有一个问题要回答:我们如何才能使流程能够回答这些问题?

简短的回答是机器学习,综合的回答是机器学习工作流。

机器学习工作流程代表一组阶段,可帮助我们在生产中实现运行中的机器学习模型。什么是机器学习模型?好问题!机器学习模型是机器学习算法的输出。从现在开始,我们将把它称为模型。该过程的自动化被命名为:机器学习管道。为了提高模型的准确性,工作流程是迭代的,并且每个步骤本身都是重复的。它们使我们能够进行控制、自动化、监视和部署。

机器学习工作流由多个阶段组成,其中一些可以跳过,一些可以重复:

  1. Collect / Load data/ ingest:从各种来源收集过程所需的数据集,并将其加载到您执行实验的环境中。

  2. 数据探索与验证:探索和评估机器学习过程中数据的质量。这个阶段通常涉及对训练数据集代表真实世界事件、它们的分布和多样性的能力进行统计测试。也称为探索性数据分析 (EDA)。

  3. 清理/预处理数据:在第 2 步之后,我们可能会得出数据有噪声的结论。噪声数据是一种数据集,其特征对训练根本没有贡献。它们需要更多的处理能力,但不会提高模型的准确性。在那个阶段,数据科学家将对数据进行统计测试,以验证特征之间的相关性并分析哪些特征是多余的。

  4. 提取特征/特征工程:机器学习中的特征可以是独立的,它们需要我们开发代码来计算和生成它们,然后用它们丰富数据集。在训练机器学习模型之前。有很多方法可以做到这一点,这通常需要领域专业知识。当然,也可能是其他人创建了它们,而我们需要做的就是在训练本身之前将两个数据集合并为一个。

  5. 将数据拆分为训练集和验证集:训练集用于训练机器学习模型,验证集用于在未见数据上验证模型。

  6. 训练和调整模型将数据和参数引入机器学习算法。这个阶段的成果就是模型。

  7. 使用测试数据评估模型:这是将模型推向生产之前的最后测试步骤。在这个阶段,还有另一种使用有意义的评估标准来估计模型在给定未见数据的情况下的性能。以及在类似生产的设置中对其进行测试。

  8. 部署模型:我们希望它在生产中工作,对吧?为此,数据科学家与 ML 和生产工程师一起将打包模型并将其部署到生产中,满足其所有要求。

  9. 监控模型:不断监控生产中的模型是否存在数据漂移和概念漂移。评估其对业务的影响并知道何时更换它是关键。在第 10 章中,您将了解更多相关信息。

  10. 重复:尽可能多。具体变化如下。

每个阶段都是独一无二的,并且在很大程度上取决于数据、系统要求、知识、算法、现有基础设施和预期结果。

阶段 3 到 6 通常被认为是机器学习的实验阶段。我们希望反复迭代并生成多个版本的数据和模型,直到找到最佳版本。

要详细了解机器学习工作流程及其使用 TensorFlow 和 Tensor Boards 管道的自动化过程,请阅读O'Reilly 的构建机器学习管道

高水平的 ML 管道和技术

本书中的教程同时使用了工具和平台,所以让我们仔细看看管道以及如何使用每个工具:

【ML】第 1 章 :分布式机器学习:术语和概念

图 1-1。每个步骤中使用的高级管道和工具

 对于上述流程中的每一步,本书都使用了多种工具来完成。

为了试验特征工程之前的数据摄取,我们使用具有 UI 和后端服务器的 Jupyter。我们把代码写在UI notebook里,后端打包,发给Spark引擎。您可以决定用您喜欢的其他工具替换任何工具。

在 ML-build 模型部分。我们训练、验证和调整模型。我们将有多个服务器/后端:Jupyter、PyTorch、TensorFlow、Horovod、Petstorm 和 MLFlow,用于捕获实验、编排、缓存数据层,以及将工作流从 Spark 集群转移到深度学习集群。如果你想连接到前面的阶段,这些是步骤 6 和 7。

最后,对于部署和服务,我们将在后端使用 Spark 和 MLFlow。从 MLFlow 存储服务器加载模型并使用 Spark 或作为具有 python 函数的 REST API 提供它。

笔记

请注意,在大多数组织中,开发端到端的 ML 管道需要一个具有各种技能的专门团队,以及一个具有丰富的开发人员工具和代码自动完成功能的集成开发环境 (IDE),如 PyCharm、专用脚本CI/CD 等等。出于教程和教育目的,我们使用 Jupyter 笔记本。

什么是分布式机器学习训练?

您可能想知道,我们如何将大规模数据与机器学习工作流程联系起来?为此,您应该了解两个术语:大规模机器学习和分布式机器学习

一般来说,他们在讨论如何大规模地训练机器学习模型,并大规模地为它们服务,以达到应用需求。

有一个区别:它们如何扩展。

有两种实用的、互补的方法来扩展计算能力:

又名垂直缩放。扩大

添加专用硬件、处理器或可编程 GPU 以加速单个节点/机器计算。

水平缩放又名。横向扩展

添加更多节点/机器并创建以共享方式计算工作负载的节点分布式拓扑。

虽然大规模机器学习可以兼而有之,但使用 Spark 进行分布式机器学习训练基本上是基于使用分布式系统拓扑进行横向扩展。也许您会想:“我可以使用更强大的 GPU/TPU 处理器进行训练和推理并进行垂直扩展”。虽然很多时候我们在训练期间、推理期间以及在生产中为模型提供服务时确实可以访问 GPU,但通常情况下,我们将无法访问它。我们将在第 10 章中更详细地讨论它,您将在其中了解生产中的部署和监控机器学习。

分布式计算模型

分布式计算是如何使用分布式系统解决计算问题的秘诀。

通过分布式计算,我们创建了一个分布式计算机程序。分布式编程就是我们写这样的程序。我们的目标是找到将问题分解为多个任务的最佳方法,其中多台机器可以通过消息通信并行解决。在检查机器学习的分布式计算模型时,我们可以将模型分为两组:我们可以调整以支持分布式机器学习的通用模型,以及专为运行一组机器学习算法而设计的专用计算模型。

一般用途

通用分布式计算模型允许用户使用定义的抽象来编写自定义数据处理流程。Apache Spark 是一个通用的分布式计算引擎,它总体上实现了 map-reduce 编程模型。在本书中,您将了解其他分布式引擎,例如 TensorFlow 和 PyTorch。此处列出的每个通用模型都将出现在一个或多个章节中。

MapReduce

MapReduce 编程模型受到函数式编程范式的启发。谷歌在 2004 年通过一篇研究论文发布了 Map-Reduce 算法,他们在论文中谈到了他们的搜索引擎以及它如何处理大规模数据。作为开发人员或数据科学从业者,我们指定一个 map 函数来处理键/值对以生成一组中间键/值对,并指定一个 reduce 函数合并与同一中间键关联的所有中间值。这种方法是用于数据分析的拆分应用组合策略的扩展。在实践中,每项任务都被分成多个地图并减少功能。数据被分区并分布在各种节点/机器上,每个数据块都在专用节点上处理。许多解决方案旨在尽可能多地拥有数据局部性,其中分区数据对于处理它的节点是本地的。稍后,逻辑功能将应用于该节点上的该数据;下面介绍使用混洗机制组合数据的“减少”操作。shuffle 机制是我们的节点根据映射功能键输出重新分配数据的过程。

最后,我们可以将合并后的数据与更多的逻辑结合起来。如果需要,我们可以进行另一轮拆分-应用-组合。以某种方式实现这些概念的开源解决方案示例包括 Apache Spark、Hadoop MapReduce、Apache Flink 等。在整本书中,我们将更详细地讨论它。

MPI编程模型

另一个有趣的通用分布式模型是 MPI——消息传递接口。这是当今最灵活的模型。它专为高性能、可扩展和便携式分布式计算而设计。它提供了一个消息传递标准,可以模拟在分布式内存系统上运行的并行程序。它标准化了一组处理器之间的通信,这些处理器具有在处理器之间发送的预定义数据类型。每个处理器都有一个唯一的标识符,每个通信器都是一组按特定拓扑排列的处理器。MPI 是一种低级标准,可以在硬件、编译器、包装器等中实现。它有多个版本,已由 HP、Intel、Microsoft 和其他公司商业实现。

MPI 具有集体功能,如bcast – 广播所有数据,alltoall – 将所有数据发送到所有节点,reduceallreduce类似于 MapReduce 和 Apache Spark reduce 功能。我们可以将其视为分布式框架的一组构建块,为分布式机器学习提供功能。

MPI 的缺点在于其低级别的宽容度。在 MPI 上执行和实施复杂操作可能非常耗费人力且容易出错。它需要显式管理数据类型分布、发送和接收功能、容错,并且通常要求开发人员考虑分布式数组、数据帧、哈希表、树等。MPI 通常用于深度学习工作负载。Horovod 核心原则基于 MPI 概念,例如sizeranklocalrankallreduceallgatherbroadcast。对于分布式计算,TensorFlow 提供对 MPI 的支持作为其通信协议的一部分。

屏障模型

Barrier 本身就是一种同步方法。它以并行计算而闻名,并在 Apache Spark 等分布式计算框架中实现。一项任务或一项工作被分成子任务的相关阶段,这些阶段需要完成才能继续处理到下一阶段。屏障使一组机器停在某个点并等待其余机器完成其阶段计算,然后它们才能一起移动到计算逻辑的下一阶段。障碍模型可以在硬件和软件中实现,阶段可以采用多种形式,从有向无环图 (DAG) 到树或顺序图。

虽然它是一种通用的分布式计算模型,但它使分布式机器学习算法的工作负载更加多样化。例如,在深度学习中,堆叠人工神经网络中的每一层都是一个阶段,阶段计算依赖于前一阶段。在这种情况下,障碍模型可以管理多层训练。

共享内存

共享内存是一个有趣的东西,有着悠久的历史。共享内存模型起源于 POSIX 和 Windows 等操作系统,在这些操作系统中,运行在同一台机器上的进程需要通过共享地址空间进行通信。分布式共享内存模型试图满足同样的需求。多个节点/用户在分布式环境中通过网络进行通信,并需要从不同的机器访问相同的数据。今天,没有一个分区的全局地址空间,而是一个具有强数据一致性级别的内存或快速数据库

分布式共享内存环境中的强一致性意味着所有进程和节点对数据的所有访问都是一致的。这不是一件容易的事。TensorFlow 的分布式策略之一是实现共享内存。您将在第 8 章中全面了解它及其优点和缺点。

专用分布式计算模型

专用分布式计算模型是为支持机器学习开发周期中的特定需求而开发的模型。很多时候,他们会利用通用的作为构建块来构建一个更加用户友好的框架,数据科学从业者可以开箱即用。它们存在于 TensorFlow 和 PyTorch 分布式训练中。具体来说,它们为从业者提供了各种级别的抽象,以供其利用,一直到专用的分布式计算。

参数服务器

参数服务器是用于机器学习工作负载的专用分布式计算模型。TensorFlow 将其作为训练模型分布策略的一部分来实现。参数服务器正在利用共享内存方法。一组专用的服务器,数据一致性强,为工作人员提供一致的信息。参数是机器学习算法在其训练和再训练生命周期中所需的权重和预先计算的特征。在某些情况下,参数可以放入一台机器内存中,但在有数十亿个参数的实际用例中,需要有一个参数服务器集群。我们将在第 8 章的 TensorFlow 策略中深入探讨它。

其他

随着研究和行业对分布式机器学习的大力投资,更多专用和通用模型的出现只是时间问题。密切关注新事物始终是一个好习惯。希望到本书结束时,您将拥有对各种分布式计算模型以及如何利用它们来满足您的业务技术需求做出明智决策所需的所有工具和信息。

现在您已经熟悉了这些概念,它们将帮助您更全面地了解分布式机器学习架构,以及每个概念发挥作用的地方。

网络拓扑

拓扑是我们如何组织计算机以形成分布式系统的结构。基本上,计算机是如何布置的以及如何通过网络交换信息。

通常,有两种类型的拓扑,一种是描述计算机如何连接的物理拓扑,另一种是描述数据在系统中流动方式的逻辑拓扑。

分布式计算机拓扑通过添加更多计算机(也称为节点)来利用横向扩展。

工程师经常在最终的架构对话中讨论拓扑。他们的架构需求源于项目的目标、数据、行为和现有的软件工具。对于数据科学家来说,主要目标是定义分布式模型训练方法或模型部署。

笔记

您可能会发现一个独特的差距,可用的软件工具不能很好地满足需求或太复杂而无法集成到您的解决方案中,您将决定自己开发软件工具。

构成分布式系统拓扑的节点以专用架构模式通过网络连接;它们以一种方式连接,以提高负载能力并优化时间和资源。这些选择将影响每个节点在拓扑中的角色、其通信和故障恢复能力。

高级分布式系统:

除了理解分布式系统的概念之外,您还应该了解机器的交互模型、分散式系统与集中式系统、故障、安全性和通信。

集中

集中式系统是一种拓扑结构,其中所有节点都依赖于单个节点来做出决策。

去中心化

一个分散的系统,其中节点是独立的并产生自己的决定。分散式系统可以受益于多云/混合云架构。去中心化系统的一个例子是连接的物联网设备。每个设备都是独立的,但基于其互联网带宽通过网络与其他设备和/或云共享数据。拓扑将定义 IoT 设备的通信方式及其角色。对于训练模型,去中心化的方法意味着每个模型都是自己训练的。

了解分布式系统的交互模型

交互模型定义了节点如何通过网络进行通信、它们的角色和职责集。

客户端服务器

在Client-Server拓扑交互模型中,有明确的职责定义。节点可以改变它们的角色,但它们受制于系统的结构和需求。

点对点

在对等拓扑交互模型中,工作负载在节点/对等点之间分配。节点拥有平等的特权,可以直接共享信息,无需依赖专用的中央服务器。在此拓扑中,每个对等点都可以既是客户端又是服务器。这种拓扑被认为是宽松的并且实施起来更便宜,因为不需要将机器绑定到特定的责任。

地域分布

我们经常提到与地理分布式云数据中心的地理分布式交互模型。这种交互模型定义了当从一个数据中心向另一个数据中心发送请求时数据中心之间的通信应该如何操作等。它旨在解决的挑战之一是数据隐私和资源分配。例如,考虑到距离,通过地理分布式模型的点对点可能无法提供最佳吞吐量。因此,当我们使用分布式机器学习并需要开发受地理分布式机器限制的工作负载时,我们将调整并明确定义它们如何通信以及在何种情况下进行通信。创建专用的 Geo-distribution 交互模型是解决数据隐私问题的合理方案。例如,与数据不能集中在一个数据中心的物联网设备/边缘联合学习。开发一个系统来在每个设备上跨多个分散的边缘训练模型并组装输出以创建一个有凝聚力的模型是解决方案之一。这样,我们仍然可以从各种物联网设备/边缘的数据洞察力中受益,而无需交换私人信息。

我们的机器如何在分布式环境中进行通信?

我们的节点在分布式环境中的通信方式会显着影响故障机制、安全性和吞吐量。在一些分布式计算模型中,需要通过另一个进行特定的通信。这里没有一般规则;我们不能偏袒另一个。最后,这是一个需要的问题。

将机器学习工作负载扩展到多台机器的需要导致对数据和/或程序本身进行分区,以将它们均匀分布在所有机器上。

通过网络对数据进行混洗会增加总体计算时间,但会提高准确性。在许多情况下,混洗包括在通过网络发送数据之前写入本地磁盘;这会导致更多的 I/O 操作,从而增加整体计算时间并在本地磁盘上造成瓶颈。异步与同步通信可能会增加整体计算时间并产生瓶颈。因此,我们需要仔细检查我们采用的沟通方式。

例如,Parameter Server 是一种专门的机器学习计算模型,可以通过异步通信或同步通信来实现。在 TensorFlow 分布式策略中,它支持同步和异步训练,用于数据并行的分布式训练。

异步

异步通信的底层机制是队列。对专用节点的请求正在排队,最终可以返回或不返回结果。这种机制在信息交换不依赖于时间的系统中很有用,因为不需要立即收到响应。把它想象成一条短信,你给你的朋友发了一条短信,询问下周六的晚餐计划,你知道你最终会得到回复,但你并不马上需要它。异步通信允许分布式系统中的消息流,而无需任何进程块。

同步

同步通信的要求源于计算机科学函数堆栈,其中有一个我们如何计算逻辑的特定顺序。这意味着如果我们需要向另一个节点发送问题,我们不能同时继续处理其他功能逻辑。正在运行的进程必须等待响应才能继续。我们可以在特定的分布式机器学习案例上使用同步通信,并在必要时使用专用硬件进行优化。考虑以下场景:您想安排今晚与朋友共进晚餐。您取决于朋友的食物偏好、可用性和餐厅的可用性。你知道,如果你决定去一家知名餐厅,但现在不安排,他们将没有座位。你做什么工作?你拿起手机,给你的朋友打电话,同步收集信息;现在你们俩在电话通话时都被屏蔽了。您获得了必要的信息并继续进行下一个计算阶段,即联系餐厅。

集成方法简介

集成机器学习方法是多种模型的组合。他们使用多种机器学习算法产生多个模型,从而获得更好的性能,减少模型偏差,提高准确性并减少方差(过拟合)。集成方法通常围绕监督学习设计,需要明确定义可在预测期间使用的模型聚合。

高或低偏差:

机器学习中的高偏差意味着模型对结果做出了太多假设——导致模型过度拟合。与低偏差相比,模型本身包含较少的假设——导致欠拟合。偏差通常是机器学习算法本身的结果。例如,线性回归,如果调整错误,可能会有很高的偏差。例如,当存在因变量(结果)和自变量(收入)时,我们试图将两个变量之间的关系建模为一条直线。但变量之间没有真正的线性,或接近线性相关。这完全取决于特征的潜在关系。

在许多已知案例中,集成技术被证明对未来数据更加准确。在集成中,每个模型都称为学习者。我们根据期望的目标定义学习者之间的关系。例如,在我们想要减少方差的地方,我们将通过以顺序方式训练学习者来建立学习者之间的依赖关系。一个例子是 Spark MLlib 库中的 Gradient-Boosted Trees,我们一次训练一棵树,并且训练每棵新树以纠正系列中先前树的错误。这也称为提升

升压

建立多个学习者,以减少先前学习者的错误为目标。它们按顺序进行训练,通常有助于减少偏差和方差,但可能会引入过度拟合。这种集成方法的预测过程是通过对投票进行加权,计算多数票,或计算总和作为预测或分类。

集成模型的另一个目标是减少整体的过度拟合。我们可以建立彼此独立的学习者,因此在并行中训练独立的学习者。一个例子是 Gradient boost Trees 分类器 (GBTClassifier),它是在 Spark MLlib 中实现的。GBTClassifier 是一种集成技术,使用某种确定性平均过程迭代组合决策树。该算法的目标是最大限度地减少训练/错误中丢失的信息(第 5 章将对此进行更多介绍)。把它想象成一个人正在向另一个人学习,这反过来又促进了整体学习。考虑到树的迭代组合有时会产生过度拟合的模型和方差。

套袋

Bagging 指的是并行构建独立学习器,为它们提供数据集的不同部分,然后引导/打包它们,以减少方差、过度拟合并提高未来数据预测的准确性。这种集成方法的结果是一个组合模型,其中每个模型独立地对预言的结果进行投票。该算法收集所有选票并产生最终预测。一个例子是 RandomForests,它是在 Spark MLlib 中实现的。RandomForests 是一种组合独立决策树的集成技术。独立树的组合可以显着帮助减少过度拟合和方差。这被定义为集成Bagging方法。

当集成学习方法使用相同的机器学习算法来构建其学习器时,它们被定义为同质集成。否则,它们被命名为异质系综。接下来,您将了解一种结合各种机器学习算法的技术,称为堆叠集成学习。

堆叠

构建独立学习器并使用集成函数组合它们,该函数获取所有独立学习器的输出并将其简化为单个分​​数。Stacking 可以具有非线性集成函数,该函数将先前学习者的得分与给定数据结合起来。非线性集成函数可以是,例如,其中基础学习器是决策树的神经网络。这种方法更先进,可以帮助揭示变量之间更深层次的关系。

构建分布式集成学习模型可以依赖于集群拓扑。让我们看一下几种方法:

集中集成学习

集中式系统通常使用客户端/服务器架构,其中节点直接与集中式服务器节点通信。它类似于计算机网络中的星形拓扑。在分布式机器学习部署方法中,这意味着来自分布式模型的所有预测、分类等请求都通过主服务器。

在集中位置发生的服务器级别聚合有严格的层次逻辑;它可能是一个或多个服务器节点充当最终决策者。此拓扑专用于特定的分布式模型工作负载,而不是一般用途。例如bagging approach的集成学习方法,RandomForest。RandomForest 用于分类或回归,具体取决于数据的性质,并且是旨在减轻决策树过度拟合的决策树的集合。当您决定利用 RandomForest 作为部署模型的算法时,程序将作为客户端与主要服务器节点进行交互。这些服务器节点将根据查询属性将查询发送到树节点,从树中收集输出答案,基于集成逻辑集成所有树的输出,并将答案返回给客户端。集成中的每棵树都是从完全不同或重叠的数据集构建的。

笔记

当摄入模型的数据固定不变时,我们可以在训练期间创建一个集成汇总模型来计算适合服务器的决策本身。例如,将树汇总为一个函数。但是,当您想要集成流数据以增强模型时,此拓扑使您能够在不更改整个模型的情况下向模型添加另一棵树。

分散的决策树

决策树也可以部署在分散的拓扑结构中。当您想在边缘设备上提供答案并且受到数据隐私、互联网带宽和响应要求的严格时间限制时,您可以使用它。去中心化决策树是 Edge AI 的一部分。边缘 AI 是在处理算法时,模型在设备本地提供。每个节点不需要充分连接到网络,但它仍然可以利用其网络来提高准确性并避免过度拟合。在这种情况下,当边缘节点收到做出决策的查询请求时,它会将查询发送给它们的父节点和子节点,这些节点又将查询发送给它们的父节点和子节点,计算并广播它们的响应。该节点将拥有自己的聚合函数,并且可以根据在特定时间限制内响应是否可用来决定是否使用它。为了将通信开销保持在最低限度,您可以提供特定程度的边缘,以期定义查询可以请求旅行的“距离”。此约束强制执行节点邻域。节点的邻域可以根据网络和边缘设备的可用性而改变。

集中分布式训练参数服务器

在集中式分布式训练拓扑中,训练的工作量在一个数据中心完成。这些机器连接良好,并通过共享网络进行通信。数据集和训练工作负载分布在客户端节点之间,服务器节点维护全局共享参数。服务器节点充当所有客户端节点共享和使用信息的参数服务器。参数服务器充当全局共享内存。他们必须能够快速访问信息并经常利用内存中的数据结构。可以利用此拓扑的机器学习算法家族之一是深度学习,其中多个函数可以分别计算主要函数的不同部分。数据和参数分布在所有机器上,每个客户端节点计算其主要功能的一部分。变量在参数服务器上创建,并在每个步骤中由客户端节点(也称为工作节点)共享和更新。

第 4 章通过使用 TensorFlow 利用此拓扑的代码示例详细讨论了此策略。

点对点集中分布式训练参数

在对等(又名 P2P)拓扑中,没有客户端和服务器角色。所有节点都可以相互通信。每个节点都有自己的参数副本。这对于利用数据并行性很有用;当有固定数量的参数可以放入节点内存时,逻辑本身不会改变,节点可以以点对点的方式共享它们的结果。Gossip Learning 是利用 P2P 的一个例子。每个节点根据可用的数据集计算其模型,并将独立调用网络上的对等节点以共享其模型。然后节点将它们当前的模型与它们邻居的模型结合起来。就像分散部署环境中的决策树一样,这种拓扑结构应该受到时间限制,以及节点向其广播信息的边数。p2p 也可以受 MPI 消息传递接口的限制,该接口提供通信协议来标准化工作负载。MPI 可以工作在多种执行模式下。在桥接计算和网络通信方面最重要的是 MapReduce 和 Barrier Execution 模式,尽管它们也可以根据配置实现对等或其他通信拓扑。第 8 章和第 8 章就 TensorFlow 和 PyTorch 分布式计算详细讨论了这一点。尽管它们也可以根据配置实现对等或其他通信拓扑。第 8 章和第 8 章就 TensorFlow 和 PyTorch 分布式计算详细讨论了这一点。尽管它们也可以根据配置实现对等或其他通信拓扑。第 8 章和第 8 章就 TensorFlow 和 PyTorch 分布式计算详细讨论了这一点。

分布式机器学习系统的挑战

“罗马不是一天建成的……但他们每小时都在砌砖。”

约翰·海伍德

尽管您刚刚进入旅程的第一章,但重要的是要迎接可能会遇到的困难。

保持乐观的态度,了解现实的大局。

使用分布式机器学习与在一台机器上开发机器学习工作负载或学习机器学习的基础知识有很大不同。这一点很重要。但最终,构建满足要求的系统是我们的责任。有经验的从业者会告诉你,所有的需求都是可以商量的,能失败的就失败,这是真的。因此,请注意现有的挑战以及如何在整个过程中权衡您的努力。

表现

提高性能是分布式系统的创始目标。拥有高吞吐量和更快的端到端机器学习计算是证明分布式机器学习系统合理性的关键部分。我们可以采用多种方法来提高性能,所有这些都取决于我们之前定义的目标、数据和行为。让我们了解我们面临的考虑和问题。

数据并行还是模型并行,两者如何?

在计算机科学中,分布式计算与并行计算一起使用。单节点/计算机并行计算是指使用单节点多处理器来处理一个任务,也称为任务并行处理。相比之下,并行计算的分布式计算是指使用众多节点来处理每个节点可以并行运行的任务。在讨论分布式计算时,并行计算是给定的,不会明确提及。

接近分布式机器学习时最重要的困惑之一是对什么是精确分布式的清晰理解。

在机器学习工作流/生命周期中,您预处理数据,执行特征工程以提取新特征,丰富您的数据,然后使用超参数将数据结果提取到您的机器学习算法中。超参数是用来控制学习过程的参数,也称为机器学习算法调优参数。在该学习过程中,摄入其中的值/数据会受到超参数的影响。这就是为什么建议尝试各种超参数以提取最佳模型并从中受益以用于生产的原因。

将机器学习过程和将大量数据摄取到具有大量调整参数的学习过程中的概念相结合带来了自身的挑战。

数据并行

数据并行性是关于将数据本身分布在不同的节点上。每个节点运行相同的计算逻辑,这意味着将代码本身分发到多个节点,其中每个节点对不同的数据片段进行操作。从一个节点到另一个节点,数据输入发生变化,但节点运行的代码是相同的。

模型并行度

模型并行性使用多个节点来执行机器学习算法的不同部分,然后组装分布式输出以生成模型本身。这适用于可以通过在有向无环图 (DAG) 中表示来并行化的算法。在 DAG 中,顶点代表计算,边代表数据流。我们将在本书后面使用 DAG 缩写来分解和理解各种分布式 ML 功能在底层是如何工作的,而不管模型并行性如何。

让我们进一步了解模型并行性,为此,我们将其分为分布式服务和分布式训练:

分布式服务

服务(又名推理现有模型)的挑战在于,有时,模型本身无法放入一台机器内存中,需要进行调整才能以最佳方式提供服务。从集成方法考虑 RandomForest。可能所有的森林都能装进内存,但如果我们的森林有数十亿棵小树呢?每个子集都可以安装在不同的机器上,并且机器以定义明确的方式进行通信以最有效地为模型提供服务?这是一种选择,它需要专门的工具和架构。通常,PyTorch 和 TensorFlow 等深度学习框架可以跨设备共享模型。

具有模型并行性的分布式训练

模型并行性的另一个挑战是训练部分。大规模训练机器学习可能会遇到在大型数据集上进行训练的挑战,其中算法在所有机器上重复,并且每台机器运行相同的逻辑,而不是由于超参数或其他要求导致算法在许多机器上发生变化.

结合数据并行性和模型并行性

数据和模型并行性的结合一点也不简单。这是由于现有开源的性质以及构建将利用两者的专用系统的复杂性。前几天,我们常常陷入困境,迫切需要在 Apache Spark 等数据并行工具和 PyTorch 等模型并行工具之间做出选择。如今,这些工具中有许多相互支持,无论是在本地还是通过扩展,如 Petastorm、horovod 等。

需要将两者结合起来会对性能产生重大影响,也会影响计算新模型、提供新模型以及使用新模型进行预测所需的时间。例如,OpenAI 开发的 GPT-3,即 Generative PreTrained Transformer,是一种使用深度学习来生成类人文本的模型。据说最大容量为 1750 亿个参数的 GPT-3 需要 355 年和 460 万美元才能使用市场上价格最低的 GPU 云进行训练。对于大多数公司来说,等待从机器学习算法中获得模型是一个昂贵且极其漫长的时间。不仅如此,在找到合适的超参数和调整以产生高度准确的结果之前,还需要多次尝试。我们不会在本书中进一步讨论这个 GPT-3,但重要的是要知道它的存在。

深度学习

对分布式机器学习性能提出挑战的特定算法家族是深度学习家族。深度学习基于具有特征学习的人工神经网络 (ANN),这意味着系统会自动从原始数据中发现特征。

训练深度学习模型需要前向计算和/或反向传播。

前向计算是在神经网络 (NN) 中向前馈送数据以计算结果的行为。

反向传播是通过层将精度的“损失”反馈到神经网络中,以了解每个节点负责多少损失并相应地更新神经网络层的权重。为了简化它,将其视为将错误反馈回模型以修复它们。

前向计算和反向传播本质上都需要顺序计算。每个层或阶段都必须等待前一阶段的输入。虽然我们可以单独分配每个阶段,但整个模型训练是顺序的。因此,我们仍然需要编排来在训练期间强制执行序列或某种形式的自动化管道。使我们能够运行分布式深度学习工作负载的调度算法之一是 Gang Scheduling。基于 Gang Scheduling,社区在 Apache Spark 2.4 中引入了 Barrier Executing 模式,允许我们创建一组机器在一个阶段上协同工作,只有当每个人都完成后才进入下一阶段。

资源管理 – 资源匮乏/成本 – 许多 GPU/加速器

如何拆分集群资源是分布式系统中最大的挑战之一。当同时添加分布式机器学习工作负载时,它会变得更加复杂。这样做的原因是需要通过将软件与专用硬件配对来提高性能。这不仅仅是 GPU 与 CPU 的对话。如今,英特尔、NVIDIA、谷歌和其他公司正在生产配备人工智能专用硬件芯片的机器。这些被称为人工智能加速器;它们专为超越传统线程算法的高性能大规模并行计算而构建。尽管如此,许多机器学习算法仍在不断发展,这就是微软将 FPGA(现场可编程门阵列)芯片引入其云端的原因。FPGA 具有可重构设计,在软件更新时,使根据需要调整硬件变得更加容易。这是 Microsoft Project Catapult 的一部分,旨在实现深度学习的快速实时 AI 服务。

资源共享仍然面临竞争工作负载的挑战,在分布式环境中,当需要 10 台机器但只有 5 台可用时,软件可以使用它拥有的或等待更多机器可用。这为工作负载造成了瓶颈,并可能导致巨大的痛苦。想一想您在生产环境中运行机器学习培训以节省资源的场景,并且您的培训工作负载与产品的实时工作负载竞争资源。那时您可能会发现自己与客户有麻烦。这就是为什么最好为关键工作负载和长期/离线工作负载提供多个环境。然而,如果您的模型很关键并且现在正在对新数据进行训练并且可能会发现行业中不可预见的/实时趋势并且错过它可能会导致收入损失怎么办?您可能需要两个代表关键工作负载的环境,但这可能成本高昂且投资回报率 (ROI) 较低。

重新配置和资源共享只是故事的一部分,另一个挑战是自动决定何时使用 GPU、CPU、FPGA 以及市场上可用的其他硬件选项。有了云和充足的预算,我们可以获得所需的所有硬件,但同样,我们必须考虑投资回报率。我们应该做什么?我们如何使该过程自动化?这个问题还没有充分的答案,但好消息是越来越多的软件和硬件解决方案正在相互支持。例如,NVIDIA 创建了 RAPID,这是一套开源库,位于 NVIDIA CUDA 处理器之上。CUDA 支持数据科学过程的 GPU 加速。通过对 Apache Spark 3.0 的 RAPID 支持,不仅可以加速数据科学工作负载,还可以加速 ETL/数据准备,我们可以潜在地基于它构建一个集群,该集群将为数据准备和模型训练和服务提供支持。消除自动切换资源的问题。不过,还有投资回报率的问题。

容错

容错是分布式系统在发生故障时应该如何继续正常运行的过程。

分布式机器学习的失败有两个方面:

  • 可以检测和缓解的典型机器故障

  • 产生不良输出的机器未检测到的故障。

让我们从第一个开始:

为了更好地理解容错过程的必要性,问问自己:

“如果我们将工作负载分配给一个由 1000 个计算节点组成的集群,如果这 1000 个节点中的一个节点崩溃了怎么办?除了从头开始重新启动工作之外,还有什么办法可以解决这个问题吗?”

当其中一个阶段失败时,我们是否需要重新计算一切?!答案是不。今天,许多分布式计算框架都有一个内置的容错过程。他们通过在分段之间复制数据并将信息写入磁盘以实现更快的恢复来实现这一点。其中一些会将选择机制的决定暴露给我们。例如,在同步训练的 TensorFlow 中,如果其中一个 worker 失败,而我们没有提供容错程序,整个集群就会失败。这也是为什么我们在选择TensorFlow分布策略的时候,需要关注容错机制。另一方面,Apache Spark 不会向我们公开决策。相反,它有一个内置的隐藏机制,我们无法从机器学习 API 本身进行调整。

第二个与分布式机器学习更相关,因为它直接影响机器学习本身的性能。

在这种情况下,我们可以将其视为有一个拜占庭/对手机器或一个有意或无意的故障代理。故障代理可以通过暴露错误数据来损害机器学习模型的性能,这可能会损坏流程。很难减轻这种行为,而且它高度依赖于我们使用的算法。检测此类故障是机器学习可观察性职责的一部分。

隐私

机器学习中的隐私通常侧重于保护成员数据的隐私和/或保护模型和参数本身。模型和参数可以是公司的知识产权,就像模型及其参数应该保密的金融市场系统一样。

实施成员隐私的一种选择是集中数据的限制。我们希望在不将成员的训练数据上传到中心化服务器的情况下构建模型。为此,我们可以利用联邦学习等技术。

联邦学习

在这种技术中,我们在边缘设备上训练算法,而无需共享或集中数据本身。然后,这些设备与其他设备或专用服务器交换他们构建的模型的摘要。

但是,在训练过程中可能会发生对抗性攻击,此时攻击者可以掌握部分数据或总结部分训练。当攻击者通过他们的边缘设备积极参与训练过程时,这很容易在联合学习期间发生。

假设我们找到了一种方法来安全地集中数据或在没有它的情况下训练模型。尽管如此,恶意用户仍有可能通过与模型本身交互来恢复我们用于训练模型的数据。获取有关特定人群、分类类别等的统计披露。您现在可能已经知道,在讨论机器学习隐私时,没有一种解决方案可以适用于所有情况。它需要专门的技术和架构。尽管分布式机器学习中的隐私本身就是一个引人入胜且庞大的话题,但我们不会在整本书中再讨论它。

可移植性

可移植性与通用分布式系统的挑战有关。当我们添加专用计算硬件(例如多种类型的 GPU)与我们构建的软件配对时,就会带来将工作负载从一个集群转移到另一个集群的挑战。在云早期,许多公司使用“提升和转移”策略迁移到云,将工作负载和应用程序移动到云中,而无需重新设计。然而,在许多情况下,这导致了更高的运营成本,因为它们没有利用环境特征。具体来说,在云中,原生功能是针对特定工作负载优化构建的。分布式机器学习方法、可用的各种硬件、要求以及通过降低开发、存储成本来提高投资回报率的需要也会发生同样的情况,

其他几个挑战仅来自分布式系统的基础知识,这些基础知识与机器学习没有直接关系,但可能会影响它们,例如信任/或零信任系统、网络开销、确保一致性等。我们不会在本书中介绍它们。

设置您的本地环境

现在您对景观有了更好的了解,让我们为您的成功做好准备!本书中的许多代码示例都可以在本书的 GitHub 存储库中找到。要获得实践经验,您应该设置您的专用环境,您可以在您的机器上本地运行它。

我把它们分成两部分:

  • 第 2-6 章的环境

  • 第 7-10 章的环境

第 2 – 6 章教程环境

要运行第 2 章到第 6 章中的教程,请确保您的计算机上安装了最新版本的 Docker 并按照以下步骤操作:

  1. 运行 Docker

  2. 运行下一个命令:

    [code,bash]
    docker run -it -p 8888:8888 adipolak/ml-with-apache-spark 

    这将使用 Apache Spark 3.1.1 拉取 pyspark Jupiter notebook 的图像,其中包含我们将使用的大部分库,已安装在环境中,但 PyTorch 除外。

    你会得到类似的回复:

    [code,bash]
    —-
    [I 13:50:03.885 NotebookApp] Serving notebooks from local directory: /home/jovyan
    [I 13:50:03.885 NotebookApp] Jupyter Notebook 6.3.0 is running at:
    [I 13:50:03.885 NotebookApp] http://6cb805089793:8888/?token=e14171684afc305b4702cbda99ae879d3faecf5db6bea37d
    [I 13:50:03.885 NotebookApp]  or http://127.0.0.1:8888/?token=e14171684afc305b4702cbda99ae879d3faecf5db6bea37d
    [I 13:50:03.885 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
    [C 13:50:03.891 NotebookApp]
        To access the notebook, open this file in a browser:
            file:///home/jovyan/.local/share/jupyter/runtime/nbserver-8-open.html
        Or copy and paste one of these URLs:
            http://6cb805089793:8888/?token=e14171684afc305b4702cbda99ae879d3faecf5db6bea37d
         or http://127.0.0.1:8888/?token=e14171684afc305b4702cbda99ae879d3faecf5db6bea37d
    ^C[I 13:50:27.037 NotebookApp] interrupted
    Serving notebooks from local directory: /home/jovyan
    0 active kernels
    Jupyter Notebook 6.3.0 is running at:
    http://6cb805089793:8888/?token=e14171684afc305b4702cbda99ae879d3faecf5db6bea37d
     or http://127.0.0.1:8888/?token=e14171684afc305b4702cbda99ae879d3faecf5db6bea37d
    —-

    或者复制并粘贴您最近收到的 URL 之一:

    [source, bash]
    —-   http://6cb805089793:8888/?token=e14171684afc305b4702cbda99ae879d3faecf5db6bea37d
      or http://127.0.0.1:8888/?token=e14171684afc305b4702cbda99ae879d3faecf5db6bea37d
    —-

    收到有关 AMD 的错误信息?请改用此命令:

    [code, bash]
    adipolak/amd-ml-with-apache-spark 
     docker run -p 8888:8888 adipolak/amd-ml-with-apache-spark
  3. 复制带有 `token=` 的 LAST url,它看起来像这样,但您将拥有自己的令牌:

    [code.bash]
    —-http://127.0.0.1:8888/?token=43143a485357351ef522a1840f8c8c141a1be2bcf5f9b4de
    —-

    在你的浏览器中过去。这将是您的 Jupyter 教程环境。

  4. 克隆或下载或下载书籍代表

  5. 提取文件(解压缩)并使用上传按钮将笔记本和数据文件上传到 Jupyter。使用照片中标记的上传按钮:

【ML】第 1 章 :分布式机器学习:术语和概念

图 1-2。Jupyter 上传按钮

`pyspark-notebook` Docker 镜像现阶段非常简单:它只包含本书要使用的主要工具 Jupyter 和 PySpark。Jupyter docker stacks解释了图像是如何堆叠的。

【ML】第 1 章 :分布式机器学习:术语和概念

图 1-3。docker镜像是如何堆叠的

第 7 – 10 章教程环境

第 7-10 章中的教程需要 PySpark、PyTorch、Petastorm、TensorFlow 以及与 ML 构建、部署和服务部分相关的所有内容(使用 PySpark 构建 ML 除外)。GitHub 存储库一书有一个用于启动简化环境的教程和一个用于动手体验的示例数据集,其中包含除 PyTorch 之外的大部分内容。为了使用 PyTorch,我们使用 Anaconda 直接从 Jupyter 终端安装它。

图 1-4展示了如何使用 conda 命令从 Jupyter 环境安装 PyTorch:

[ source, bash]
—-
(base) jovyan@3a9bb0493757:~$ conda install pytorch torchvision -c pytorch
—-

在此过程中,它可能会提示您有关安装的问题。

【ML】第 1 章 :分布式机器学习:术语和概念

图 1-4。在您的环境中安装 PyTorch

 另一个方面是这些章节所需的资源,它可能需要更多的 RAM 内存才能更快地执行。要配置您可以利用带有 –memory 和 –memory-swap 标签的 docker 命令。确保根据您的机器功能定义内存和内存交换。

[source, bash]
—-
sudo docker run -it --memory="16g" --memory-swap="24g" -p 8888:8888 adipolak/amd-ml-with-apache-spark
—-

概括

在本章中,我们介绍了分布式机器学习的基础知识。一些深层次的话题被轻松触及,例如网络拓扑、分布式训练和服务、分布式计算模型、机器学习工作流等等。如您所知,Spark 能够实时跨集群或计算机处理器执行数据并行处理。由于该框架基于 Map-Reduce 范例,因此在处理数据、分析和机器学习算法方面具有众多优势。它也有局限性。使用 Map-Reduce 作为深度学习工作负载的方法可能更具挑战性。因此,本书在第 7 章讨论了如何从 Spark 过渡到深度学习框架。下一章将快速、有趣地介绍 PySpark,这是您复习基础知识或快速、有趣地介绍 PySpark 的机会,然后再进入第 3 章。第 3 章将让您开始使用 MLFlow 进行机器学习生命周期管理。以及打包您的实验,以便您可以阅读本书的其余部分。在第 4、5 和 6 章中,您将学习如何利用 PySpark 来满足您的机器学习需求。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年2月25日 下午10:41
下一篇 2023年2月25日 下午10:44

相关推荐