CPU, core and threads in HPC --SBATCH setup
使用的集群会有计算结点和登录结点。以lab的集群为例
1 | [huangsisi@tc6000 ~]$ sinfo |
-N
node oriented-l
提供更多的信息:number of CPUs, memory, temporary disk (also called scratch space), node weight (an internal parameter specifying preferences in nodes for allocations when there are multiple possibilities), features of the nodes (such as processor type for instance) and the reason, if any, for which a node is down.
1 | [huangsisi@tc6000 ~]$ sinfo -Nl |
node1是计算结点(不连网),tc6000是登录结点(连网),sbatch递交作业后slurm是在计算结点进行工作调度。
sinfo信息
- CPU, core and threads
CPU的核数是指硬件上存在着几个核心,例如双核就是包括2个相对独立的CPU核心单元组。 线程数是一种逻辑的概念,是模拟出的CPU核心数。
总核数 = 物理CPU个数 $\times$ 每个物理CPU的核数 (core)
总逻辑CPU数 = 物理CPU个数 $\times$ 每个物理CPU的核数 (core) $\times$ 线程数 (thread)
- tc6000
12 logical CPUs = 1 physical CPU $\times$ 12 cores $\times$ 1 thread
- node1
144 logical CPUs = 4 physical CPUs $\times$ 18 cores $\times$ 2 threads
后续sbatch作业还需要node1的一些信息
对于memory默认单位是Mb,对于node1,206359Mb相当于201G,啊但事实上我们有2T……大概是没有显示完全。
感受下单位换算的数量级,一般来说如果看文件信息
ll
,不加-h
给的是字节(byte)数。
1 | 1byte=8bit. 1KB=1024byte. |
我们一共有3个分区,分别是sugon
,low
,download
,是人为自定义的,我们一般把作业递交到sugon
(打星号的是默认递交的分区)。
A partition is a set of compute nodes (computers dedicated to … computing,) grouped logically. Typical examples include partitions dedicated to batch processing, debugging, post processing, or visualization.
看一下运行时间限制,由于这个集群只有我们lab使用,所以是infinite,也太舒服了QVQ……
1 | $ sinfo --partition sugon |
SBATCH 参数设置
由上面的信息,我们可以更好的设置这些参数
#SBATCH --partition
工作分区,我们用sugon
#SBATCH --nodelist
可以制定在哪个节点运行任务#SBATCH --exclude
可以设置不放在某个节点跑任务,比如近期生研院集群似乎挂了的cpu08
#SBATCH --nodes
使用nodes数量,我们只有1个#SBATCH --ntasks
tasks数量,可能分配给不同node#SBATCH --ntasks-per-node
每个结点的tasks数量,由于我们只有1 node,所以ntasks
和ntasks-per-node
是相同的#SBATCH --cpus-per-task
每个task使用的core的数量(默认 1 core per task),同一个task会在同一个node#SBATCH --mem
这个作业要求的内存 (Specified in MB)#SBATCH --mem-per-cpu
每个core要求的内存 (Specified in MB)
在slurm中,一个任务(task)被理解为一个进程(process),一个多进程(multi-process)程序由多个任务组成。相反,多线程(multithreaded)程序只有一个任务,但这个任务使用多个logical CPU。
更好的理解ntasks,参考what-does-the-ntasks-or-n-tasks-does-in-slurm
The
--ntasks
parameter is useful if you have commands that you want to run in parallel within the same batch script. This may be two separate commands separated by an&
or two commands used in a bash pipe|
.
例子1
1 |
|
总共会用时22s,并有警告Job step creation temporarily disabled, retrying。但是如果#SBATCH --ntasks=1
,两个task会同时进行,总共用时12s。
例子2
1 |
|
上面这个脚本只会输出1行,但是后面使用srun
以后,会输出8行。
1 |
|
所以说如果我们是想比如说samtools
可以使用更多的线程,应该修改的是#SBATCH --cpus-per-task
,并且记得在后面修改samtools的线程参数,否则多余的线程就会被占着却不使用。
- 多线程实例
Use ${SLURM_CPUS_PER_TASK}
variable to pass the number of cores in the job to commands that accept an argument for number of core, cpus or threads.
For job arrays, the default file name is “slurm-%A_%a.out”, “%A” is replaced by the job ID and “%a” with the array index. For other jobs, the default file name is “slurm-%j.out”, where the “%j” is replaced by the job ID.
1 |
|
基于Ubuntu系统的查看信息方式
- cpu全部信息
1 | less -SN /proc/cpuinfo |
- 查看物理CPU个数
1 | [huangsisi@tc6000 ~]$ grep "physical id" /proc/cpuinfo| sort -u| wc -l |
- 查看每个物理CPU中core的个数
1 | [huangsisi@tc6000 ~]$ grep "cpu cores" /proc/cpuinfo| uniq |
或者
1 | [huangsisi@tc6000 ~]$ grep 'core id' /proc/cpuinfo| sort -u| wc -l |
- 查看逻辑CPU的个数
1 | [huangsisi@tc6000 ~]$ grep "processor" /proc/cpuinfo| wc -l |
?怎么不太一致,看起来是
48 logical CPUs = 2 physical CPUs $\times$ 12 cores $\times$ 2 threads
我愿意相信这个信息比sinfo更准……好惊喜呀!
下面到计算结点看看情况
1 | # 登录计算结点 |
node1和之前sinfo
得到的信息一致。