如何在 HPC 集群上使用 python 的所有已分配节点

How to use all allocated nodes with python on a HPC cluster

我有一个安装了 SLURM 的 HPC 集群。我可以为自己适当地分配节点和核心。我希望能够使用所有已分配的核心,而不管它们位于哪个节点。正如我在此线程中看到的那样 Using the multiprocessing module for cluster computing 这无法通过 multiprocessing 实现。

我的脚本看起来像这样(过于简化的版本):

def func(input_data):
    #lots of computing
    return data

parallel_pool = multiprocessing.Pool(processes=300)
returned_data_list = []
for i in parallel_pool.imap_unordered(func, lots_of_input_data)
    returned_data_list.append(i)
# Do additional computing with the returned_data
....

这个脚本工作得很好,但是正如我提到的,多处理对我来说不是一个好工具,因为即使 SLURM 为我分配了 3 个节点,多处理也只能使用一个。据我了解,这是多处理的局限性。

我可以使用 SLURM 的 srun 协议,但是它只会执行同一个脚本 N 次,我需要对并行进程的输出进行额外的计算。我当然可以将输出存储在某个地方,然后将它们重新写入,但必须有一些更优雅的解决方案。

在提到的线程中有类似 jug 的建议,但是当我通读它时,我还没有找到适合自己的解决方案。

也许 py4mpi 可以解决我的问题?教程看起来很乱,而且我也没有在其中找到针对我的问题的具体解决方案。 (运行一个函数与mpi并行,然后继续脚本)。

我尝试了 subprocess 调用,但它们的工作方式似乎与 multiprocess 调用相同,因此它们仅在一个节点上 运行。我还没有找到任何证据,所以这只是我反复试验的猜测。

我该如何克服这个问题?目前我可以使用 300 多个内核,但一个节点只有 32 个,所以如果我能找到解决方案,那么我的项目将 运行 快近 10 倍。

谢谢

经过很多麻烦后 scoop 图书馆解决了我的问题。