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

时间:2016-12-01 09:58:24

标签: python python-3.x subprocess multiprocessing hpc

我有一个安装了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倍的速度运行我的项目。

由于

1 个答案:

答案 0 :(得分:1)

经过很多麻烦scoop是解决我问题的库。

相关问题