ジョブ管理システム Slurm のインストールと設定

管理ノードの設定

認証基盤の MUNGE をインストール

$ sudo apt update
$ sudo apt install munge

管理ノードのインストール

$ sudo apt install slurmctld

設定ファイルのコピー

# cd /etc/slurm
# cp /usr/share/doc/slurmctld/examples/slurm.conf.simple  slurm.conf

設定ファイルの編集

# vi slurm.conf

  # デフォルトのまま
  ClusterName=cluster
  ReturnToService=2
  SlurmctldPidFile=/run/slurmctld.pid
  SlurmdPidFile=/run/slurmd.pid
  SlurmdSpoolDir=/var/lib/slurm/slurmd
  StateSaveLocation=/var/lib/slurm/slurmctld
  SlurmUser=slurm
  SchedulerType=sched/backfill
  SelectType=select/cons_tres
  SelectTypeParameters=CR_Core_Memory
  AccountingStorageType=accounting_storage/none
  JobCompType=jobcomp/none
  JobAcctGatherType=jobacct_gather/none
  SlurmctldDebug=info
  SlurmctldLogFile=/var/log/slurm/slurmctld.log
  SlurmdDebug=info
  SlurmdLogFile=/var/log/slurm/slurmd.log

  #管理ノードの設定
  SlurmctldHost=ncfs1(10.0.100.31)

  #cgroup v2 による計算資源の制限
  ProctrackType=proctrack/cgroup
  TaskPlugin=task/cgroup

  # GPU 利用
  GresTypes=gpu

  # メモリ制限.1 CPU 当たり 4 GB
  DefMemPerCPU=4096

  # ジョブがサブミットされた時に job_submit.lua を介してユーザの要求を制限
  JobSubmitPlugins=lua

  # ジョブ開始時に計算ノード上で PAM セッションを開く = Rootless Podman に必要
  LaunchParameters=use_pam
  UsePAM=1

  # 計算ノードの設定.Weight が小さい方が優先的に使われる
  NodeName=ncsv5 NodeAddr=10.0.0.25   CPUs=64  RealMemory=512000 Gres=gpu:2 Weight=10
  NodeName=ncsv3 NodeAddr=10.0.100.23 CPUs=32  RealMemory=254000 Gres=gpu:4 Weight=20
  NodeName=ncsv2 NodeAddr=10.0.100.22 CPUs=32  RealMemory=254000 Gres=gpu:3 Weight=30
  NodeName=ncsv1 NodeAddr=10.0.100.21 CPUs=256 RealMemory=720000 Gres=gpu:2 Weight=100

  # キューの設定
  PartitionName=debug Nodes=ncsv5             Default=YES MaxNodes=1 MaxTime=01:00:00 MaxCPUsPerNode=4 State=UP
  PartitionName=short Nodes=ncsv5,ncsv3,ncsv2 Default=NO  MaxNodes=1 MaxTime=01:00:00 State=UP
  PartitionName=long  Nodes=ncsv1             Default=NO  MaxNodes=1 MaxTime=72:00:00 State=UP
  PartitionName=v100  Nodes=ncsv3,ncsv1       Default=NO  MaxNodes=1 MaxTime=72:00:00 State=UP
  PartitionName=a100  Nodes=ncsv2             Default=NO  MaxNodes=1 MaxTime=72:00:00 State=UP
  PartitionName=a40   Nodes=ncsv5             Default=NO  MaxNodes=1 MaxTime=72:00:00 State=UP

Podman と Slurm の連携を考え,Slurm は /dev/nvidiaX というデバイスファイルへのアクセス権限を cgroup レベルで制限する.

# cat /etc/slurm/cgroup.conf

  CgroupMountpoint=/sys/fs/cgroup
  ConstrainCores=yes
  ConstrainDevices=yes
  ConstrainRAMSpace=yes

1 ユーザ当たり GPU 1 枚のみに限定する.

# vi /etc/slurm/job_submit.lua

  function slurm_job_submit(job_desc, part_list, submit_uid)
     -- ジョブが要求しているGRES(GPUなど)を確認
     if job_desc.gres then
        -- "gpu:2" や "gpu:4" といった記述が含まれているかチェック
        -- 数値が 1 より大きい場合にエラーを返す
        for gres_req in string.gmatch(job_desc.gres, "gpu:(%d+)") do
            if tonumber(gres_req) > 1 then
                slurm.log_info("Job rejected: GPU request (%s) exceeds limit of 1 per job for UID %u", gres_req, submit_uid)
                 -- ユーザーにエラーメッセージを返して拒否
                 return slurm.ESLURM_INVALID_GRES
            end
        end
     end
     return slurm.SUCCESS
  end

  function slurm_job_modify(job_desc, job_ptr, part_list, modify_uid)
      return slurm.SUCCESS

/etc/hosts にノードが全て書かれていることを確認する.

# vi /etc/hosts

  127.0.0.1       localhost
  10.0.100.31     ncfs1.matsue-ct.ac.jp   ncfs1
  10.0.100.21     ncsv1.matsue-ct.ac.jp   ncsv1
  10.0.100.22     ncsv2.matsue-ct.ac.jp   ncsv2
  10.0.100.23     ncsv3.matsue-ct.ac.jp   ncsv3
  10.0.100.24     ncsv4.matsue-ct.ac.jp   ncsv4
  10.0.0.25       ncsv5.matsue-ct.ac.jp   ncsv5
  ...(以下略)...

設定を有効にする

# systemctl restart slurmctld

計算ノードの設定

管理ノードと同様にソフトウェアをインストールし,

認証基盤の MUNGE をインストール

$ sudo apt update
$ sudo apt install munge

管理ノードのインストール

$ sudo apt install slurm-client slurmd
$ sudo apt install libpam-slurm-adopt libpam-systemd

設定ファイル (slurm.conf, cgroup.conf, job_submit.lua) は管理ノードのそれをコピーしてくる.

また,munge のファイル /etc/munge/munge.key も管理ノードから計算ノードにコピーする必要がある. そうしないと同期が取れない.書き換えた後に再起動が必要

# systemctl restart munge

追加の設定ファイルとして, 計算ノードの GPU を管理ノードに教えるために gres.conf を作成する.以下は GPU 4 基の場合である.

# vi /etc/slurm/gres.conf

   Name=gpu File=/dev/nvidia0
   Name=gpu File=/dev/nvidia1
   Name=gpu File=/dev/nvidia2
   Name=gpu File=/dev/nvidia3

設定を有効にする

# systemctl restart slurmd

ユーザ設定

管理ノードと計算ノードのユーザは揃っている必要がある. podman と連携させるためには,/etc/passwd, /etc/group, /etc/shadow だけでなく, /etc/subuid, /etc/subgid も同じにしておく必要がある.

また,管理ノードの /etc/profile.d/ 以下に環境変数を設定しておく. slurm では管理ノードの環境変数が計算ノードに引き継がれるため.

# vi /etc/profile.d/podman_strage.sh

 export CONTAINERS_STORAGE_CONF=/etc/containers/storage.conf

# vi /etc/profile.d/tensorflow.sh

  export XLA_FLAGS=--xla_gpu_cuda_data_dir=/usr/lib/cuda