You need to enable JavaScript to run this app.
导航

HPC-搭建Slurm计算集群

最近更新时间2023.12.07 17:10:25

首次发布时间2022.05.27 15:42:04

本文介绍如何在高性能计算GPU实例上搭建Slurm计算集群。

概述

什么是Slurm

Slurm(Simple Linux Utility for Resource Management)是一个开源、容错和高度可扩展的集群管理和作业调度系统,适用于大型和小型Linux集群。Slurm的运行不需要内核修改,并且相对独立。作为集群工作负载管理器,Slurm具有以下三个关键功能:

  • 在一段时间内为用户分配对资源(计算节点)的独占或非独占访问,以便资源可以执行工作。

  • 为在分配的节点集上启动、执行和监控工作(通常是并行工作)提供框架。

  • 通过管理待处理工作队列来仲裁资源争用。

架构图

架构图来源于:Slurm官方网站

  • 控制进程slurmctld :资源管理系统的中枢服务,负责资源状态维护、资源分配、作业调度、作业管理控制等。

  • 节点监控进程slurmd:运行在每个计算节点上,负责收集节点上的资源状态并向控制进程报告,slurmd接收来自控制进程与用户命令的请求,进行作业步任务加载、作业取消等操作。

  • slurmdbd:命令工具与控制进程访问数据库的中间层。它提供访问数据与关联信息的统一接口,并起到用户认证与安全隔离的作用。

  • Client commands用户命令包含 :

    • sbatch:提交单节点和多节点 slurm任务。

    • srun:运行作业。

    • scancel:终止排队中或运行中的作业。

    • sinfo:查看系统状态。

    • squeue:查看作业状态。

    • sacct:查看运行中或结束了的作业及作业簿信息等命令。

    • scontrol:作为管理工具,可以监控、修改集群的配置和状态信息等。

    • sacctmgr:用于管理数据库,可认证集群、有效用户、有效记账账户等。

前期准备

准备3台高性能GPU云服务器实例分别作为管理节点和计算节点,均需进行如下操作,假设各节点配置信息如下:

  • 操作系统:CentOS 7.8

  • 实例规格:4vCPU,16G内存,300G数据盘

  • 数据库规格:MySQL,2vCPU,4G内存,100G数据盘

  • 计算节点1:C1,192.168.0.32

  • 计算节点2:C2,192.168.0.159

  • 管理节点:M1,192.168.0.65

  1. 请分别在3个节点执行以下命令,设置主机名:

    hostnamectl set-hostname m1
    hostnamectl set-hostname c1
    hostnamectl set-hostname c2
    
  2. 删除已安装的slurm。如果您之前未安装slurm,请跳过本步骤。

    • 删除数据库。

      yum remove mariadb-server mariadb-devel -y
      
    • 移除Slurm和Munge。

      yum remove slurm munge munge-libs munge-devel -y
      
    • 删除用户和相应的文件夹。

      userdel -r slurm
      suerdel -r munge
      
  3. 关闭防火墙。

    systemctl stop firewalld
    systemctl disable firewalld
    systemctl stop iptables
    systemctl disable iptables
    
  4. 修改资源限制。

    1. 执行以下命令打开文件。

      vim /etc/security/limits.conf
      
    2. 在End of file下方添加如下内容,如下图所示。

      - nofile 655360
      - nproc 655350
      

  5. 配置时区,同步集群时钟。

    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    
  6. 安装配置NTP服务器。

    1. 安装NTP服务器。

      yum install ntp -y
      systemctl enable ntpd.service
      ntpdate pool.ntp.org
      systemctl start ntpd
      
    2. 同步NTP服务器。

      yum install ntp -y
      systemctl start ntpd
      systemctl enable ntpd
      
    3. 安装EPEL源。

      yum install http://mirrors.sohu.com/fedora-epel/epel-release-latest-7.noarch.rpm
      
  7. 在控制节点M1安装配置NFS。

    1. 安装NFS。

      yum -y install nfs-utils rpcbind
      
    2. 创建 exports 文件。

      1. 执行以下命令创建并打开文件。

        vim /etc/exports
        
      2. 添加如下内容。

        /software/ *(rw,async,insecure,no_root_squash)
        
    3. 启动NFS。

      systemctl start nfs
      systemctl start rpcbind
      systemctl enable nfs
      systemctl enable rpcbind
      
    4. 查看NFS状态。

      systemctl status nfs
      

      回显如下,表示安装成功。

  8. 编辑本地静态解析。

    1. 执行以下命令打开本地hosts文件。

      vi /etc/hosts
      
    2. 将下列内容写入到文件中,IP地址与主机名请根据实际情况替换。

      192.168.0.253  m1
      192.168.0.65   c1
      192.168.0.191  c2
      
  9. 免密认证。

    1. 生成密钥。

      ssh-keygen
      

      根据提示连续按enter键后,回显如下:

    2. 复制密钥到C1、C2计算节点。

      ssh-copy-id -i .ssh/id_rsa.pub c1
      ssh-copy-id -i .ssh/id_rsa.pub c2
      

      过程中请输入计算节点登录密码。

    3. 重新登录计算节点,确认无需输入密码,表示免密认证成功。

      ssh root@c1
      ssh root@c2
      

