跳转到主要内容

在Jupyter笔记本或串行Python进程中,将串行和MPI-并行Python函数扩展到数百个计算节点。

项目描述

executorlib

Unittests Coverage Status Binder

挑战

在高性能计算(HPC)中,Python编程语言通常用作高级语言来编排科学应用的耦合。然而,在以下三个方面,高效使用高度并行的HPC集群仍然具有挑战性:

  • 通信:在数百个计算节点上分配Python函数调用并在共享文件系统上收集结果在技术上可行,但效率低下。基于套接字的通信方法更可取。
  • 资源管理:将Python函数分配给GPU或使用消息传递接口(MPI)在多个CPU上执行Python函数需要对Python工作流程进行重大修改。
  • 集成:现有的工作流库在Python级别上实现了次级的工作管理,而不是利用HPC作业调度器提供的基础设施。

executorlib是...

在给定的HPC分配中,executorlib库通过扩展标准Python库的Executor接口来支持HPC环境中的资源分配。计算资源可以按每个函数调用分配,也可以按每个Executor的块分配。在flux-framework的基础上构建的executorlib库可以启用细粒度的资源分配。此外,Simple Linux Utility for Resource Management (SLURM)作为备选排队系统,对于工作站安装,可以在没有作业调度器的情况下安装executorlib

executorlib不是...

executorlib库不是设计用来从HPC作业调度器请求分配的。而是在给定作业调度器的分配中,可以使用executorlib库将一系列Python函数调用分配到可用的计算资源中,以达到最大化的计算资源利用率。

示例

以下示例说明了如何使用executorlib在排队系统分配中分配一系列MPI并行函数调用。example.py

import flux.job
from executorlib import Executor

def calc(i):
    from mpi4py import MPI
    size = MPI.COMM_WORLD.Get_size()
    rank = MPI.COMM_WORLD.Get_rank()
    return i, size, rank

with flux.job.FluxExecutor() as flux_exe:
    with Executor(max_cores=2, cores_per_worker=2, executor=flux_exe) as exe:
        fs = exe.submit(calc, 3)
        print(fs.result())

可以使用以下方法执行此示例

python example.py

返回

>>> [(0, 2, 0), (0, 2, 1)], [(1, 2, 0), (1, 2, 1)]

在此示例中,重要的是mpi4py仅在calc()函数中使用,而不在Python脚本中使用,因此不需要使用mpiexec调用脚本,而是可以使用常规Python解释器调用。这突出了executorlib如何允许用户一次并行化一个函数,而无需将整个工作流转换为使用mpi4py。相同的代码也可以直接在jupyter笔记本中执行,从而实现交互式开发过程。

通过添加选项cores_per_worker=2来扩展标准concurrent.futures.Executor接口,将多个MPI rank分配给每个函数调用。要创建两个工作者,最大核心数可以增加到max_cores=4。在这种情况下,每个工作者接收两个核心,从而总共利用四个CPU核心。

在将函数calc()及其相应参数提交给执行器exe.submit(calc, 0)后,将返回一个Python concurrent.futures.Future。因此,executorlib.Executor可以作为concurrent.futures.Executor的替代品,允许用户一次将并行性添加到一个函数中。

免责声明

尽管我们试图开发一个稳定可靠的软件库,但该开发仍然是一个无担保的开源项目,受BSD 3-Clause许可证约束:

BSD 3-Clause License

Copyright (c) 2022, Jan Janssen
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

* Neither the name of the copyright holder nor the names of its
  contributors may be used to endorse or promote products derived from
  this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

文档

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

pympipool-0.9.1.tar.gz (4.8 kB 查看哈希值)

上传时间 源代码

构建分发

pympipool-0.9.1-py3-none-any.whl (4.5 kB 查看哈希值)

上传时间 Python 3