我有一个安装了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倍的速度运行我的项目。
由于
答案 0 :(得分:1)
经过很多麻烦scoop
是解决我问题的库。