步骤一:安装munge

Slurm和Munge要求集群中每个节点的UID和GID一致,请登录各节点,完成munge的安装。

  1. 创建全局用户。

    export MUNGEUSER=991
    groupadd -g $MUNGEUSER munge
    useradd  -m -c "MUNGE Uid 'N' Gid Emporium" -d /var/lib/munge -u $MUNGEUSER -g munge  -s /sbin/nologin munge
    
  2. 安装Munge。

    1. 安装装epel库。

      yum install epel-release
      
    2. 安装munge。

      yum install munge munge-libs munge-devel -y
      
    3. 安装rng工具。

      yum install rng-tools -y 
      rngd -r /dev/urandom
      rngd -r /dev/urandomscp /etc/munge/munge.key root@c1:/etc/munge
      rngd -r /dev/urandomscp /etc/munge/munge.key root@c2:/etc/munge
      
    4. 在控制节点M1上新建秘钥并设置权限。

      /usr/sbin/create-munge-key -r
      dd if=/dev/urandom bs=1 count=1024 > /etc/munge/munge.key 
      chown munge: /etc/munge/munge.key 
      chmod 400 /etc/munge/munge.key
      
    5. 将生成的秘钥发送到计算节点C1和C2。

      scp /etc/munge/munge.key root@c1:/etc/munge
      scp /etc/munge/munge.key root@c2:/etc/munge
      

      输入yes后,输入计算节点密码可以看到密钥发送成功,如下图所示。

    6. 在管理节点M1和计算节点C1、C2中修改权限。

      chown -R munge: /etc/munge/ /var/log/munge/ 
      chmod 0700 /etc/munge/ /var/log/munge/
      systemctl enable munge 
      systemctl restart munge
      
  3. 检查munge状态。

    systemctl restart munge
    systemctl status munge
    
  4. 在管理节点M1上执行以下命令,验证munge是否安装成功以及管理节点与各计算节点的连通性。

    munge -n 
    munge -n | unmunge 
    munge -n | ssh c1 unmunge
    munge -n | ssh c2 unmunge
    

    回显如下,表示安装成功。

步骤二:安装slurm

请登录各节点,完成slurm的安装。

  1. 创建slurm用户。

    groupadd -g 1109 slurm
    useradd -m -c "Slurm manager" -d /var/lib/slurm -u 1109 -g slurm -s /bin/bash slurm
    
  2. 安装依赖项。

    yum install  openssl openssl-devel pam-devel numactl numactl-devel hwloc hwloc-devel lua lua-devel readline-devel rrdtool-devel ncurses-devel man2html libibmad libibumad -y
    yum install  gcc gcc-c++ readline-devel perl-ExtUtils-MakeMaker pam-devel rpm-build mysql-devel -y
    
  3. 下载安装slurm。

    1. 安装slurm。

      wget https://download.schedmd.com/slurm/slurm-20.02.7.tar.bz2
      
    2. 安装rpmbuild编译Slurm,并制作rpm包。

      yum install rpm-build
      rpmbuild -ta slurm-20.02.7.tar.bz2
      
    3. 进入rpm包目录下,安装Slurm。

      cd /root/rpmbuild/RPMS/x86_64
      yum localinstall slurm-*
      

