phy*_*Guy 5 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()
Run Code Online (Sandbox Code Playgroud)
该问题与这一问题相似,但尚未得到详细解决。
只是提示:您需要了解core,thread,socket,CPU,node,task,job,jobstepSLURM 中的内容。
如果你的脚本之间绝对没有交互。只需使用:
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 的资源管理配合使用,如您的链接所示。
您当前的代码将在您启动它的SINGLE节点上的5个处理器上运行10次。现在与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()
Run Code Online (Sandbox Code Playgroud)
然后用执行脚本
sbatch my_python_script.py
Run Code Online (Sandbox Code Playgroud)
在安装了SLURM的节点之一上
但是,这也会将您的作业分配到一个SINGLE节点,因此速度将与您仅在单个节点上运行它的速度相同。
我不知道当您只有5个进程时为什么还要在不同的节点上运行它。仅在一个节点上运行会更快。如果您在python脚本的开头分配了5个以上的内核,那么SLURM将为您分配更多的节点。