【问题标题】:Python hybrid multiprocessing / MPI with shared memory in the same nodePython 混合多处理/MPI 与同一节点中的共享内存
【发布时间】:2017-09-12 15:27:16
【问题描述】:

我有一个 Python 应用程序需要加载相同的大型 数组(~4 GB)并在 这个数组的块。数组开始保存到磁盘。

我通常在集群计算机上运行此应用程序 例如,10 个节点,每个节点有 8 个 计算核心和大约 32GB 的总 RAM。

最简单的方法(不起作用)是 n = 80 mpi4py。它不起作用的原因是 每个 MPI 核心将加载 4GB 映射,这将耗尽 32GB 的 RAM 导致 MemoryError

另一种选择是 rank=0 是唯一加载的进程 4GB 阵列,并将阵列的块分配给其余部分 的 MPI 内核——但由于网络原因,这种方法很慢 带宽问题。

最好的方法是,每个节点中只加载 1 个核心 4GB 阵列,该阵列可用作共享内存 (通过multiprocessing?)每个上剩余的 7 个内核 节点。

我怎样才能做到这一点?如何让 MPI 知道节点 并使其与multiprocessing协调?

【问题讨论】:

    标签: python multiprocessing mpi4py


    【解决方案1】:

    MPI-3 有一个共享内存设施,正好适合您的场景。您可以通过 mpi4py 使用 MPI .... 使用MPI_Comm_split_type 将您的通信器分成位于节点上的组。使用MPI_Win_allocate_shared作为节点上的窗口;仅在一个等级上指定非零大小。使用MPI_Win_shared_query 获取指向该窗口的指针。

    【讨论】:

      【解决方案2】:

      编辑 16/06/2020:python3.8 开始,multiprocessinghttps://docs.python.org/3/library/multiprocessing.shared_memory.html 现在支持共享内存,可用于拥有此类每个节点版本的数据.


      multiprocessing 模块没有共享内存。

      您可以查看joblib 使用内存视图共享大型 numpy 数组的方式。您可以使用manual memory mapping 来避免重复数据。

      为了找到一种只在每个节点上传递一次数据的方法,我会为每个节点启动一个 MPI 进程,然后使用 joblib 进行剩余的计算,因为它自动使用 memmaping 进行大型 numpy 数组输入。

      【讨论】:

      • 虽然我还没有尝试过,但这已经指向我:docs.python.org/2/library/… 作为与multiprocessing 共享内存的一种方式
      • 这有效地模拟了共享内存,但它比内存映射慢,因为它依赖于具有代理功能的同步过程来读取和正确读取它(这不是通信效率)。此外,如果您需要线性代数,您将无法使用高效的 numpy 计算。
      • multiprocessing 确实有共享内存。显然,您将其与 multiprocessing.Manager 混合在一起,后者使用代理在单独的服务器进程中修改对象。 Managermultiprocessing.Arraymultiprocessing.Value 无关,它们只使用 real 共享内存,并且在后台没有额外的管理器进程。
      • 确实,共享内存是在 2019 年 10 月的 3.8 版中添加的。我将编辑我的答案以指向这一点。
      猜你喜欢
      • 1970-01-01
      • 2015-03-15
      • 2012-07-05
      • 2013-08-19
      • 2012-12-16
      • 2019-11-06
      • 2019-05-10
      • 2014-01-06
      相关资源
      最近更新 更多