HPC 系列文章(8):第一个Slurm作业

concept

我们已经搭建好了一个简单的Slurm环境,包含两个计算节点和一个管理节点。接下来我们将尝试往作业系统中提交作业。在这之前我们已经在HPC 系列文章(4):Slurm概览中介绍了包括节点、分区、作业等一些基本概念,在提交作业之前,我们进一步的学习一下这几个概念。

介绍节点和分区的概念,我们先从配置文件中简单了解一下它们,这里我以一个自己编辑的范例配置来介绍,我们先只看节点和分区的部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#
# Sample /etc/slurm.conf
################################################
# SCHEDULING & ALLOCATION #
################################################
FastSchedule=2
#
################################################
# Nodes Configurations #
################################################
NodeName=master Sockets=2 CoresPerSocket=8 ThreadsPerCore=1 Gres=gpu:tesla:no_consume:2 RealMemory=65535 TmpDisk=100000 Weight=6 Feature=video
NodeName=node01 CPUs=8 RealMemory=4096 TmpDisk=14190
#
################################################
# Partition Configurations #
################################################
PartitionName=node-all Nodes=master,node01 State=UP Default=YES MaxTime=60
PartitionName=master-only MaxTime=UNLIMITED Nodes=master State=UP

节点

先说节点,对于Slurm系统而言,每一台安装并正确配置了slurmd进程的服务器就是一个节点。安装了slurmctld的节点虽然我们称之为主控节点,但实际上它并不是我们这里讨论的节点,这里指的节点即计算资源。为了使节点的概念更符合我们的直觉,我们可以认为每个计算节点就是一台服务器。

节点配置

回到配置文件中,我们先看master的配置:

1
NodeName=master Sockets=2 CoresPerSocket=8 ThreadsPerCore=1 RealMemory=65535 TmpDisk=100000 Weight=6 Gres=gpu:tesla:no_consume:2 Feature=video

每一项简单介绍一下:

  • NodeName=master 即节点名为master
  • Sockets=2 CPU插槽两个
  • CoresPerSocket=8 每个插槽上CPU的核心数量,这里即8核处理器
  • ThreadsPerCore=1 单个物理核心中的逻辑线程数

CPU数量计算公式:CPUs = Sockets*CoresPerSocket*ThreadsPerCore,上面master包含16个逻辑CPU,也可以直接通过CPUs来设定逻辑CPU数量,上面node01就直接采用了CPUs配置项。

  • RealMemory=65535 节点上实内存的大小,以兆字节为单位,即该节点内存为64G
  • TmpDisk=100000 临时磁盘存储的总大小,以兆字节为单位,该节点有100G临时存储空间
  • Weight=6 节点权重为6,在所有条件相同的情况下,作业将被分配到满足其要求的最低权重的节点。
  • Gres=gpu:tesla:no_consume:2 GRES是Slurm中的通用资源配置项,属于比较高级的配置项,这个留到后面再仔细介绍,这里只需要知道根据配置文件显示该节点配备了两块Tesla的GPU
  • Feature=video 以逗号分隔的任意字符串列表,表示与节点相关的某些特征。简单的说就是给节点打的tag。

关于节点的配置项其实还有很多,更多内容可以参考slurm.conf,这里我们先就介绍这些。

为什么要配置这些东西呢?原因很简单,调度系统的核心功能说白了就是帮你把作业分配到最合适的节点上运行。什么是合适的节点呢?能满足你作业需求并且符合当前分配策略的最优解就是合适的节点。你为节点和作业配置的参数越详尽,越能精细化分配条件。

配置我可以瞎写吗?

答案是可以,我在配置文件中设置了FastSchedule=2,该设置项一共有三个有效值(0,1,2),0则会严格检查节点的实际配置,1会使用配置文件中的值作为配置但会将实际低于配置值的节点自动设置为DRAIN状态(表示资源耗尽,该状态的节点不会接受任何作业),而2则完全不校验实际配置,你想怎么配置就怎么配置,这可以方便我们超配,也方便测试学习。

分区

分区将一组节点组合成逻辑上的一个集合,也有人称之为“队列”,实际上节点间并没有队列的概念,所以我认为“分区”是一个更合适的翻译。

分区配置

回到配置文件中,我配置了两个队列,分别是node-all包含了master和node01节点,master-only则只包含master节点:

1
2
PartitionName=node-all Nodes=master,node01 State=UP Default=YES MaxTime=60
PartitionName=master-only MaxTime=UNLIMITED Nodes=master State=UP

以node-all为例简单介绍一下各个配置项:

  • PartitionName=node-all 分区名
  • Nodes=master,node01 包含的节点,可以用逗号分隔开,也可以使用类似node[01-05]这样的批量配置。
  • State=UP 队列的状态
  • Default=YES 是否为默认分区,如果没有给作业指明分区,则会分配到默认分区中。
  • MaxTime=60 作业的最大运行时间限制。支持多种格式,默认为分钟。这里表示该队列中运行的作业最多可以运行60分钟。

关于分区的配置项更多内容可以参考slurm.conf,后面我们也会更深入的去讲解一些高级的配置。

作业提交

特定时间为用户进行的一次资源申请或分配即可看作一个作业。这和我们惯性思维中的作业概念并不一致,传统意义上我们总是认为作业应该是某个运行的脚本或者程序,但事实上Slurm的作业只代表一次资源申请或分配。理解这个区别将有利于你理解Slurm中一些比较高级的用法。

Slurm中有多种作业提交方式,分别是sbatch、srun和salloc,关于它们的区别和用法我们留到后面仔细讲解,这里我们就以sbatch为例提交作业。你需要将你要运行的内容编辑成脚本,然后由sbatch命令指定参数和该脚本。我们先编辑一个最简单的bash脚本命名为test.sh

1
2
3
4
5
6
7
#!/bin/bash

echo "Hello world"
date
hostname
sleep 60
echo "Bye"

该脚本会依次输出”Hello world”、当前时间、节点名,休眠60秒后会输出Bye,我们试着提交它:

sbatch -p master-only test.sh

一切正常的话,你将得到一个slurm-1.out文件,其中包含了上述输出。你已经成功的提交了一个脚本并且slurm将其分配到了master节点上运行。不过似乎没有体现出调度系统的优势?下一节我们将继续探讨作业提交。

坚持原创技术分享,您的支持将鼓励我继续创作!