我正在尝试在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类似,但尚未详细解决。
答案 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有很好的接口。我强烈推荐它。