步骤三:配置管理节点

  1. 登录管理节点M1,创建相关文件。

    mkdir /var/spool/slurmctld
    chown slurm: /var/spool/slurmctld
    chmod 755 /var/spool/slurmctld
    touch /var/log/slurmctld.log
    chown slurm: /var/log/slurmctld.log
    touch /var/log/slurm_jobacct.log /var/log/slurm_jobcomp.log
    chown slurm: /var/log/slurm_jobacct.log /var/log/slurm_jobcomp.log
    mkdir /var/spool/slurm
    chown slurm:slurm /var/spool/slurm
    chmod 755 /var/spool/slurm
    mkdir -p /var/spool/slurm/cluster_state
    chown slurm:slurm /var/spool/slurm/cluster_state
    
  2. 编辑管理节点配置文件。

    1. 打开文件。
      vi /etc/slurm/slurm.conf
      
      输入以下内容。
      #
      # Example slurm.conf file. Please run configurator.html
      # (in doc/html) to build a configuration file customized
      # for your environment.
      #
      #
      # slurm.conf file generated by configurator.html.
      #
      # See the slurm.conf man page for more information.
      #
      ClusterName=test
      ControlMachine=m1
      ControlAddr=192.168.0.65 #管理节点IP
      #BackupController=
      #BackupAddr=
      #
      SlurmUser=slurm
      #SlurmdUser=root
      SlurmctldPort=6817
      SlurmdPort=6818
      AuthType=auth/munge
      #JobCredentialPrivateKey=
      #JobCredentialPublicCertificate=
      StateSaveLocation=/var/spool/slurmctld
      SlurmdSpoolDir=/var/spool/slurm/d
      SwitchType=switch/none
      MpiDefault=none
      SlurmctldPidFile=/var/run/slurmctld.pid
      SlurmdPidFile=/var/run/slurmd.pid
      ProctrackType=proctrack/pgid
      #PluginDir=
      #FirstJobId=
      ReturnToService=0
      #MaxJobCount=
      #PlugStackConfig=
      #PropagatePrioProcess=
      #PropagateResourceLimits=
      #PropagateResourceLimitsExcept=
      #Prolog=
      #Epilog=
      #SrunProlog=
      #SrunEpilog=
      #TaskProlog=
      #TaskEpilog=
      #TaskPlugin=
      #TrackWCKey=no
      #TreeWidth=50
      #TmpFS=
      #UsePAM=
      #
      # TIMERS
      SlurmctldTimeout=300
      SlurmdTimeout=300
      InactiveLimit=0
      MinJobAge=300
      KillWait=30
      Waittime=0
      #
      # SCHEDULING
      SchedulerType=sched/backfill
      #SchedulerAuth=
      SelectType=select/cons_tres
      SelectTypeParameters=CR_Core
      #PriorityType=priority/multifactor
      #PriorityDecayHalfLife=14-0
      #PriorityUsageResetPeriod=14-0
      #PriorityWeightFairshare=100000
      #PriorityWeightAge=1000
      #PriorityWeightPartition=10000
      #PriorityWeightJobSize=1000
      #PriorityMaxAge=1-0
      #
      # LOGGING
      SlurmctldDebug=info
      SlurmctldLogFile=/var/log/slurmctld.log
      SlurmdDebug=info
      SlurmdLogFile=/var/log/slurmd.log
      JobCompType=jobcomp/none
      #JobCompLoc=
      #
      # ACCOUNTING
      JobAcctGatherType=jobacct_gather/linux
      #JobAcctGatherFrequency=30
      #
      AccountingStorageType=accounting_storage/slurmdbd
      #AccountingStorageHost=
      #AccountingStorageLoc=
      #AccountingStoragePass=
      #AccountingStorageUser=
      #
      # COMPUTE NODES
      NodeName=c[1-2] Procs=1 State=UNKNOWN
      PartitionName=debug Nodes=ALL Default=YES MaxTime=INFINITE State=UP
      
  3. 将编辑完成的配置文件发送至计算节点C1和C2。

    scp /etc/slurm/slurm.conf root@c1:/etc/slurm/
    scp /etc/slurm/slurm.conf root@c2:/etc/slurm/
    
  4. 登录火山引擎控制台配置RDS服务。

    1. 创建实例,选择5.7版本,注意RDS实例需与HPC实例属于同个地域、可用区和私有网络。


    2. 将管理节点M1的IP加入RDS实例的白名单。如下图所示,选择“数据安全”页签,单击“修改”按钮,添加M1 IP后,单击“确定”按钮。

    3. 创建名称为slurm_acct_db的数据库,用于Slurmctld通过Slurmdbd读取数据库。如下图所示,选择“数据库管理”页签,单击“创建数据库”按钮,输入数据库名称、选择字符集后,单击“确定”按钮。


  5. 配置slurmdbd.conf文件。

    1. 创建systemd文件。

      cp /usr/lib/systemd/system/slurmctld.service /usr/lib/systemd/system/slurmd.service /usr/lib/systemd/system/slurmdbd.service /etc/systemd/system/
      cat /etc/systemd/system/slurmctld.service
      
    2. 配置slurmdbd.conf文件。

      cp /etc/slurm/slurmdbd.conf.example /etc/slurm/slurmdbd.conf
      chown slurm: /etc/slurm/slurmdbd.conf
      chmod 600 /etc/slurm/slurmdbd.conf
      mkdir /var/log/slurm/
      touch /var/log/slurm/slurmdbd.log
      chown slurm: /var/log/slurm/slurmdbd.log
      vi /etc/slurm/slurmdbd.conf
      

      在slurmdbd.conf配置文件中输入以下内容。

      #
      # Example slurmdbd.conf file.
      #
      # See the slurmdbd.conf man page for more information.
      #
      # Archive info
      #ArchiveJobs=yes
      #ArchiveDir="/tmp"
      #ArchiveSteps=yes
      #ArchiveScript=
      #JobPurge=12
      #StepPurge=1
      #
      # Authentication info
      AuthType=auth/munge
      #AuthInfo=/var/run/munge/munge.socket.2
      #
      # slurmDBD info
      DbdAddr=localhost
      DbdHost=localhost
      DbdPort=6819
      SlurmUser=slurm
      #MessageTimeout=300
      DebugLevel=verbose
      #DefaultQOS=normal,standby
      LogFile=/var/log/slurm/slurmdbd.log
      PidFile=/var/run/slurmdbd.pid
      #PluginDir=/usr/lib/slurm
      #PrivateData=accounts,users,usage,jobs
      #TrackWCKey=yes
      #
      # Database info
      StorageType=accounting_storage/mysql
      StorageHost=mysql3dd7de4bfd19.rds.ivolces.com #数据库实例内网地址
      StoragePort=3306 #内网端口
      StoragePass=AihymTs4X*7z*QGp #数据库实例密码
      StorageUser=zxd-slurm #账号名称
      StorageLoc=slurm_acct_db #数据库名称
      
  6. 启动SlurmDBD服务。

    systemctl enable slurmdbd
    systemctl start slurmdbd
    systemctl status slurmdbd
    
  7. 开启slurmctl服务。

    systemctl enable slurmctld.service
    systemctl start slurmctld.service
    systemctl status slurmctld.service
    

