在slurm上使用python的多处理

时间:2016-10-11 10:04:56

标签: python multiprocessing slurm

我正在尝试在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() 

问题与this one类似,但尚未详细解决。

3 个答案:

答案 0 :(得分:3)

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

您必须将SBATCH脚本发送到SLURM。

如果要使用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的节点上

但是,这也会将您的作业分配给SINGLE节点,因此速度将与您在单个节点上运行它的速度完全相同。

我不知道为什么当你只有5个进程时,你想在不同的节点上运行它。在一个节点上运行会更快。如果你在python脚本的开头分配了5个以上的核心,那么SLURM将为你分配更多的节点。

答案 1 :(得分:1)

只是一个提示:  你需要了解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的资源管理不兼容,如链接中所示。

答案 2 :(得分:0)

在这些情况下,黄昏非常有用。它通过dask-jobqueue与SLURM有很好的接口。我强烈推荐它。

https://docs.dask.org/en/latest/setup/hpc.html