ジョブ管理システム 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