在Slurm上使用Python的多进程技术

13

我正在尝试在Slurm上运行一些并行代码,其中不同的进程不需要通信。我最初使用了Python的Slurm包。但是,似乎我只使用了一个节点上的CPU。

例如,如果我有4个节点,每个节点有5个CPU,那么我将只同时运行5个进程。如何告诉多处理模块在不同的节点上运行?

Python代码如下:

import multiprocessing

def hello():
    print("Hello World")

pool = multiprocessing.Pool() 
jobs = [] 
for j in range(len(10)):
    p = multiprocessing.Process(target = run_rel)
    jobs.append(p)
    p.start() 

这个问题类似于这一个,但那里没有详细解决。

3个回答

8

您当前的代码将在一个节点上的5个处理器上运行10次,现在与SLURM无关。

您需要将脚本提交到SLURM中,使用SBATCH命令。

如果您想在SLURM上使用5个核心运行此脚本,请按如下方式修改脚本:

#!/usr/bin/python3

#SBATCH --output=wherever_you_want_to_store_the_output.log
#SBATCH --partition=whatever_the_name_of_your_SLURM_partition_is
#SBATCH -n 5 # 5 cores

import sys
import os
import multiprocessing

# Necessary to add cwd to path when script run
# by SLURM (since it executes a copy)
sys.path.append(os.getcwd())

def hello():
    print("Hello World")

pool = multiprocessing.Pool() 
jobs = [] 
for j in range(len(10)):
    p = multiprocessing.Process(target = run_rel)
    jobs.append(p)
    p.start() 

然后使用特定命令执行该脚本:

sbatch my_python_script.py

在安装了SLURM的一个节点上:
然而,这将把你的工作分配给单个节点,因此速度与仅在一个节点上运行时完全相同。
如果你只有5个进程,我不知道为什么你想在不同的节点上运行它。只在一个节点上运行会更快。如果你在python脚本的开头分配了超过5个内核,那么SLURM会为你分配更多的节点。

谢谢你的回答。实际上,我想要并行运行大约40个进程,这就是为什么我需要使用不同的节点。我今晚稍后会尝试你的代码。 - physicsGuy
我尝试了你的方法。然而,使用上述代码时,Python仅使用单个节点,而所有其他节点都未被使用。有没有简单的解决方法? - physicsGuy
9
“-n5”并不意味着您将拥有5个核心,它只是意味着您将运行5个任务。 - CatDog

7

仅供参考: 您需要了解在SLURM中core,thread,socket,CPU,node,task,job,jobstep的含义。

如果您的脚本之间绝对没有交互,只需使用:

srun -n 20 python serial_script.py

SLURM将自动为您分配资源。

如果您想在4个节点上运行4个任务,每个任务使用5个内核。您可以使用以下命令:

srun -n 4 -c 5 -N 4 -cpu_bind verbose,nodes python parallel_5_core_script.py

它将运行4个任务(-n 4),在4个节点上(-N 4)运行。每个任务将拥有5个内核的资源(-c 5)。-cpu_bind verbose,nodes选项表示每个任务将在每个节点上运行(nodes),并将打印出实际的cpu_bind(verbose)。

然而,如果您的SLURM与我的配置不同,可能会出现一些奇怪的CPU绑定行为。有时候这很棘手。正如在您的链接中指出的那样,Python的multiprocessing模块似乎与SLURM的资源管理不兼容。


1

请注意,目前在slurm上进行长时间进程时,dask的“work stealing”功能存在缺陷(实际上可能适用于所有dask分布式),而且这种情况已经持续了一年,因此对于这些场景来说,这是一个非常不可靠的选项。 - nuKs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接