使用python多处理的SLURM会产生不一致的结果

时间:2016-10-03 09:29:22

标签: python python-3.x multiprocessing slurm

我们有一个小型HPC,内核为4 * 64,并且安装了SLURM。

节点是:

sinfo -N -l
Mon Oct  3 08:58:12 2016
NODELIST    NODES PARTITION       STATE CPUS    S:C:T MEMORY TMP_DISK WEIGHT FEATURES REASON              
dlab-node1      1     dlab*        idle   64   2:16:2 257847        0      1   (null) none                
dlab-node2      1     dlab*        idle   64   2:16:2 257847        0      1   (null) none                
dlab-node3      1     dlab*        idle   64   2:16:2 257847        0      1   (null) none                
dlab-node4      1     dlab*        idle   64   2:16:2 257847        0      1   (null) none  

为了测试SLURM,我在python中用多处理编写了一个小脚本:

import multiprocessing
import os
def func(i):
    print(n_procs)

n_procs = int(os.environ['SLURM_JOB_CPUS_PER_NODE'].split('(')[0]) * int(os.environ['SLURM_JOB_NUM_NODES'])
p = multiprocessing.Pool(n_procs)
list(p.imap_unordered(func, [i for i in range(n_procs*2)]))

我使用以下批处理sh脚本来运行SLURM

#!/bin/bash
#
#SBATCH -p dlab                # partition (queue)
#SBATCH -N 2                      # number of nodes
#SBATCH -n 64                     # number of cores
#SBATCH --mem 250                 # memory pool for all cores
#SBATCH -t 0-2:00                 # time (D-HH:MM)
#SBATCH -o slurm.%N.%j.out        # STDOUT
#SBATCH -e slurm.%N.%j.err        # STDERR

python3 asd.py

正如我所料,这会将128 256次打印到STDOUT文件。

但是,如果我多次运行,我会获得非常不同的行数(它们都包含128,这是正确的)

第一次跑时我得到144线,第二次得到256(这是正确的),第三次得到184次。

有什么问题?我应该调查SLURM配置中的内容,还是python multiprocessing中有问题?

1 个答案:

答案 0 :(得分:2)

来自sbatch手册页:

  

SLURM_JOB_CPUS_PER_NODE

     

此节点上作业可用的处理器数量。请注意,select / linear插件会将整个节点分配给作业,因此该值指示节点上CPU的总数。 select / cons_res插件将各个处理器分配给作业,因此该数字表示分配给作业的此节点上的处理器数

如突出显示,该变量将仅返回在运行脚本的节点中分配的cpus上的数字。如果您想要进行同质分配,则应指定--ntasks-per-node=32

另外,请记住,多处理不会在多个节点中生成进程。如果您想跨越多个节点,您可以获得很好的文档here