[英]Using Python multiprocessing in Slurm, and which combination of ntasks or ncpus I need
我正在尝试在slurm集群上运行python脚本,而我正在使用python的内置multiprocessing
模块。
我使用了一个非常简单的设置,为了测试目的,示例是:
len(arg_list)
Out[2]: 5
threads = multiprocessing.Pool(5)
output = threads.map(func, arg_list)
所以func
在arg_list
5个参数上并行应用了5次。 我想知道的是如何在slurm中分配正确数量的cpu / tasks以使其按预期工作。 这就是我的slurm批处理脚本的相关部分:
#!/bin/bash
# Runtime and memory
#SBATCH --time=90:00:00
#SBATCH --mem-per-cpu=2G
# For parallel jobs
#SBATCH --cpus-per-task=10
##SBATCH --nodes=2
#SBATCH --ntasks=1
##SBATCH --ntasks-per-node=4
#### Your shell commands below this line ####
srun ./script_wrapper.py 'test'
如你所见,目前我有ntasks=1
和cpus-per-task=10
。 请注意,func的主要部分包含一个scipy例程,该例程往往在两个内核上运行(即使用200%cpu使用,这就是为什么我想要10 cpus而不是5 cpu)。
这是为我的目的分配资源的正确方法,因为此时作业需要比预期更长的时间(更像是在单个线程中运行)。
我需要设置ntasks=5
吗? 因为我对在线文档的印象是, ntasks=5
会改为调用srun ./script_wrapper.py 'test'
五次,这不是我想要的。 我在这个假设中是对的吗?
另外,有没有办法轻松检查诸如CPU使用率和multiprocessing.Pool调用的python任务的所有进程id之类的东西? 目前我正在尝试使用sacct -u <user> --format=JobID,JobName,MaxRSS,Elapsed,AveCPU
,但AveCPU
和MaxRSS
字段由于某种原因(?)总是空出来,而我看到第一个脚本作为一个过程,我没有看到应该通过多处理调用的其他5个。 例:
JobID JobName MaxRSS Elapsed AveCPU
------------ ---------- ---------- ---------- ----------
16260892 GP 00:13:07
16260892.0 script_wr+ 00:13:07
您的Slurm任务分配对我来说是正确的。 Python的多处理只能在一台机器上运行,在我看来,就像你正确地在一个节点上分配10个CPU一样。 可能导致此问题的原因是多处理的Pool.map
默认在输入列表的“块”上工作,而不是一次一个元素。 它可以在任务很短时将开销降至最低。 要强制多处理一次处理列表的一个元素,请将地图的chunksize参数设置为1,例如
threads.map(func, arglist, 1)
有关更多信息,请参阅多处理文档 。
因为您说您使用的是多线程版本的SciPy,所以您可能还需要检查底层库的相关线程级别。 例如,如果您的SciPy是针对Intel Math Kernel Library构建的,请尝试设置OMP_NUM_THREADS
和MKL_NUM_THREADS
环境变量 ,以确保每个进程使用不超过2个线程并充分利用(而不是过度使用)已分配的SLURM资源。
编辑:sacct只会为您提供由srun直接启动的任何进程的运行时间,而不是任何子进程。 因此,在您的情况下,您将只使用单个srun命令中的一个进程。 要监视子进程,您可能需要查看在系统级而不是通过Slurm运行的监视工具。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.