项目主页:GitHub.
在过去的几年里,增加加工能力计算机器的发展导致了机器学习的进步。越来越多的算法利用并行性和分布式训练来处理大量的数据。然而,因此需要增加数据和训练,这给管理和利用大规模计算资源的软件带来了巨大的挑战。
在优步,我们开发了一些算法,比如诗人那去探索,GTN.利用大量计算来培训神经网络上的模型。我们开发出了这样的算法的未来几代大规模计算,我们开发了纤维是一个新的分布式计算库,可轻松帮助用户将本地计算方法缩放到数百甚至数千台机器。光纤使用Python快速,简单,富裕,效率高效地电源大规模计算项目,简化了ML模型培训过程并导致更优化的结果。
大规模分布式计算的挑战
在理想情况下,将运行在一台机器上的应用程序扩展到运行在一组机器上的应用程序应该与更改命令行参数一样简单。然而,在现实世界中,这并不是一项简单的任务。
在每天与许多运行大规模分布式计算作业的人一起工作时,我们发现现在有几个原因是为什么利用分布式计算的原因如下:
- 在笔记本电脑或桌面上本地工作以及生产群集中的运行代码之间存在巨大差距。你(们)能做到MPI.在本地工作,但它是一个完全不同的过程,可以在计算机群集中运行它。
- 动态缩放不可用。如果您启动了一个需要大量资源的作业,那么您很可能需要等待所有资源都分配好之后才能运行作业。这种等待时间使得扩展的效率降低。
- 错误处理缺失。在跑步时,一些工作可能会失败。这可能强迫您恢复部分结果或丢弃整个运行。
- 学习成本很高。每个系统都有不同的api和编程约定。要用一个新系统启动作业,用户必须学习一组全新的约定。
新的光纤平台专门解决了这些问题。通过这样做,它为更广泛的用户群体提供了无缝的大规模分布式计算。
引进纤维
Fiber是一个用于现代计算机集群的基于python的分布式计算库。用户可以利用这个系统来为整个计算机集群编程,而不是只对一台台式机或笔记本电脑编程。最初开发它是为了支持大规模并行科学计算项目,比如诗人Uber使用它来动力类似的项目。光纤是如此强大,因为它是:
- 很容易使用。Fiber允许用户编写在计算机集群上运行的程序,而不需要深入研究计算机集群的细节。
- 很容易学。光纤提供与Python标准相同的API多处理图书馆。了解如何使用多处理的工程师可以轻松地使用光纤程序进行编程计算机集群。
- 速度快,可靠。光纤的通讯骨干内置于顶部纳米,一个高性能的异步消息传递库,允许快速可靠的通信。
- 不需要部署。光纤的运行方式与计算机集群上的普通应用程序相同。它为用户自动处理资源分配和通信。
- 提供可靠的计算。光纤的内置错误处理允许用户专注于编写实际应用程序代码,而不是处理崩溃。在运营一部工人时,这尤其有价值。
除了这些好处之外,Fiber还可以与性能至关重要的领域中的其他专门框架一起使用。例如,对于随机梯度下降(SGD),光纤环特性可以帮助在计算机集群上设置分布式训练作业,允许它与其一起运行霍洛维多要么火炬。
光纤帮助在大规模分布式计算上工作的用户减少了在计算集群上实际运行分布式作业的想法的时间。它还可以屏蔽用户处理配置和资源分配任务的繁琐细节,以及启用更快的调试周期并简化从本地到群集开发的转换。
体系结构
Fiber将经典的多处理API与可在不同集群管理系统上运行的灵活后端连接起来。为了实现这种集成,光纤被分为三个不同的层:API层、后端层和集群层。API层为光纤提供了基本的构建块,如进程、队列、池和管理器。它们具有与多处理中相同的语义,但我们对它们进行了扩展,使其能够在分布式环境中工作。后端层处理在不同的集群管理器上创建或终止作业等任务。当用户添加新的后端时,不需要更改所有其他光纤组件(队列、池等)。最后,集群层由不同的集群管理器组成。尽管它们不是纤维本身的一部分,但它们帮助纤维管理资源并跟踪不同的工作,从而减少纤维需要跟踪的项目数量。这个总体架构总结如下图2:
Job-backed流程
光纤引入了一个名为的新概念职位支持的进程(也称为纤维过程)。这些和流程在Python的多处理库中,但更灵活:虽然多处理中的进程仅在本地机器上运行,但是光纤过程可以在不同的机器或本地在同一台机器上远程运行。启动新的光纤过程时,光纤在当前计算机集群上使用正确的光纤后端创建新作业。
Fiber使用容器封装当前流程的运行环境,如图3所示。包括所有必需的文件、输入数据和其他依赖程序包,确保每个元素都是自包含的。所有子进程都使用与父进程相同的容器映像启动,以保证一致的运行环境。因为每个进程都是一个集群作业,所以它的生命周期与集群上的任何作业相同。为了方便用户使用,Fiber被设计成直接与计算机集群管理器交互。正因为如此,光纤不需要在多台机器上设置,也不需要通过任何其他机制启动Apache火花要么IpyPallel。它只需要作为一个普通的Python pip包安装在一台机器上。
组件
光纤在光纤过程顶部实现大多数多处理API,包括管道,队列,池和管理器。
光纤中的队列和管道行为与多处理中的方式相同。不同之处在于光纤中的队列和管道由不同机器上运行的多个进程共享。可以从两个过程读取并写入同一管道。此外,可以在不同机器上的许多进程中共享队列,并且每个进程可以同时发送到或从同一队列中发送。光纤的队列是用NaNOMSG实现高性能异步消息队列系统的。
游泳池光纤也支持,如下图5所示。这些允许用户管理工作池。纤维延伸池职位支持的进程这样它就可以管理每个池数千名(远程)工人。用户还可以同时创建多个池。
经理和代理对象使光纤支持共享存储,这在分布式系统中是至关重要的。通常,计算机集群的外部存储系统,如Cassandra和Redis处理这个功能。相反,Fiber提供了内置的内存存储供应用程序使用。该接口与多处理系统中管理器类型的接口相同。
环是对多处理API的扩展,可以有用在分布式计算设置中。光纤中的环是指作为相对等于共同合作的一组过程。与池不同,戒指没有主要进程和工人流程的概念。环内的所有成员都有大致相同的责任水平。光纤的戒指模型拓扑(如图6所示,如下图6所示)在进行分布式SGD时在机器学习中非常常见。例子包括火炬和霍洛维多。通常,在计算机集群上启动这种工作负载非常具有挑战性;光纤的这种环形特性有助于建立这样的拓扑结构。
应用程序
对于上面描述的每个灵活组件,我们现在可以使用Fiber构建应用程序。这里,我们展示了Fiber帮助用户构建分布式应用程序的两种方法。
推动新应用程序
在下面的示例中,我们展示了工程师可以应用光纤以实现大规模分布式计算。这个例子是一个演示加强学习(RL)算法。分布式RL的通信模式通常涉及在机器之间发送不同类型的数据,包括动作,神经网络参数,梯度,每步骤/剧集观察和奖励。
光纤实现了管道和池来传输数据。实际上,池是普通的Unix套接字,为使用光纤的应用程序提供接近线路速度的通信。现代计算机网络的带宽通常高达每秒数百千兆比特。通过网络传输较小数量的数据一般快。
另外,如果存在许多不同的处理将数据发送到一个过程,则进程间通信延迟不会增加太多,因为数据传输可以并行发生。这一事实使得光纤的池适合于为许多RL算法提供基础,因为模拟器可以在每个池工人流程中运行,并且结果可以并行传输。
下面的示例显示了使用光纤实现的简化RL码:
#纤维。BaseManager是一个远程运行的管理器
类RemoteenvManager.(fiber.managers.AsyncManager):
通过
类env.(gym.env):
#健身房env
通过
remoteenvManager.register(“Env”Env)
defbuild_model():
#创建一个新的策略模型
返回模型
defupdate_model.(模型,观察):
#用观测数据更新模型
返回新模式
def火车():
模型= build_model ()
Manager = RemoteenVManager()
num_envs =10.
envs = [Manager.env()对于一世在范围(num_envs)]
Handles = [envs [i] .reset()对于一世在num_envs]
Obs = [Handle.get()用于处理中的手柄]
对于一世在范围(1000):
动作=模型(OB)
handles = [env.step()对于行动在行动]
奥林匹克广播服务公司= [handle.get ()对于处理在处理)
model = update_model(型号,obs)
启用现有的多处理应用程序
许多Python用户利用了多处理。Fiber为这样的应用程序提供了广阔的机会,它可以在类似Kubernetes的计算机集群上的分布式设置中运行,只需要修改几行代码。
作为一个例子,Openai基线是做RL的人非常流行的一个库,它有很多参考算法,比如DQN.和PPO。它的缺点是它只在一台机器上工作。如果要大规模培训PPO,您必须创建基于MPI的系统并手动设置群集。
相比之下,通过光纤,事情更容易。它可以无缝地扩展像PPO这样的RL算法,以利用数百个分布式环境工作者。光纤提供与多处理相同的API,这是Openai基线用于在本地收获多核CPU处理能力。使Openai基线与纤维一起使用的变化只是一行:
通过此代码更改,Openai基准可以在Kubernetes上运行。我们提供了在Kubernetes上运行Openai基线的完整指南这里。
错误处理
光纤实现了基于池的错误处理。当创建一个新的池时,还会创建一个相关的任务队列、结果队列和挂起表。然后,用户可以将新创建的任务添加到任务队列中,该任务队列在主进程和工作进程之间共享。每个worker从任务队列中获取单个任务,然后在该任务中运行任务函数。每当用户从任务队列中删除一个任务时,Fiber就会在挂起表中添加一个条目。一旦worker完成该任务,它就将其结果放入结果队列中。然后,Fiber从挂起的表中删除与该任务相关的条目。
图7:左侧是一个常规光纤池,有四名工人。在右侧,Worker 3失败和纤维因此开始新的工人进程(工人5),然后就准备好添加到池中。
如果池工人进程在处理的中间失败,如上图7所示,父池检测到该失败,该级池是所有工作进程的进程管理器。然后,如果先前发生的进程具有挂起任务,则父池将挂起的挂起的任务从挂起的表中返回到任务队列中。接下来,它启动一个新的工人进程来替换先前失败的进程,并将新创建的工作进程绑定到任务队列和结果队列。
性能
Fiber最重要的应用之一是扩展RL等算法和ES等基于人群的方法的计算。在这些应用程序中,延迟是关键。RL和基于填充的方法通常应用于需要频繁与模拟器交互的设置中(例如啤酒那健身房,Mujoco.)评估政策并收集经验。通过等待模拟器的结果引入的延迟批判性地影响整体培训表现。
为了测试光纤,我们与其他框架相比评估其性能。我们还添加了射线在我们的框架开销测试中提供了一些初步的结果,并希望在将来添加更详细的结果。
通常有两种方法可以降低RL算法和基于人口的方法的延迟。要么我们可以减少需要转移的数据量,或者我们可以更快地使不同流程之间的通信信道。为了加速加工通信,纤维使用NaNOMG实现管道和池。此外,用户甚至可以进一步增强与库的性能speedus。
框架开销
框架中的组件通常会影响计算资源,因此我们测试了Fiber的开销。我们比较了Fiber、Python多处理库、Apache Spark、Ray和ipyparallel。对于我们的测试过程,我们创建了一批工作负载,总共需要固定的时间来完成。每个任务的持续时间从一秒到一毫秒不等。
我们在本地运行五个工作人员,并调整了批量大小以确保每个框架的总完成时间大约是一秒(即,持续一毫秒,我们运行了5,000个任务)。我们的假设是光纤应与多处理类似,因为既不是光纤也不依赖于复杂的调度机制。相比之下,我们认为Apache Spark,Ray和Ipypallel,比纤维更慢,因为它们依赖于中间的调度率。
当任务持续时间为100毫秒或更高时,光纤几乎没有差异,并且比其他框架更接近多处理库,因为任务持续时间跌至10毫秒或一毫秒。
我们使用多处理作为参考,因为它非常轻量化,并且不实现任何其他附加功能,超出创建新进程和并行运行任务。此外,它仅利用仅在本地可用的通信机制(例如,共享内存,UNIX域套接字等)。这使得支持分布式资源管理系统的其他框架难以超越多处理,因为这些系统无法利用类似机制。
与纤维相比,IPYPALLIPLES和Apache火花在每个任务期间都落后于此。当任务持续时间为一毫秒时,IPYPLIALLES比纤维长24倍,Apache Spark花了38倍。此结果突出显示,当任务持续时间短时,IPYPALLIPLEX和APACHE STARK都会引入相当大的开销,并且与使用模拟器的RL和基于人口的方法的光纤不那么合适,并且具有几毫秒的响应时间。我们还表明,在运行一毫秒任务时,光线比光纤长约2.5倍。
分布式任务测试
为了探究Fiber的可伸缩性和效率,我们将其与ipyparallel进行了比较,由于前面的性能测试结果,我们没有考虑Apache Spark。我们还忽略了Python多处理库,因为它不能扩展到单个机器之外。基于运行50次迭代所花费的时间,我们测试了Fiber和ipyparallel的可伸缩性和效率进化策略(es)。
使用相同的工作量,我们预期的光纤完成更快,因为它的开销比IPYPLILLEL更少,如上前测试所示。对于纤维和IPYPLIALL,我们使用了2,048的人口大小,因此无论工人数量如何,总计算都是固定的。我们也实现了相同的共享噪声表技巧在这两个地方,每8个工人共用一张噪音表。本工作的实验领域是一个改良版的双足行走的硬核环境Openai健身房与修改描述这里。
主要结果是,光纤比IPYPLIALL缩放得多,并完成每个测试明显更快。纤维的时间长度随着32到1,024的工人数量的增加而逐渐减少。相比之下,IPYPALLINLE的时间从256增加到512名工人。由于其流程之间的通信错误,Ipypallel并未使用1,024名工人完成运行。此故障破坏了IPYPALLIPLEX的运行大规模并行计算的能力。由于Amdahl的法律当时工人的数量增加512时,我们看到纤维的回报递减。在这种情况下,主进程可以处理数据波束的速度。
总体而言,纤维的性能超过了IPYPALLIPLE,所有工作人员都有测试。此外,与IPYPALLIPLEX不同,光纤还与1,024名工人一起完成运行。与IPYP公共相比,此结果突出显示光纤更好的可扩展性。
结论
光纤是一个新的Python分布式库现在开源。我们设计它使用户能够在计算机群集中轻松实现大规模计算。这里的实验突出了光纤实现了许多目标,包括有效利用大量的异构计算硬件,动态缩放算法,以提高资源使用效率,并降低在计算机集群上进行复杂算法所需的工程负担。
我们希望光纤将进一步实现在解决困难的工程问题方面,使其更容易开发方法并以真正看到它们的规模运行它们。有关详细信息,请参阅光纤GitHub.存储库。









