我们有一个小型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
中有问题?
答案 0 :(得分:2)
来自sbatch手册页:
SLURM_JOB_CPUS_PER_NODE
此节点上作业可用的处理器数量。请注意,select / linear插件会将整个节点分配给作业,因此该值指示节点上CPU的总数。 select / cons_res插件将各个处理器分配给作业,因此该数字表示分配给作业的此节点上的处理器数
如突出显示,该变量将仅返回在运行脚本的节点中分配的cpus上的数字。如果您想要进行同质分配,则应指定--ntasks-per-node=32
另外,请记住,多处理不会在多个节点中生成进程。如果您想跨越多个节点,您可以获得很好的文档here