摘要:通过分布式系统进行机器学习,大概就是联邦学习吧
1. 引言
通过分布式系统来增加并行和I/O带宽总量,第二节探讨机器学习的系统挑战以及如何采用高性能计算(HPC)的想法来加速和提高整个机器学习的可扩展性,第三节描述了分布式机器学习的参考架构;第四节介绍了最广泛使用的系统和库的生态,以及底层设计;第五节探讨了机器学习的主要挑战。
2. 机器学习-高性能计算挑战?
目前机器学习的实际应用包括对于Commodity Off-The-Shelf High Performance Computing(商品现成的高性能计算?);英特尔上的神经网络训练;再大型并行HPC系统上优化和有效扩展诸如提取天气模式之类的深度学习问题。
2.1纵向扩展
通常采用增加GPU的方式,或者使用专用的集成电路(ASIC),通过高度优化的设计实现专门的功能,例如谷歌的TPU,旨在加速tensorflow;也有设计了一种用于大规模神经网络的硬件加速器,再管道中引入了一个神经功能单元(NFU),将管道的输入相乘并将结果相加,并以交错的方式可选择的激活函数;或者利用深度压缩技术。这些都是采用提高单台机器的处理能力以进行大规模机器学习。
2.2横向扩展
对比于纵向,横向的优势是:1.设备成本较低;2.具有故障恢复能力;3.与单台机器相比,总I/O带宽增加了。当训练机器学习模型时,需要收集大量数据,对于每一个节点都有一个I/O是一个不错的选择,挑战在于不是所有的ML算法都适用于分布式计算模型,因此横向扩展一般用于能够高度实现并行的算法。
3. 分布式机器学习的架构
文章设计并提出了涵盖整个设计空间的通用架构,概述:在训练阶段,使用训练数据并调整超参数来优化ML模型,然后部署经过训练的模型,并为新数据提供预测。在训练阶段通常使用大量的算力,但是预测可以使用较少的计算能力。而且训练阶段和预测阶段并不排斥,二者可以并行,这里涉及到增量学习,结合了训练和预测,并通过使用自预测阶段的新数据不断训练模型。
图中表示分布式机器学习的两种模式,分别是数据并行和模型并行,对于数据并行,所有工作节点都可以使用相同的模型,因此可以与每个ML算法一起使用,并在数据样本上具有独立同分布;而模型并行中,整个数据的副本由于在模型的不同部分运行的工作节点处理,因此,模型是所有模型部分的集合,不能适用于所有算法。
3.1 机器学习算法
算法根据反馈、目的和方法三方面因素对数据做出预测。
3.1.1反馈
监督学习:使用由输入对象和所需要的输出值组成的训练数据,监督学习算法需要找到一个将输入数据映射到所需输出的函数,然后将函数应用于新数据以预测输出。缺点是模型越复杂,需要越多的训练数据来获取准确的预测。
无监督学习:使用没有输出值的输入对象来组成训练数据,无监督学习的目的在于找到一个能准确表达数据结构的函数,并对未排序的输入数据进行分组。常用于提取数据关键特征的降维问题,并使用相似性度量生成反馈。
半监督学习:少量标记数据辅以大量未标记数据。
强化学习:
3.1.2目的
异常检测、分类、收集、降维、表征学习、回归
3.1.3方法
进化算法(遗传算法):在计算所有生成模型的适应度得分后,下一次迭代会根据模型的突变和交叉创建新的基因型,从而产生更准确的估计。例如:神经网络、决策树。
基于随机梯度下降(SGD)算法:最小化定义在模型输出上的损失函数。损失函数通常代表要最小化的实际误差,例如在回归问题,模型输出和期望输出之间的均方误差,SGD是各种ML模型最常用的训练方法。
支持向量机(SVM):将数据点映射到高维向量以进行分类和聚合。
人工神经网络(ANN):一个输入层、一个或多个隐藏层和一个输出层,每层由通过具有相关权重的边连接到前一层和下一层的节点组成,与感知器不同,引入了非线性,通过改变突触的权值、网络布局或者函数来改变模型。可以分为以下几个方面:
(1)深度神经网络(DNN),具有许多隐藏层的人工神经网络
(2)卷积神经网络(CNNs /ConvNets)是深度前馈神经网络,使用卷积层,其节点仅连接到前一层的几个节点,然后使用池化层进行池化。卷积使网络仅考虑本地数据,由于这些卷积和池化层中多个链接在一起,可以使网络能识别大数据集中的复杂结构。
(3)循环神经网络(RNN)除了权重,还会跟踪时间状态,也就是网络的输入会影响当前决策。循环网络中的节点块作为具有不同记忆的单元运行,并且可以在任意长的时间跨度内存储信息。
(4)Hopfield 网络是一种非自反的对称递归神经网络,它们可以保证收敛到局部最小值。
(5)随机神经网络利用随机传递函数或随机权重,这使它们能够避开阻碍收敛到正常神经网络全局最小值的局部最小值。一个例子是玻尔兹曼机,其中每个神经元输出都表示为二进制值,神经元放电的可能性取决于其他神经元的网络。
基于规则的机器学习(RBML)算法:使用一组规则,每个规则代表问题的一小部分。这些规则通常表达一个条件,以及满足该条件时的值。—决策树,有时称为“CART”树(在分类和回归树之后),使用基于规则的机器学习来创建一组规则和决策分支。遍历树涉及在每一步应用规则,直到到达树的叶子。该叶子代表该输入的决策或分类。
主题模型 :是用于在大型和非结构化数据集合中查找和映射语义结构的统计模型,最常应用于文本数据。
矩阵分解算法:可用于识别潜在因素或在矩阵结构数据中查找缺失值。
3.2 超参数优化
1.一阶算法,使用至少一个函数的一阶导数,该函数将参数值映射到使用该参数的 ML 算法的精度。示例是随机梯度下降 (SGD)。
2.二阶技术,使用函数的任何二阶导数,将参数值映射到使用该参数的 ML 算法的精度。例如牛顿法,准牛顿法。
3.坐标下降(也称为坐标最小化),它在每次迭代中最小化单个变量,同时将所有其他变量保持在当前迭代的值。
4.Markov-Chain Monte-Carlo ,它的工作原理是连续猜测从以旧参数为中心的正态多元解中随机抽取的新参数,并使用这些新参数,机会取决于旧参数和新参数的可能性。
5.一个简单但经常使用的策略是网格搜索,它详尽地运行到每个超参数的潜在值网格。
6.随机搜索使用随机选择的试验对超参数值进行采样,与网格搜索相比,它通常在效率方面产生更好的结果,为相同的计算预算找到更好的参数值。
3.3组合
对于某些应用,单个模型不足以解决问题。为了缓解这个问题,可以在所谓的集成学习中组合多个模型。
• 随机森林:使用多个决策树并平均各个树所做的预测以提高整体准确性。不同的树被赋予相同的“投票权”。
• 学习分类器系统(LCS):是学习方法的模块化系统。 LCS 迭代数据集中的数据点,在每次迭代中完成整个学习过程。主要思想是 LCS 的规则数量有限。遗传算法将次优规则强制排除在规则集中。有许多不同的属性可以根据数据集彻底改变 LCS 的性能,包括密歇根风格与匹兹堡风格的架构、监督与强化学习、增量与批量学习 ,在线与离线训练,基于强度与基于准确性的 ,以及完整映射与最佳映射。
3.4 拓扑
设计分布式机器学习部署的另一个考虑因素是集群内计算机的组织结构。
•树状拓扑的优点在于易拓展和管理
•环形拓扑通过仅要求相邻节点通过消息同步来简化结构,可以将通信开销保持在最低。
•参数服务器使用一组分散的工作节点和一组维护共享状态的集中式主机,所有模型参数都存储在每个参数服务器上的一个分片中,所有客户端都从该分片中读取和写入作为键值存储。一个优点是所有模型参数(在一个分片内)都在一个全局共享内存中,这使得检查模型变得容易。缺点也是参数服务器,他的处理问题是最大的瓶颈。
•完全分布式:每个节点都有自己的参数副本,并且工作节点可以互相通信,具有更高的可拓展性和消除单点故障的优势,节点向所有其他节点广播更新以形成数据并行处理框架。
3.5通信
分布的选择直接影响训练模型所需的通信量。
3.5.1 计算时间与通信与准确性
对于分布式机器学习,目标在于以最低的计算和通信成本获得最佳的准确性。
实际部署需要寻求在可接受的计算时间内实现所需精度所需的通信量。
3.5.2桥接计算和通信
三个需要考虑的问题:
• 确定哪些任务可以并行执行。
• 决定任务执行顺序。
• 确保可用机器之间的负载均衡分布。
有以下几点技术可以实现并行计算和工作间通信的交错:
•批量同步运行(BSP),程序通过在每个计算和通信阶段之间进行同步来确保一致性,例如MapReduce,优点是保证输出正确的方案,缺点是节点必须在每个同步障碍处等待。
•过时的同步并行(SSP),允许较快节点继续进行一定的迭代,直到超过一定数量,暂停并等待。优点是依然有强大的模型收敛保证,缺点是当陈旧度过高时,收敛速度会迅速恶化。
•近似同步并行 (ASP), 限制了参数的不准确程度。这与 SSP 形成对比,后者限制了参数的陈旧程度。一个优点是,只要聚合更新无关紧要,服务器就可以无限期地延迟同步。一个缺点是很难选择定义哪些更新是重要的,哪些不是参数。
•无障碍异步并行/总异步并行(BAP/TAP),让工作机器并行通信,而无需等待彼此,优点是速度快,缺点是模型可能收敛缓慢甚至发展不正确,因为与 BSP 和 SSP 不同,误差随着延迟而增长。
3.5.3沟通策略
4 分布式机器学习生态系统
分布式机器学习生态系统。通用分布式框架和单机 ML 系统和库都在向分布式机器学习方向融合。云作为 ML 的新交付模型出现。
4.1通用分布式计算框架
分布式系统依赖于使用大量商品服务器,每台服务器的存储容量和计算能力都相对较小,而不是使用一台昂贵的大型服务器。
4.1.1存储
现有框架的存储层通常基于Google文件系统(GFS)或类似的实现,GFS 将上传到集群的数据分成块,然后分布在块服务器上。块被复制(复制程度是可配置的)以保护数据在机器故障时不可用。然后,用户可以通过联系主节点访问块服务器上的数据,主节点充当名称节点并提供文件每个块的位置。
4.1.2 计算
虽然存储架构基本上已经收敛到基于块的模型,但存在许多用于调度和分配任务以计算具有不同特性和权衡的资源的竞争框架。
MapReduce:google开发的处理数据的框架,用于在分布式环境中。首先映射(map)阶段,数据被拆分成元组,映射阶段可以并行执行。然后在shuffle阶段,元组在节点之间交换并传递,因为聚合通常具有数据依赖性,必须却确保同一键的所有元组由同一节点处理。随后reduce阶段,对元组聚合以生成每个键的单个输出值,它使用产生单个结果的二阶函数来汇总集合,然而reduce不能并行,因为每一个reduce都依赖于前一个步骤。框架的好处是数据可以分布在大量机器上,因此可以完全并行执行,并将程序移动到数据中。此外,mapreduce通过监控节点的健康状态并将失败任务调度到健康节点,实现高容错。mapreduce类似于之前的批量同步处理(BSP)。
Apache Spark:MapReduce在执行阶段依赖于分布式文件系统,因此对于需要重复访问相同数据的迭代工作可能不理想,此外map和reduce的范式对于支持迭代任务的数据流也不理想,因为他本质是将其限制为树结构。Apache Spark能在内存中执行转换(映射map)和动作(归约reduce)的有向无环图。例如,当需要两个连续的映射阶段时,需要执行两个 MapReduce 任务,这两个任务都需要将所有(中间)数据写入磁盘。然而,Spark 可以将所有数据保存在内存中,从而节省了昂贵的磁盘读取。Spark的数据结构是弹性分布式数据集(RDD),此类数据集只读,只能从存储在磁盘上的数据或转换现有RDD来创建新实例,当数据丢失,每个RDD都有谱系图,确保了Spark可以从谱系图追踪RDD遵循的路径并重新计算丢失的数据,并且不包含循环,实践中包含检查点,避免大量重新计算。
4.2 本地分布式机器学习系统
由于机器学习在许多应用中的日益普及,围绕特定分布模型开发了几个特定领域的框架。
4.2.1分布式集成学习
许多通用框架和ML库对分布式训练支持有限,例如MapReduce,使用这些框架实现分布式的一种方法是,为可用数据子集单独的训练模型,在预测时,输出可以通过标准集成模型聚合,但最大的缺点是,依赖于训练数据的适当细分,当某些模型的训练集存在较大误差,那可能导致集成输出有偏差,如果数据是手动划分,那要确保数据的独立同分布。
4.2.2并行同步随机梯度下降
常见的比如AllReduce,用于在每次操作后将所有节点的梯度应用到最后一个公共模型状态,然后将该操作的结果传播回每一个工作节点。最初,每个节点计算一个局部梯度值,将这些值与从其子节点接收到的值进行累加,并将这些值发送给其父节点(减少阶段)。最终,根节点获得全局和并将其广播回叶节点(广播阶段)。然后每个节点根据接收到的全局梯度更新其局部模型。
百度的进一步优化是Ring AllReduce,通过将机器集群构成为一个环(每个节点只有两个邻居)并级联归约操作,瓶颈是相邻节点之间的带宽延迟。baidu已集成到Tensorflow中。
4.2.3并行异步随机梯度下降和参数服务器
异步更加复杂,但是异步缓解了集群中由于缺乏频繁的同步障碍而导致的故障率高或性能不一致的问题。
早期,google开发了一个大规模分布式ML—DistBelief,DistBelief支持在数万个CPU内核上进行并行训练。DistBelief利用神经网络的结构并将模型定义为计算图,每个节点实现将输入转换为输出的操作,每台机器都执行部分计算图节点的训练,节点可以跨越神经网络多层的子集。当节点的输出被用作另一个机器训练的节点的输入时才会通信。缺点在于由于有限的跨分区通信,模型属于并行的,而全连接模型具有更实质的跨分区依赖关系,很难通过DistBelief进行有效分布。
在模型并行上,提出了数据并行(数据不是在不同设备不一样吗,什么是并行)。
- Downpour随机梯度下降是固有顺序SGD的异步替代方案,模型的每个副本在更新前从参数服务器获取最新模型参数,根据模型更新这些参数,并将参数梯度推送到参数服务器。Downpour随机梯度下降对于机器故障有较好的容错,但是由于参数不同步,优化过程不是那么可预测。
- 分布式L-BGFS,利用外部协调器进程在模型副本之间分配训练工作,以及对参数服务器分片之间的参数进行操作。参数服务器每个分片都包含模型空间一部分,模型副本从所有分片中提取参数,并且模型的每个并行部分仅检索它所需的参数。该方法计算复杂性较高,其中,DisBelief不支持分布式训练。
- Tensorflow是DisBelief的演变。Tensorflow是作为开源提供的,它将模型算法和状态都表示为数据流图,它是分布式的。tensorflow模型首先被定义为数据流图,构建此图后,将对其优化,然后再可用硬件上执行,这种执行允许Tensorflow针对可用的设备类型定制其操作。
4.2.4 并行陈旧同步随机梯度下降
Petuum是一个大型的机器学习通用平台,与专注于容错和恢复的Spark不同,Petuum利用ML的容错性、动态结构依赖性和非均匀收敛性来在大型数据集和模型上实现良好的可扩展性,平台使用过时的同步性来利用机器学习对错误的固有容忍度,因为少量的过时对模型收敛影响很小。采用动态调整策略来利用动态结构依赖关系,大幅度减少并行化错误和同步成本。最后,未收敛的参数优先级通过减少已经接近最优的参数的计算成本来利用非均匀收敛。
使用 Petuum 开发模型时,开发人员必须实现一个名为 push 的方法,该方法负责每个并行化的模型训练操作。它的实现应该从参数服务器中提取模型状态,运行训练迭代,并将梯度推送到参数服务器。 Petuum 默认自动管理调度方面和参数合并逻辑,因此数据并行模型不需要任何额外的操作。但是,如果需要模型并行性,则需要将 schedule 方法(告诉每个并行工作人员他们需要训练哪些参数)和 pull 方法(定义每个生成的参数梯度的聚合逻辑)实现为好。 Petuum 提供了一个抽象层,它还允许它在使用 YARN(Hadoop 作业调度程序)和 HDFS(Hadoop 文件系统)的系统上运行,这简化了与预先存在的集群的兼容性。
4.2.5并行混合同步SGD。
同步和异步都有一些明显的缺点,一些框架试图寻找一个中间立场。
MXNet-MPI采用了一种分布式 ML 方法(使用 MXNet 的修改版本作为概念证明),它结合了异步(参数服务器)和同步(MPI)实现的一些最佳方面。 这里的想法是使用与 MXNet 部分中描述的相同的架构。 然而,不是让单个工作人员与参数服务器通信,而是将这些工作人员聚集成组,在内部通过 MPI 应用同步 SGD 和 AllReduce。 这具有同步 MPI 方法的简单线性可扩展性和异步参数服务器方法的容错性的好处。
4.3 云里的机器学习
一些云运营商已将机器学习作为一项服务添加到他们的云产品中。大多数提供商提供在其云中执行机器学习任务的多种选项,从 IaaS 级服务(带有预打包 ML 软件的 VM 实例)到 SaaS 级解决方案(机器学习即服务)。提供的大部分技术是标准的分布式机器学习系统和库。除其他外,谷歌的云机器学习引擎提供对 TensorFlow 的支持,甚至提供 TPU 实例 。 Microsoft Azure 机器学习允许通过 Azure Kubernetes、批处理服务或使用 CNTK VM 进行模型部署。作为谷歌 TPU 的竞争对手,Azure 支持通过 FPGA 加速 ML 应用程序。 Amazon A WS 推出了 SageMaker,这是一种用于在云中构建和训练机器学习模型的托管服务。该服务包括对 TensorFlow、MXNet 和 Spark 的支持。 IBM 已将其云机器学习产品捆绑在 Watson 品牌下。服务包括 Jupyter notebook、Tensorflow 和 Keras。基于云的交付模型变得越来越重要,因为它减轻了设计智能应用程序的负担,这些应用程序促进了机器学习技术。然而,云不仅是分布式机器学习技术的消费者,而且还在推动新系统和方法的开发,并返回生态系统以处理大规模部署。
5. 结论和挑战
分布式机器学习是一个蓬勃发展的生态系统,拥有各种架构、算法、性能和效率不同的解决方案。必须首先克服一些基本挑战才能使分布式机器学习可行,例如找到有效并行数据处理的机制,同时将结果组合成一个连贯的模型。
5.1 性能
经常看到的权衡是通过添加额外资源以减少总处理时间(即降低效率)为代价减少挂钟时间。当计算资源足够负担得起时,许多机器学习的实际用例会从快速训练中获益最多。这通常意味着总计算资源和相关能源消耗的大幅增加这一事实并不重要,只要模型节省的资金多于训练成本即可。
5.2 容错
基于同步 AllReduce 的方法似乎比参数服务器方法(达到一定的集群大小)显着更好地扩展,但缺乏容错能力:单台机器的故障会阻塞整个训练过程。在较小的规模上,这可能仍然是一个可以管理的问题。然而,经过一定数量的节点,任何节点不可用的概率变得高到足以导致近乎连续的停顿。这些受 HPC 启发的模式的常见实现,例如 MPI 和 NCCL,完全缺乏容错性。
异步实现不会受到这个问题的影响。它们旨在明确容忍散乱的[41](运行缓慢)和故障节点,对训练性能的影响很小。那么,对于 ML 操作员来说,问题是他们更喜欢性能还是容错,以及他们是否受到其中任何一个的限制。混合方法甚至提供了一种定制这些特征的方法,尽管它们还没有经常被使用。看看是否存在更好的方法,或者是否有一种有效的方法来实现容错 AllReduce,将会很有趣。
5.3 隐私
在某些情况下,将训练数据的不同子集彼此隔离是有益的,甚至是强制性的 [79]。最严重的情况是,模型需要在数据集上进行训练,每个数据集都存在于不同的机器或集群上,并且在任何情况下都不能位于同一位置,甚至不能移动。像 Gossip Learning [112] 这样的点对点拓扑完全接受了这一原则。在隐私敏感的上下文中训练模型的另一种方法是使用分布式集成模型。这允许训练数据子集的完美分离,缺点是需要找到一种方法来适当地平衡每个训练模型的输出以获得无偏的结果。
基于参数服务器的系统在隐私方面很有用,因为模型的训练可以与训练结果分开。
联邦学习系统可以部署在多方共同学习准确的深度神经网络的地方,同时保持数据本身的本地性和机密性。正如 Shokri 和 Shmatikov [140] 和 McMahan 等人所示,通过应用差分隐私可以保护各个数据的隐私。 [97]。然而,Hitaj 等人。 [71] 设计了一种基于 GAN 的攻击,表明记录级差分隐私在联邦学习系统中通常无效。
此外,可以将统计噪声引入训练数据的每个子集,以使其敏感特征无法被其他方识别。
5.4 可移植性
随着机器学习(尤其是深度学习)的普及,建立了无数用于创建和训练神经网络的不同库和框架。然而,一旦经过训练,人们通常会坚持手头的框架来在生产中部署模型,因为它们都使用自定义格式来存储结果。例如,Tensorflow [2] 使用 SavedModel 目录,其中包括定义整个计算图的协议缓冲区。 Caffe [78] 还使用二进制协议缓冲区来存储保存的模型,但具有自定义模式。 Theano [18] 使用 pickle 序列化由 Python 对象表示的模型,PyTorch [117] 具有内置的 save 方法,可以序列化为自定义 ASCII 或二进制格式。
对于想要部署的硬件平台,可移植性也变得越来越重要。尽管 x86_64 和 ARM 处理器架构分别是在服务器和移动设备市场中执行应用程序的主流,但我们见证了使用 GPU 硬件高效执行神经网络模型的转变[108]。随着机器学习模型变得越来越普遍,我们还看到更多定制 ASIC 的开发,例如 Google Cloud 中的 TPU [128] 或最新 iPhone [11] 中的专用神经网络硬件。这种多样化使得确保您训练的模型可以在任何这些硬件平台上运行变得更加困难。迈向可移植性的第一步是出现了一些独立于框架的规范来定义机器学习模型和计算图。开放式神经网络交换 (ONNX) 格式定义了一个协议缓冲区模式,该模式定义了可扩展的计算图模型以及标准运算符和数据类型的定义。目前,Caffe、PyTorch、CNTK 和 MXNet 等框架开箱即用地支持 ONNX,并且存在转换器,例如 TensorFlow。 Apple 的 Core ML 格式 [10] 和 Khronos Group 的神经网络交换格式 [150] 推动了通用模型格式规范的类似努力。