如何在HPC群集上使用python上的所有已分配节点
问题描述:
我有安装了SLURM的HPC群集。我可以为自己正确分配节点和内核。我希望能够使用所有分配的内核,而不管它们在哪个节点。正如我在此线程中看到的,Using the multiprocessing module for cluster computing这不能通过multiprocessing
来实现。如何在HPC群集上使用python上的所有已分配节点
我的剧本是这样的(简单化版本):
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
协议,但是ust执行相同的脚本N次,我需要使用并行进程的输出进行额外的计算。我当然可以将输出存储在某个地方,然后让它恢复原状,但必须有一些更优雅的解决方案。
在提到的线程中有像jug
这样的建议,但是当我正在阅读它时,我没有找到适合自己的解决方案。
也许py4mpi
可以解决我的问题吗?这个教程看起来非常混乱,我也没有找到针对我的问题的具体解决方案。 (与mpi并行运行一个函数,然后继续脚本)。
我试过subprocess
调用,但是看起来像调用multiprocess
一样工作,所以它们只能在一个节点上运行。我还没有找到任何确认,所以这只是从我的反复猜测。
我该如何克服这个问题?目前我可以使用300多个内核,但一个节点只有32个,所以如果我能找到解决方案,那么我将能够以近10倍的速度运行我的项目。
感谢
答
了不少麻烦scoop
之后是解决我的问题库。
节点之间的通信通常是mpi,但是我不知道一个库将它封装在api中,就像多处理器 –