SLURMでのGPUリソース管理調査
| 登録日 | :2025/05/24 15:32 |
|---|---|
| カテゴリ | :SLURM |
SLURMでGPUリソース管理をする方法の調査
まず、GresTypes=gpu について
GresTypes=gpu をslurm.confに記述しても、CPUリソースの管理は引き続き可能です。
解説:
- GresTypesは、GPUなどの「汎用リソース(Generic Resource)」の種類をSLURMに認識させるための設定です。
- CPUやメモリなどの「標準リソース」の管理は、GresTypesの有無に関係なく、従来通りSLURMが自動的に管理します。
つまり、GresTypes=gpuを追加しても、CPUやメモリの割り当て・管理機能には影響しません。
補足:
- GPUリソース管理を有効化したい場合のみGresTypes=gpuを指定しますが、CPUだけのノードも混在して問題ありません。パーティションやノードごとにCPU/GPUの有無を柔軟に設定できます。
まとめ:
GresTypes=gpuを設定しても、SLURMはCPUリソースの管理も従来通り行いますので、両者を同時に管理できます。
コンフィグファイルの設定
slurm.confの修正箇所(CPUリソースあり)
GresTypes=gpu
# COMPUTE NODES
NodeName=headnode CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=770 State=UNKNOWN
NodeName=compute01 CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=770 State=UNKNOWN
NodeName=compute02 CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=1778 State=UNKNOWN
NodeName=node[1-2] CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=770 State=UNKNOWN
NodeName=gpu01 CPUs=4 Boards=1 SocketsPerBoard=1 CoresPerSocket=4 ThreadsPerCore=1 RealMemory=32000 Gres=gpu:2 State=UNKNOWN
# PARTITION
PartitionName=debug Nodes=headnode Default=NO MaxTime=30:00 State=UP
PartitionName=part1 Nodes=compute0[1-2] Default=NO MaxTime=30:00 State=UP
PartitionName=part2 Nodes=node[1-2] Default=NO MaxTime=30:00 State=UP
PartitionName=gpu Nodes=gpu01 Default=NO MaxTime=30:00 State=UP
SLURMでGPUの設定をするにあたり、cgroupの設定が必要になりますか?
SLURMでGPUリソース管理を正しく行うためにはcgroupの設定が重要です。
理由と背景
SLURMでGPUを割り当てる際は、--gres=gpu:<数>オプションを使いますが、cgroupを有効にしている場合のみ、ジョブごとに割り当てたGPUデバイスだけが見えるように制限されます。
cgroupが無効だと、全てのジョブから全GPUが見えてしまい、リソースの競合や誤使用が発生する可能性があります。
必要な設定
cgroupの有効化
SLURMのslurm.confでTaskPlugin=task/cgroupを設定します。
gres.confの設定
各ノードの/etc/slurm/gres.confにGPUリソースの情報を記載します(例:Name=gpu File=/dev/nvidia0など)。
slurm.confでGRES指定
NodeName=... Gres=gpu:2のように、各ノードのGPU数を指定します。
まとめ
cgroupの設定は、SLURMでGPUリソースを安全・確実に割り当てるために必須です。
cgroupが有効だと、割り当てられたジョブからのみ指定GPUが見えるようになります。
参考コマンド例:
bash
srun --gres=gpu:1 nvidia-smi
このときcgroupが有効なら、そのジョブからは割り当てたGPUしか見えません。
結論:
SLURMでGPU管理を行う場合、cgroupの設定は必須です。
設定手順
CPUマシンとGPUマシンが混在したクラスタにおける、cgroupを考慮したSlurm設定手順
1. 前提準備
全ノードにmunge、slurm、必要に応じてNVIDIAドライバとCUDA(GPUノードのみ)をインストール
ノード間で/etc/hostsやSSH設定など通信ができるようにする
- cgroupの有効化
全ノードに/etc/slurm/cgroup.confを配置します。
例:
CgroupAutomount=yes
ConstrainCores=yes
ConstrainRAMSpace=yes
ConstrainDevices=yes
slurm.confでcgroupを使う設定にします。
例:
ProctrackType=proctrack/cgroup
TaskPlugin=task/cgroup
- slurm.confの設定
ファイル冒頭付近でGRESタイプを指定
GresTypes=gpu
各ノードのリソースを正確に記述
CPUノード例
NodeName=cpu01 CPUs=8 RealMemory=32000 State=UNKNOWN
GPUノード例(GPUが2基の場合)
NodeName=gpu01 CPUs=16 RealMemory=64000 Gres=gpu:2 State=UNKNOWN
パーティション設定例
PartitionName=cpu Nodes=cpu01 Default=NO MaxTime=INFINITE State=UP
PartitionName=gpu Nodes=gpu01 Default=NO MaxTime=INFINITE State=UP
- GPUノードのgres.conf
GPUノードには /etc/slurm/gres.conf を作成
Name=gpu File=/dev/nvidia0
Name=gpu File=/dev/nvidia1
NVMLがインストール済みなら AutoDetect=nvml だけでも可。
- サービスの起動
cgroup.confは全ノードに配布必須
gres.confは、GPUノードなどGRESを管理するノードに配布必須(全ノードに配布しても問題なし)
全ノードでmunge、slurmdを起動
管理ノードでslurmctldも起動
- 動作確認
scontrol show node でリソース認識を確認
ジョブ投入例(GPUノードに2GPU割り当て)
srun --partition=gpu --gres=gpu:2 nvidia-smi
ポイント
cgroupを有効化することで、CPU・メモリ・GPUなどのリソース割り当てと制限が厳密に管理されます。
CPUノードにはGRES設定は不要、GPUノードのみGres=gpu:<数>とgres.confを用意します。
ジョブ投入時は--partitionや--gresオプションでリソース指定します
cgroupで不具合がありそうです。
RockyLinux9.4では、cgroup2となっており、SLURMのバージョンアップをしないと、GPUにジョブ投入ができないようです。(cgroupのマウント不具合)
[2025-05-25T13:22:20.082] task/affinity: task_p_slurmd_batch_request: task_p_slurmd_batch_request: 114
[2025-05-25T13:22:20.083] task/affinity: batch_bind: job 114 CPU input mask for node: 0x1
[2025-05-25T13:22:20.083] task/affinity: batch_bind: job 114 CPU final HW mask for node: 0x1
[2025-05-25T13:22:20.086] Launching batch job 114 for UID 0
[2025-05-25T13:22:20.103] [114.batch] error: unable to mount memory cgroup namespace: Device or resource busy
[2025-05-25T13:22:20.103] [114.batch] error: unable to create memory cgroup namespace
[2025-05-25T13:22:20.103] [114.batch] error: Couldn't load specified plugin name for jobacct_gather/cgroup: Plugin init() callback failed
[2025-05-25T13:22:20.103] [114.batch] error: cannot create jobacct_gather context for jobacct_gather/cgroup
[2025-05-25T13:22:20.106] [114.batch] error: unable to mount memory cgroup namespace: Device or resource busy
[2025-05-25T13:22:20.106] [114.batch] error: unable to create memory cgroup namespace
[2025-05-25T13:22:20.106] [114.batch] error: Couldn't load specified plugin name for jobacct_gather/cgroup: Plugin init() callback failed
[2025-05-25T13:22:20.106] [114.batch] error: cannot create jobacct_gather context for jobacct_gather/cgroup
[2025-05-25T13:22:20.106] [114.batch] error: job_manager: exiting abnormally: Plugin initialization failed
[2025-05-25T13:22:20.106] [114.batch] sending REQUEST_COMPLETE_BATCH_SCRIPT, error:1011 status:0
[2025-05-25T13:22:20.113] [114.batch] done with job
[root@rx9gpu01 log]#
[root@rx9gpu01 log]# mount | grep cgroup
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,seclabel,nsdelegate,memory_recursiveprot)
対策
Ubuntu 22.04ではデフォルトでcgroup v2が有効です。SLURM 21.08.2ではcgroup v2への完全対応が不十分なため、以下のいずれかを選択してください:
SLURM 23.02以上にバージョンアップ
カーネルパラメータでcgroup v1を強制
この手順でエラーが解消され、GPUリソースを伴うジョブが正常に実行できるようになります。
根本原因と解決策
原因 解決策
cgroup v2のみ有効 SLURM 23.02以上にアップグレード or cgroup v1を有効化
Hybridモード競合 cgroup v1/v2のいずれかに統一
プラグインの非互換 jobacct_gather/cgroup→jobacct_gather/linuxに変更
※RockyLinux8は、たまたまcgoup v1なのかもしれない
[root@compute01 wine]# mount | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,memory)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,pids)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,perf_event)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpu,cpuacct)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuset)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,blkio)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,net_cls,net_prio)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,freezer)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,devices)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,hugetlb)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,rdma)
RockyLinux9以上で、GPUをSLURMで管理する場合は、cgroupの問題があってバージョンアップが必要。ちなみに、通常のCPUマシンもSLURMが実行できるのかの調査も必要そうであることが示唆される。
RockyLinux8について、GPUの設定をした場合は、ひとまず問題はなくGPUのリソースを指定したジョブ投入ができそうである。
[root@headnode 01]# cd /etc/slurm
[root@headnode slurm]# ll
合計 52
drwxr-xr-x. 2 root root 45 3月 15 07:23 20250315
drwxr-xr-x. 4 root root 4096 3月 15 07:13 archive
-rw-r--r--. 1 root root 275 5月 25 13:32 cgroup.conf
-rw-r--r--. 1 root root 85 5月 25 19:40 gres.conf
-rw-r--r--. 1 root root 42 5月 24 17:30 gres.conf.bak20250524
-rw-r--r--. 1 root root 108 5月 24 17:08 gres.conf.org
-rw-r--r--. 1 root root 608 11月 25 04:32 prolog.sh.temp
-rw-r--r--. 1 root root 4906 5月 25 19:43 slurm.conf
-rw-r--r--. 1 root root 4192 3月 15 07:23 slurm.conf.bak20250315.20250524
-rw-r--r--. 1 root root 4636 5月 24 17:43 slurm.conf.bak20250524.20250525
-rw-------. 1 root root 788 3月 16 2024 slurmdbd.conf
[root@headnode slurm]#
cgroup.conf
[root@headnode slurm]# cat cgroup.conf
###
#
# Slurm cgroup support configuration file
#
# See man slurm.conf and man cgroup.conf for further
# information on cgroup configuration parameters
#--
CgroupAutomount=yes
#CgroupMountpoint="/sys/fs/cgroup"
ConstrainCores=yes
ConstrainRAMSpace=yes
ConstrainDevices=yes
[root@headnode slurm]#
gres.conf
[root@headnode slurm]# cat gres.conf
NodeName=rx9gpu01 Name=gpu File=/dev/null
NodeName=compute02 Name=gpu File=/dev/null
[root@headnode slurm]#
slurm.conf
[root@headnode slurm]# diff -Nur slurm.conf slurm.conf.bak20250315.20250524
--- slurm.conf 2025-05-25 19:43:41.403625175 +0900
+++ slurm.conf.bak20250315.20250524 2025-03-15 07:23:27.849221440 +0900
@@ -16,16 +16,11 @@
#EnforcePartLimits=NO
#2025.03.15
#Epilog=
-# Epilog=/home/settings/Epilog/epilog.d/*
-#
+Epilog=/home/settings/Epilog/epilog.d/*
#EpilogSlurmctld=
#FirstJobId=1
#MaxJobId=67043328
-#
-# 2025.05.24
#GresTypes=
-GresTypes=gpu
-#
#GroupUpdateForce=0
#GroupUpdateTime=600
#JobFileAppend=0
@@ -50,11 +45,9 @@
#Prolog=
#PrologFlags=
#2024.11.25
-#Prolog=/etc/slurm/prolog.sh
-#
+Prolog=/etc/slurm/prolog.sh
#PrologFlags=X11,Alloc
-#PrologFlags=Alloc
-#
+PrologFlags=Alloc
#PrologSlurmctld=
#PropagatePrioProcess=0
#PropagateResourceLimits=
@@ -154,9 +147,6 @@
AccountingStorageHost=headnode
AccountingStoragePass=/var/run/munge/munge.socket.2
#
-#2025.05.24
-AccountingStorageTRES=gres/gpu
-#
#
#JobCompHost=
#JobCompLoc=
@@ -166,21 +156,14 @@
#JobCompUser=
#JobContainerType=job_container/none
JobAcctGatherFrequency=30
-#
-# 2025.05.24
-#JobAcctGatherType=jobacct_gather/none
-JobAcctGatherType=jobacct_gather/cgroup
-#
+JobAcctGatherType=jobacct_gather/none
SlurmctldDebug=info
SlurmctldLogFile=/var/log/slurmctld.log
SlurmdDebug=info
SlurmdLogFile=/var/log/slurmd.log
#SlurmSchedLogFile=
#SlurmSchedLogLevel=
-#
-# 2025.05.24
#DebugFlags=
-DebugFlags=CPU_Bind,gres
#
#
# POWER SAVE SUPPORT FOR IDLE NODES (optional)
@@ -199,19 +182,13 @@
#NodeName=linux[1-32] CPUs=1 State=UNKNOWN
NodeName=headnode CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=770 State=UNKNOWN
NodeName=compute01 CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=770 State=UNKNOWN
-#NodeName=compute02 CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=1778 State=UNKNOWN
-NodeName=compute02 CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=1778 Gres=gpu:1 State=UNKNOWN
+NodeName=compute02 CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=1778 State=UNKNOWN
NodeName=node[1-2] CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=770 State=UNKNOWN
-#NodeName=rx9gpu01 CPUs=1 RealMemory=770 Gres=gpu:2 State=UNKNOWN
-NodeName=rx9gpu01 CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=1775 Gres=gpu:1 State=UNKNOWN
#
# PARTITION
#PartitionName=debug Nodes=ALL Default=YES MaxTime=INFINITE State=UP
PartitionName=debug Nodes=headnode Default=NO MaxTime=30:00 State=UP
-#PartitionName=part1 Nodes=compute0[1-2] Default=NO MaxTime=30:00 State=UP
-PartitionName=part1 Nodes=compute01 Default=NO MaxTime=30:00 State=UP
+PartitionName=part1 Nodes=compute0[1-2] Default=NO MaxTime=30:00 State=UP
PartitionName=part2 Nodes=node[1-2] Default=NO MaxTime=30:00 State=UP
-PartitionName=gpu1 Nodes=rx9gpu01 Default=NO MaxTime=30:00 State=UP
-PartitionName=gpu2 Nodes=compute02 Default=NO MaxTime=30:00 State=UP
[root@headnode slurm]#
[root@headnode 01]# sbatch job.sh
Submitted batch job 118
[root@headnode 01]# sinfo --Node --Format=NodeHost,Gres,GresUsed
HOSTNAMES GRES GRES_USED
compute01 (null) gpu:0
compute02 gpu:1 gpu:0
headnode (null) gpu:0
node1 (null) gpu:0
node2 (null) gpu:0
rx9gpu01 gpu:1 gpu:0
[root@headnode 01]# squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
118 gpu2 test root PD 0:00 1 (Resources)
117 gpu2 test root R 1:49 1 compute02
[root@headnode 01]# squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
118 gpu2 test root PD 0:00 1 (Resources)
117 gpu2 test root R 1:59 1 compute02
[root@headnode 01]#
[root@headnode 01]# scancel 117
[root@headnode 01]# squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
117 gpu2 test root CG 2:10 1 compute02
118 gpu2 test root PD 0:00 1 (Resources)
[root@headnode 01]#
[root@headnode 01]#
[root@headnode 01]#
[root@headnode 01]# squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
118 gpu2 test root R 0:04 1 compute02
[root@headnode 01]#
[root@headnode 01]#
[root@headnode 01]# sinfo --Node --Format=NodeHost,Gres,GresUsed
HOSTNAMES GRES GRES_USED
compute01 (null) gpu:0
compute02 gpu:1 gpu:1
headnode (null) gpu:0
node1 (null) gpu:0
node2 (null) gpu:0
rx9gpu01 gpu:1 gpu:0
[root@headnode 01]# squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
118 gpu2 test root R 2:39 1 compute02
[root@headnode 01]#
RockyLinux9.4でも、cgroupを参照せずにCPUマシンとしてジョブを投入することは、ひとまずできそうであることを確認できました。
[root@rx9gpu01 log]# squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
119 rx9 test root R 2:41 1 rx9gpu01
[root@rx9gpu01 log]# sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
debug up 30:00 1 drain headnode
part1 up 30:00 2 idle compute[01-02]
part2 up 30:00 2 drain* node[1-2]
rx9 up 30:00 1 alloc rx9gpu01
[root@rx9gpu01 log]#
[root@rx9gpu01 log]# cat /etc/os-release
NAME="Rocky Linux"
VERSION="9.4 (Blue Onyx)"
ID="rocky"
ID_LIKE="rhel centos fedora"
VERSION_ID="9.4"
PLATFORM_ID="platform:el9"
PRETTY_NAME="Rocky Linux 9.4 (Blue Onyx)"
ANSI_COLOR="0;32"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:rocky:rocky:9::baseos"
HOME_URL="https://rockylinux.org/"
BUG_REPORT_URL="https://bugs.rockylinux.org/"
SUPPORT_END="2032-05-31"
ROCKY_SUPPORT_PRODUCT="Rocky-Linux-9"
ROCKY_SUPPORT_PRODUCT_VERSION="9.4"
REDHAT_SUPPORT_PRODUCT="Rocky Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="9.4"
[root@rx9gpu01 log]#
slurmd.log
[2025-05-25T20:51:14.602] CPU frequency setting not configured for this node
[2025-05-25T20:51:14.603] slurmd version 21.08.8-2 started
[2025-05-25T20:51:14.605] slurmd started on Sun, 25 May 2025 20:51:14 +0900
[2025-05-25T20:51:14.605] CPUs=1 Boards=1 Sockets=1 Cores=1 Threads=1 Memory=1775 TmpDisk=17340 Uptime=104878 CPUSpecList=(null) FeaturesAvail=(null) FeaturesActive=(null)
[2025-05-25T20:53:07.509] task/affinity: task_p_slurmd_batch_request: task_p_slurmd_batch_request: 119
[2025-05-25T20:53:07.509] task/affinity: batch_bind: job 119 CPU input mask for node: 0x1
[2025-05-25T20:53:07.509] task/affinity: batch_bind: job 119 CPU final HW mask for node: 0x1
[2025-05-25T20:53:07.512] Launching batch job 119 for UID 0
[root@rx9gpu01 log]#