我正在尝试在集群上运行一些并行代码。集群使用slurm,我的代码是python。当我在自己的机器上运行代码时,它使用多个内核。然而,当我尝试在集群上运行代码时,速度非常慢,而且似乎没有使用多个核心。
以下是python的相关代码:
from multiprocessing import Pool
Nz_i=range(1,13)
p=Pool()
p.map(Err_Calc,Nz_i)
p.close()
p.join()
函数Err_Calc
是前面定义的。我认为它的定义不相关。
我用来在集群上运行代码的SBATCH
如下:
#!/bin/bash
#SBATCH -N 1
#SBATCH -p RM-shared
#SBATCH --ntasks-per-node 13
#SBATCH -t 03:10:00
module load python/intel_2.7.14
python Err_vs_Nz_Cl.py
文件Err_vs_Nz_Cl.py
包含我上面显示的代码。我希望这个SBATCH
能为我提供13个核心,但代码似乎只使用了1个核心,或者可能由于其他原因速度较慢。有人知道出了什么问题吗?
这可能是错误的(我是这方面的新手(,但如果将--ntasksper-node 13参数更改为--cpus-per-task 13,会发生什么?我认为文档中说,您需要以这种方式明确指定cpu的数量,否则它将只使用一个cpu运行。
来源:https://slurm.schedmd.com/sbatch.html
因为您在没有srun -n
的情况下运行(这对于具有基于进程的"线程"模型的multiprocessing
来说是正确的(,所以您需要另一种方法来告诉它要使用多少CPU。这是在sbatch
脚本中使用--ntasks=1
和--cpus-per-task=13
(或者无论节点有多少核心(完成的。
谨慎使用multiprocessing
。如果您没有在整个节点上运行,或者没有明确指定内核数量,它将尝试在所有可见的CPU内核上运行,无论它们是否已分配给您!