HPC 系列文章(13):GPU调度

gres-gpu

前面介绍过了如何为作业指定资源参数,不过我们只涉及到了节点数量、CPU和内存相关的指定。而专业的集群调度系统,应该支持多种复杂的硬件资源管理调度策略,为集群内各种硬件提供统一的资源调度管理。例如目前很火热的GPU集群,就需要统一管理调度GPU资源。通用资源包括但不限于GPU、MIC、NIC等设备的管理,Slurm通过一种灵活的插件机制实现了“通用资源”的管理,你甚至可以自己开发专用的通用资源管理插件以支持特殊的设备管理。GPU是最为常见的,所以我们这里以GPU为例进行介绍。

通用资源管理配置

Slurm中通用资源被称之为GRES(Generic Resource),默认情况下Slurm是没有开启该功能的,我们需要修改一下slurm.conf配置文件,在GresTypes中指定要管理的资源类型,例如gpu。

然后你需要为节点配置具体的通用资源参数,参数格式:<name>[:<type>][:no_consume]:<number>[K|M|G]

  • name: 即通用资源的名称,与GresTypes相对应
  • type:可选的参数,你可以通过设置Type来标记不同的设备型号
  • no_consume:设置为no_consume则作业不会独占该设备
  • number[K|M|G]:数量及其单位,例如1,或者4G

多个设备资源应以逗号分隔开,示例配置:

1
2
3
# Configure support for our four GPUs
GresTypes=gpu,bandwidth
NodeName=node02 Gres=gpu:tesla:2,gpu:kepler:2,bandwidth:lustre:no_consume:4G

通用资源配置

上述文件让Slurmctld知道了系统中有哪些通用资源可以调配,不过Slurmd却还不知道具体如何使用它们,所以配置完上述信息后,我们还要为每一个具有通用资源设备的计算节点编写配置gres.conf文件,它通常和slurm.conf位于同一文件夹中,如果没有你需要手动创建该文件。该文件描述了节点上所存在的通用资源设备具体的数量、关联的设备文件以及可使用的核心等信息,具体包含了:

  • Name:即通用资源的名称,与GresTypes相对应
  • Count:资源量,默认情况下等于指定的设备文件的数量,但对于某些特殊的资源,例如共享存储空间等,你可以为其添加单位[K/M/G]
  • CPUs:允许使用的核心,不指定则默认所有核心均可用
  • File:与资源关联的设备文件的完整路径名,这对于资源限制来说至关重要,因为Slurm中需要使用cgroups进行资源限制,而cgroups则需要配置具体的设备文件。(关于slurm的资源限制原理我们后面再展开讲)
  • Type:可选的参数,你可以通过设置Type来标记不同的设备型号。

示例配置文件(包含了两个不同的型号的4张GPU卡):

1
2
3
4
5
# Configure support for our four GPUs, plus bandwidth
Name=gpu Type=tesla File=/dev/nvidia0 CPUs=0,1
Name=gpu Type=tesla File=/dev/nvidia1 CPUs=0,1
Name=gpu Type=kepler File=/dev/nvidia2 CPUs=2,3
Name=gpu Type=kepler File=/dev/nvidia3 CPUs=2,3

提交作业

配置完成之后,我们需要重启所有的slurmd及slurmctld服务,然后就可以通过作业提交时的--gres参数申请具体的通用资源了,我编写了一个脚本来验证通用资源的使用,内容如下(nvidia-smi是NVIDIA系列显卡提供的命令行显卡管理工具):

1
2
3
4
5
#!/bin/bash
date
nvidia-smi
hostname
echo "done"

用如下命令提交:

1
srun -p calulate -w node02 --gres=gpu:2 ./nv.sh

输出结果:

gres-gpu

该输出结果表明这个运行在node02上的作业得到了2张GPU卡的资源。

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