本文由牛旦课堂发布,墨子老师 编辑
参考链接:https://www.infoworld.com/article/3542595/6-python-libraries-for-parallel-processing.html
想要将沉重的Python工作负载分布到多个CPUs或一个计算集群上,怎么办?下面介绍的这些框架可以协助你来完成这种工作。
1.导语
Python在便利性和程序员友好性方面很有优势,但它并不是最快的编程语言。它的一些速度限制是由于它的默认实现cPython是单线程的。也就是说,cPython一次不会使用超过一个硬件线程。
虽然可以使用Python内建的线程(threading)模块来加快速度,但线程只提供并发性,而不是并行性。它适用于运行不依赖于CPU的多个任务,但对于每个任务都需要满CPU加速的多个任务没有任何帮助。
Python确实包含了跨多个cpu管理Python工作负载的原生方式。multiprocessing模块可编造出(spins up)Python解释器的多个副本,使得每个副本都位于单独的内核上,并为跨核拆分任务提供原语服务。但有时multiprocessing(多核处理)还不够满足需要。
有时候,作业不仅需要在多个内核上分发工作,还需要在多台机器上分发工作。这就是本文这6个Python库和框架的作用。下面的所有6个Python工具包都允许您使用现有的Python应用程序,并将工作分散到多个内核、多台机器,或两者同时进行。
2.Ray
Ray(https://ray.io)是由加州大学伯克利分校的一组研究人员开发的,是许多分布式机器学习库的基础。但是Ray并不仅仅局限于机器学习任务,即使这是它最初的用例情景。任何Python任务都可以通过Ray分解并分布到不同的系统中。
Ray的语法是最小化的,所以您不需要大量地重新修改现有的应用程序以并行化处理它们。 @ray.remote 装饰者将该函数分布到Ray集群中的任何可用节点上,并可选择指定要使用多少个CPUs或GPUs参数。每个分布式函数的结果都作为Python对象返回,因此它们易于管理和存储,并且节点之间或节点内部的复制量保持在最低水平。例如,最后一个特性在处理NumPy数组时就很方便。
Ray甚至包括了它自己内置的集群管理器,它可以根据需要在本地硬件或流行的云计算平台上自动旋转/编制(Spin up)节点。
3.Dask
从外表上看,Dask很像Ray。它也是一个用于Python中分布式并行计算的库,具有自己的任务调度系统、对Python数据框架(如NumPy)的感知以及从一台机器扩展到多台机器的能力。
Dask的工作方式有两种。第一种是通过并行数据结构——本质上是Dask自己版本的NumPy数组、列表或Pandas DataFrames。这些结构的Dask版本中交换或调换它们的默认值,Dask将自动将它们的执行分散到集群中。这通常只涉及更改导入的名称,但有时可能需要重新编写才能完全工作。
第二种方式是通过Dask的低级并行机制,包括函数装饰器,将作业分发到节点并同步(“即时”模式)或异步(“惰性”)返回结果。这两种模式也可以根据需要混合使用。
Dask和Ray之间的一个关键区别是调度机制。Dask使用一个集中式调度程序来处理集群的所有任务。Ray是分散式的,这意味着每台机器运行自己的调度器,因此任何与调度任务有关的问题都在单个机器上处理,而不是在整个集群中。
Dask还提供了一个叫做“actor”的先进且仍处于实验阶段的功能。actor是指向另一个Dask节点上的作业的对象。这样,需要大量本地状态的作业可以就地运行,并由其他节点远程调用,因此不必复制作业的状态。Ray缺乏Dask的actor模型来支持更复杂的工作分配。
4.Dispy
Dispy(dispy.sourceforge.net)允许您跨计算机集群分发整个Python程序或单个函数,以便并行执行。它使用原生平台机制进行网络通信,以保持速度和效率,因此Linux、MacOS和Windows机器都能同样出色地工作。
Dispy语法在某种程度上类似于multiprocessing,因为您显式地创建一个集群(其中multiprocessing要求您创建一个进程池),向集群提交工作,然后检索结果。修改作业后以使Dispy生效可能需要多做一些工作,但是您还可以精确地控制如何分派和返回这些作业。例如,您可以返回临时或部分完成的结果,作为作业分发过程的一部分传输文件,并在传输数据时使用SSL加密。
5.Pandaral·lel
Pandaral.lel(https://github.com/nalepae/pandarallel),顾名思义,是一种跨多个节点并行处理Pandas作业的方法。缺点是Pandaral.lel只与Pandas合作。但是,如果您使用的是Pandas,而您所需要的只是在一台计算机上跨多个核加速Pandas作业,Pandaral.lel则会专注于这项任务。
请注意,虽然Pandaral.lel确实运行在Windows上,但它只会运行在从Windows子系统中为Linux启动的Python会话中。MacOS和Linux用户可以按原样运行Pandaral.lel。
6.Ipyparallel
Ipyparallel是另一个专注于多核处理和任务分发的系统,专门用于跨集群并行地执行Jupyter notebook代码。已经在Jupyter工作的项目和团队可以立即开始使用Ipyparallel。
Ipyparallel支持许多并行代码的方法。在简单的一端上是map,它将任何函数应用于序列,并在可用节点之间均匀地分割工作。对于更复杂的工作,可以将特定函数装饰为始终远程运行或并行运行。
Jupyter notebooks支持“魔法命令”,只有在notebook环境中才能执行操作。Ipyparallel自己添加了一些神奇的命令。例如,您可以在任何Python语句前面加上%px来自动并行化处理它。
7.Joblib
Joblib(https://github.com/joblib/joblib)有两个主要目标:并行运行作业,如果没有任何更改,则不重新计算结果。这些效率使得Joblib非常适合科学计算,在那里可重复的结果是神圣不可分割的。Joblib的文档提供了大量如何使用其所有特性的示例。
用于并行化工作的Joblib语法非常简单——相当于一个装饰器,可用于在多个处理器之间分割作业或缓存结果。并行作业可以使用线程或进程。
Joblib包括一个透明的磁盘缓存,服务于由计算作业创建的Python对象。如上所述,此缓存不仅可以帮助Joblib避免重复工作,而且还可以用于挂起和恢复长时间运行的作业,或者在作业崩溃后恢复其中断的位置。缓存还针对NumPy数组等大型对象进行了智能优化。使用numpy.memmap,同一系统上的进程可以在内存中共享数据区域。
Joblib没有提供跨多台独立计算机分配作业的方法。理论上可以使用Joblib的管道来实现这一点,但是使用另一个原生性支持它的框架可能更容易。
Joblib是一组在Python中提供轻量级管道机制的工具。特别是:
- ü 函数的透明磁盘缓存和延迟重新计算(记忆模式);
- ü 简单并行计算;
Joblib经过了优化,特别是在处理大型数据时速度更快、更健壮,并且对numpy数组进行了特定的优化。
8.小结
本文主要介绍了Python 6大对并行处理支持良好的库(或说并行处理框架),各有特色,都可为大数据量的处理提供更高效的支持,提高应用的性能和速度。