步骤四:配置Slurm计算节点

  1. 在计算节点C1、C2分别创建/etc/slurm/文件夹。

    mkdir /var/spool/slurmd
    chown slurm: /var/spool/slurmd
    chmod 755 /var/spool/slurmd
    touch /var/log/slurmd.log
    chown slurm: /var/log/slurmd.log
    
  2. 在计算节点C1、C2分别启动slurm服务。

    mkdir /var/spool/slurm
    mkdir /var/spool/slurm/d
    systemctl start slurmd.service
    systemctl status slurmd.service
    systemctl enable slurmd.service
    

步骤五:Slurm 测试指令

  1. 显示所有Compute Nodes。

    scontrol show nodes
    

    如果Compute Nodes的State=DOWN,执行如下命令,将状态变成IDLE

    scontrol update nodename=cas01 state=resume
    
  2. 编辑测试脚本。

    vim "day 1".sh
    

    将下列内容粘贴到文件中并保存退出

    #!/bin/bash
    sleep 30
    echo "always day 1 $(hostname)"
    
  3. 在计算节点C1和C2执行如下命令。

    cat slurm-X.out
    
  4. 在管理节点M1执行测试脚本。

    sbatch "day 1".sh
    squeue
    
  5. 管理节点和测试节点回显分别如下,表示集群部署成功。


    回显如下,表示集群部署成功。

附录:Slurm基础操作命令

您可以登录Slurm官方网站查看基础操作命令。