KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

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設定など通信ができるようにする

  1. cgroupの有効化

全ノードに/etc/slurm/cgroup.confを配置します。
例:

CgroupAutomount=yes
ConstrainCores=yes
ConstrainRAMSpace=yes
ConstrainDevices=yes

slurm.confでcgroupを使う設定にします。
例:

ProctrackType=proctrack/cgroup
TaskPlugin=task/cgroup
  1. 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
  1. GPUノードのgres.conf

GPUノードには /etc/slurm/gres.conf を作成

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

NVMLがインストール済みなら AutoDetect=nvml だけでも可。

  1. サービスの起動

cgroup.confは全ノードに配布必須
gres.confは、GPUノードなどGRESを管理するノードに配布必須(全ノードに配布しても問題なし)

全ノードでmunge、slurmdを起動

管理ノードでslurmctldも起動

  1. 動作確認

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]#