分布式并行Python
项目描述
关于Ppft
ppft 是 Parallel Python (pp) 的友好分支。 ppft 将 Parallel Python 扩展到提供与 pip 和 setuptools 的打包和分发支持,Python 3 的支持,以及使用 dill.source 的增强序列化。 ppft 使用 Parallel Python 提供在 SMP(具有多个处理器或核心的系统)和集群(通过网络连接的计算机)上并行执行Python代码的机制。
用Python编写的软件在广泛的类别中找到应用,包括业务逻辑、数据分析、科学计算。这与市场上广泛可用的 SMP 计算机(多处理器或多核心)和集群(通过网络连接的计算机)一起,产生了并行执行Python代码的需求。
为SMP计算机编写并行应用程序最常见的方法是使用线程。然而,Python解释器使用GIL(全局解释器锁)进行内部记账,其中GIL一次只允许执行一条Python字节码指令,即使在SMP计算机上也是如此。Parallel Python克服了这一限制,并提供了一种简单的方法来编写并行Python应用程序。内部,使用进程和IPC(进程间通信)来组织并行计算。Parallel Python编写得让IPC的细节和复杂性由内部处理,而调用应用程序只需提交作业并检索结果。使用Parallel Python编写的软件可以在通过本地网络或互联网连接的许多计算机上并行工作。跨平台可移植性和动态负载均衡使得Parallel Python即使在异构和多平台集群上也能有效地并行化计算。有关Parallel Python的更多信息,请访问http://www.parallelpython.com。
ppft是异构计算Python框架pathos的一部分。ppft正在积极开发中,因此任何用户反馈、错误报告、评论或建议都备受赞赏。问题列表位于https://github.com/uqfoundation/ppft/issues,历史列表维护在https://uqfoundation.github.io/project/pathos/query。
主要功能
ppft提供以下功能:
在SMP和集群上并行执行Python代码
基于作业的并行化易于理解
自动检测有效处理器的数量
动态处理器分配(在运行时)
对于具有相同功能的作业具有低开销(通过透明缓存)
动态负载均衡(在运行时分配作业)
容错性(如果节点失败,任务将在其他节点上重新安排)
自动发现计算资源
动态分配计算资源
基于SHA的网络连接认证
增强序列化,使用dill.source
当前版本
ppft的最新发布版本可在以下位置获取:
ppft在3条款BSD许可下发布,并且是pp-1.6.6的分支。
开发版本
您可以在以下位置获取具有所有最新功能的最新开发版本:
如果您有新的贡献,请提交拉取请求。
安装
ppft可以使用pip安装
$ pip install ppft
要包含增强序列化,使用dill.source,请安装
$ pip install ppft[dill]
如果Parallel Python已经安装,则应在安装ppft之前将其卸载 - 否则,import pp可能指向原始版本而不是分支。
需求
ppft需要:
python(或pypy),>=3.8
setuptools,>=42
可选需求
dill,>=0.3.9
基本用法
ppft是Parallel Python包(pp)的分支,已经从Python 2转换为Python 3,并符合PEP 517,并增加了dill.source。对于简单的并行执行,首先创建一个自动检测可用节点数量的Server作业。
>>> import ppft as pp >>> job_server = pp.Server()
在创建服务器时可以通过传入一个整型参数作为第一个参数来指定节点数量(例如,Server(4) 创建了一个包含四个节点的服务器)。服务器使用 submit 来并行执行作业。 submit 接收一个函数、一个包含传递给函数的参数的元组、一个包含在函数中使用但未导入的任何函数的元组,以及一个包含用于生成函数所需的任何模块的元组。
>>> import math >>> f1 = job_server.submit(math.sin, (math.pi/2,), (), ('math',)) >>> f2 = job_server.submit(min, (3.2, 10.0, 7.5), (), ()) >>> f3 = job_server.submit(sum, ([1,2,3],), (), ())
函数通过 dill.source(与 dill 相反)序列化,通过提取并传递源代码到服务器。服务器编译并执行源代码,然后使用在元组中传递的参数调用函数。在 exec 调用源代码之前,导入任何函数和模块依赖项。通过调用来自 submit 的对象来检索结果。
>>> f1() 1.0 >>> f2() 3.2 >>> f3() 6
可以使用以下命令打印作业服务器执行统计信息
>>> job_server.print_stats() Job execution statistics: job count | % of all jobs | job time sum | time per job | job server 3 | 100.00 | 0.0051 | 0.001684 | local Time elapsed since server creation 148.48280715942383 0 active tasks, 4 cores
ppft 还可以在远程计算节点上执行作业,如果首先在节点上启动了 ppserver。在这里,ppserver 在 127.0.0.1 上启动,并将监听端口 35000。
$ ppserver -a -p 35000
然后,在本地,使用远程节点的连接信息实例化一个 Server,提交一些作业,并检索结果。
>>> job_server = pp.Server(ppservers=('127.0.0.1:35000',)) >>> f1 = job_server.submit(math.sin, (math.pi/2,), (), ('math',)) >>> f2 = job_server.submit(math.sin, (0,), (), ('math',)) >>> f3 = job_server.submit(math.sin, (-math.pi/2,), (), ('math',)) >>> f1(),f2(),f3() (1.0, 0.0, -1.0) >>>
然而,统计数据显示所有作业都在本地运行
>>> job_server.print_stats() Job execution statistics: job count | % of all jobs | job time sum | time per job | job server 3 | 100.00 | 0.0024 | 0.000812 | local Time elapsed since server creation 31.755322217941284 0 active tasks, 4 cores
这是因为我们没有指定节点数量。节点数量在 ppserver 和本地作业 Server 中都指定了。因此,上述实际上是 4 个本地节点和 4 个远程节点之间的“自动平衡”。前者自然会被优先考虑;然而,如果本地服务器被作业淹没,一些作业将被发送到远程 ppserver,这将在统计中反映出来。要运行所有作业远程,将本地节点数设置为 0。
>>> job_server = pp.Server(0, ppservers=('127.0.0.1:35000',)) >>> f1 = job_server.submit(math.sin, (math.pi/2,), (), ('math',)) >>> f2 = job_server.submit(math.sin, (0,), (), ('math',)) >>> f3 = job_server.submit(math.sin, (-math.pi/2,), (), ('math',)) >>> f1(),f2(),f3() (1.0, 0.0, -1.0) >>> job_server.print_stats() Job execution statistics: job count | % of all jobs | job time sum | time per job | job server 3 | 100.00 | 0.0016 | 0.000518 | 127.0.0.1:35000 Time elapsed since server creation 15.123202800750732 0 active tasks, 0 cores
>>>
获取 ppserver 命令行选项的帮助
$ ppserver --help Parallel Python Network Server (pp-1.7.6.9) Usage: ppserver [-hdar] [-f format] [-n proto] [-c config_path] [-i interface] [-b broadcast] [-p port] [-w nworkers] [-s secret] [-t seconds] [-k seconds] [-P pid_file] Options: -h : this help message -d : set log level to debug -f format : log format -a : enable auto-discovery service -r : restart worker process after each task completion -n proto : protocol number for pickle module -c path : path to config file -i interface : interface to listen -b broadcast : broadcast address for auto-discovery service -p port : port to listen -w nworkers : number of workers to start -s secret : secret for authentication -t seconds : timeout to exit if no connections with clients exist -k seconds : socket timeout in seconds -P pid_file : file to write PID to To print server stats send SIGUSR1 to its main process (unix only). Due to the security concerns always use a non-trivial secret key. Secret key set by -s switch will override secret key assigned by pp_secret variable in .pythonrc.py
更多信息
开始使用最简单的方法是查看 http://ppft.rtfd.io 的文档。你还可以在 ppft.tests 中看到一组示例脚本。你可以使用 python -m ppft.tests 运行测试套件。ppft 将在本地工作者(自动使用 python -u -m ppft 创建)上创建并执行作业。此外,可以使用 ppserver(或 python -m ppft.server)创建远程服务器,然后可以将作业分配给远程工作者。使用 --help 获取有关如何配置服务器的更多详细信息。请随时在 github 上提交工单,或在 stackoverflow 上提问(@Mike McKerns)。如果您想分享您如何在工作中使用 ppft,请发送电子邮件(至 mmckerns at uqfoundation dot org)。
引用
如果您使用 ppft 进行导致发表的研究,我们要求您在您的出版物中通过引用以下内容来承认 ppft 的使用。
M.M. McKerns, L. Strand, T. Sullivan, A. Fang, M.A.G. Aivazis, "Building a framework for predictive science", Proceedings of the 10th Python in Science Conference, 2011; http://arxiv.org/pdf/1202.1056 Michael McKerns and Michael Aivazis, "pathos: a framework for heterogeneous computing", 2010- ; https://uqfoundation.github.io/project/pathos
请参阅 https://uqfoundation.github.io/project/pathos 或 http://arxiv.org/pdf/1202.1056 获取更多信息。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。