RockyLinxu9.4にSLURM 25を構築し、GPUのリソース管理を行う(ver2) その2(GPU)
| 登録日 | :2025/07/21 21:04 |
|---|---|
| カテゴリ | :SLURM |
4. GPU機としてクライアントノードの設定
RockyLinux9.4をGPU機と過程した設定手順をまとめる。
参考として、過去にGPUのリソース管理設定手順を調査している。この時は、RockyLinux8であれば、GPU機としてのリソース管理ができそうであった。今回はバージョンアップすることによって、RockyLinux9.4でGPUリソース管理すること、およびその設定手順を明確化してまとめる。
参考)https://nonoco.believeriver.site/detail_mark/476/
4-1. 設定手順
4-1-1 cgroupファイルを展開する
CPUマシン、GPUマシン、含めてすべてのノードに/etc/slurm/cgroup.confを展開する
/etc/slurm/cgroup.conf
# cat cgroup.conf
###
#
# Slurm cgroup support configuration file
#
# See man slurm.conf and man cgroup.conf for further
# information on cgroup configuration parameters
#--
# CgroupPlugin=cgroup/v2
ConstrainCores=yes
ConstrainDevices=yes
ConstrainRAMSpace=yes
ConstrainSwapSpace=yes
4-1-2 slurm.confでcgoup有効化
slurm.confにて、cgroupを使用する設定、およびGPUを使用する設定を有効化する
GRESタイプでgpuを指定
#GresTypes=
GresTypes=gpu
cgroupを使用する設定に変更
ProctrackType=proctrack/cgroup
TaskPlugin=task/cgroup
Logging and Accountingセクションで以下のようにGPUを使用する設定を変更
# Logging and Accounting
AccountingStorageTRES=gres/gpu
DebugFlags=CPU_Bind,gres
JobAcctGatherType=jobacct_gather/cgroup
GPUノードのステータス情報を登録する(以下、GPU1つ搭載の場合の例)
NodeName=gpu01 CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=1775 Gres=gpu:1 State=UNKNOWN
GPUノードのより詳細な定義は以下のようになる(GPU2つの場合、GPUのハードウェア情報もあり)
(GPUのハードウェア情報はnvidia-smiなどでチェック)
NodeName=computenode05 State=UNKNOWN CPUs=32 Boards=1 SocketsPerBoard=1 CoresPerSocket=16 ThreadsPerCore=2 RealMemory=245847 Gres=gpu:M60:2
4-1-3 gres.conf(GPUノードのみで必要)
GPUノードでは、GPUの情報を定義した、gres.confが必要となる。
nvidia-smiコマンドなどで調べる
サンプル)
NodeName=computenode05 Name=gpu Type=M60 File=/dev/nvidia0 COREs=0-31
NodeName=computenode05 Name=gpu Type=M60 File=/dev/nvidia1 COREs=0-31
今回は、テスト環境のため実際にGPUを搭載していないため、gres.confでNullを定義する
NodeName=gpu01 Name=gpu File=/dev/null
4-2. 動作確認
設定ファイルを展開して、確認する
# ./send-conf.sh
2025年 7月 21日 月曜日 21:43:43 JST
rx94headnode
slurm.conf 100% 4199 3.5MB/s 00:00
cgroup.conf 100% 266 361.3KB/s 00:00
active(running)
2121:43:44
slurm.conf 100% 4199 3.9MB/s 00:00
cgroup.conf 100% 266 314.1KB/s 00:00
active(running)
2121:43:45
slurmctld ->
active(running)
slurmd ->
active(running)
2121:43:46
[root@rx94headnode bash]#
# sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
debug up 30:00 1 idle rx94headnode
cpu up 30:00 1 idle cpu01
gpu up 30:00 1 idle gpu01
[root@rx94headnode bash]#
GPUノードが認識されているかは、以下のようにわかる
sinfo --Node --Format=NodeHost,Gres,GresUsed
[root@rx94headnode bash]# sinfo --Node --Format=NodeHost,Gres,GresUsed
HOSTNAMES GRES GRES_USED
cpu01 (null) (null)
gpu01 gpu:1 gpu:0
rx94headnode (null) (null)
[root@rx94headnode bash]#
4-3. テスト計算
テスト実行スクリプト
[user01@rx94headnode ~]$ cat gpurun.sh
#!/bin/sh
srun -l /bin/hostname
sleep 60
[user01@rx94headnode ~]$
以下のコマンドで、バッチジョブを投入する
sbatch -p gpu --gpus=1 --job-name gpu gpurun.sh
ジョブ投入状況
[user01@rx94headnode ~]$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
4 gpu gpu user01 R 0:26 1 gpu01
GPUの使用状況の確認(gpuノードのGPUリソースが使用されていることを確認)
[user01@rx94headnode ~]$ sinfo --Node --Format=NodeHost,Gres,GresUsed
HOSTNAMES GRES GRES_USED
cpu01 (null) (null)
gpu01 gpu:1 gpu:1
rx94headnode (null) (null)
無事にGPUリソースを選択して計算投入できた。
4-4 複数のGPUボードのリソース管理をテスト
1ノードに複数のGPUが搭載されていることを前提にリソース管理する手順を確認する。
まず、実際はGPUがないノードでテストする場合は、ダミーファイルを作成する。
for i in $(seq 0 7); do sudo mknod /dev/fakegpu${i} c 195 $i; done
/devに、fakegpu0-7が作成される
[user01@gpu01 ~]$ ll /dev/fake*
crw-r--r--. 1 root root 195, 0 7月 22 07:07 /dev/fakegpu0
crw-r--r--. 1 root root 195, 1 7月 22 07:07 /dev/fakegpu1
crw-r--r--. 1 root root 195, 2 7月 22 07:07 /dev/fakegpu2
crw-r--r--. 1 root root 195, 3 7月 22 07:07 /dev/fakegpu3
crw-r--r--. 1 root root 195, 4 7月 22 07:07 /dev/fakegpu4
crw-r--r--. 1 root root 195, 5 7月 22 07:07 /dev/fakegpu5
crw-r--r--. 1 root root 195, 6 7月 22 07:07 /dev/fakegpu6
crw-r--r--. 1 root root 195, 7 7月 22 07:07 /dev/fakegpu7
[user01@gpu01 ~]$
/etc/slurm/gres.conf を以下のように修正する
[root@gpu01 slurm]# cat gres.conf
NodeName=gpu01 Name=gpu File=/dev/fakegpu0
NodeName=gpu01 Name=gpu File=/dev/fakegpu1
NodeName=gpu01 Name=gpu File=/dev/fakegpu2
NodeName=gpu01 Name=gpu File=/dev/fakegpu3
NodeName=gpu01 Name=gpu File=/dev/fakegpu4
NodeName=gpu01 Name=gpu File=/dev/fakegpu5
NodeName=gpu01 Name=gpu File=/dev/fakegpu6
NodeName=gpu01 Name=gpu File=/dev/fakegpu7
[root@gpu01 slurm]#
/etc/slurm/slurm.conf のノード定義を以下のようにGres=gpu:8に修正
NodeName=gpu01 CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=1775 Gres=gpu:8 State=UNKNOWN
slurm.confを配布して、slurmctld, slurmdを再起動すると、gpuが8個で再認識することを確認
[root@gpu01 slurm]# sinfo --Node --Format=NodeHost,Gres,GresUsed
HOSTNAMES GRES GRES_USED
cpu01 (null) (null)
gpu01 gpu:8 gpu:0
rx94headnode (null) (null)
[root@gpu01 slurm]#
GPUを指定したジョブを複数投入して、リソース管理されるかを確認する
[user01@gpu01 ~]$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
13 gpu gpu user01 PD 0:00 1 (Priority)
12 gpu gpu user01 PD 0:00 1 (Resources)
11 gpu gpu user01 R 0:23 1 gpu01
[user01@gpu01 ~]$
[user01@gpu01 ~]$ sinfo --Node --Format=NodeHost,Gres,GresUsed
HOSTNAMES GRES GRES_USED
cpu01 (null) (null)
gpu01 gpu:8 gpu:4
rx94headnode (null) (null)
[user01@gpu01 ~]$
複数のGPUを指定したジョブ投入は可能。
一方でGPUに空きはあるものの、ジョブが入らない模様。
これは、CPUが1つであることが影響している可能性がある。
複数のCPUとしたノードを準備してのテストが必要と思われる。
[user01@gpu01 ~]$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
13 gpu gpu user01 PD 0:00 1 (Resources)
12 gpu gpu user01 R 0:04 1 gpu01
[user01@gpu01 ~]$
[user01@gpu01 ~]$ sinfo --Node --Format=NodeHost,Gres,GresUsed
HOSTNAMES GRES GRES_USED
cpu01 (null) (null)
gpu01 gpu:8 gpu:4
rx94headnode (null) (null)
[user01@gpu01 ~]$
4-4.2 複数のGPUボードのリソース管理をテスト(その2)
CPUボード3つに拡張して、GPUリソースの動作検証を行う
slurm.confを以下のように修正
#cpu 1->3 gpu 1->8
NodeName=gpu01 CPUs=3 Boards=1 SocketsPerBoard=1 CoresPerSocket=3 ThreadsPerCore=1 RealMemory=1775 Gres=gpu:8 State=UNKNOWN
GPUノードのCPU数が3に拡張されていることを確認
NodeName=gpu01 Arch=x86_64 CoresPerSocket=3
CPUAlloc=0 CPUEfctv=3 CPUTot=3 CPULoad=0.00
AvailableFeatures=(null)
ActiveFeatures=(null)
Gres=gpu:8
NodeAddr=gpu01 NodeHostName=gpu01 Version=25.05.1
OS=Linux 5.14.0-427.13.1.el9_4.x86_64 #1 SMP PREEMPT_DYNAMIC Wed May 1 19:11:28 UTC 2024
RealMemory=1775 AllocMem=0 FreeMem=1026 Sockets=1 Boards=1
State=IDLE ThreadsPerCore=1 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A
Partitions=gpu
BootTime=2025-07-22T16:58:14 SlurmdStartTime=2025-07-22T17:03:24
LastBusyTime=2025-07-22T17:10:36 ResumeAfterTime=None
CfgTRES=cpu=3,mem=1775M,billing=3,gres/gpu=8
AllocTRES=
CurrentWatts=0 AveWatts=0
gpu01に、複数のジョブを詰め込み計算できることを確認
[user01@gpu01 ~]$ sbatch -p gpu -c 1 --gpus=2 --job-name gpu gpurun.sh
Submitted batch job 16
[user01@gpu01 ~]$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
16 gpu gpu user01 R 0:02 1 gpu01
15 gpu gpu user01 R 0:05 1 gpu01
14 gpu gpu user01 R 0:08 1 gpu01
[user01@gpu01 ~]$
適切にGPU数が割り当てられている
[user01@gpu01 ~]$ sinfo --Node --Format=NodeHost,Gres,GresUsed
HOSTNAMES GRES GRES_USED
cpu01 (null) (null)
gpu01 gpu:8 gpu:6
rx94headnode (null) (null)
次に、GPUが枯渇したときにPDとなるかのテスト
CPUを1、GPUを4指定して、3ジョブを投入すると、2ジョブ(GPU8つ)でFULLとなるので、1つのジョブはGPU不足でPDとなっている様子を確認することができた。
[user01@gpu01 ~]$ sbatch -p gpu -c 1 --gpus=4 --job-name gpu gpurun.sh
Submitted batch job 18
[user01@gpu01 ~]$ sbatch -p gpu -c 1 --gpus=4 --job-name gpu gpurun.sh
Submitted batch job 19
[user01@gpu01 ~]$ sbatch -p gpu -c 1 --gpus=4 --job-name gpu gpurun.sh
Submitted batch job 20
[user01@gpu01 ~]$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
20 gpu gpu user01 PD 0:00 1 (Resources)
19 gpu gpu user01 R 0:11 1 gpu01
18 gpu gpu user01 R 0:14 1 gpu01
[user01@gpu01 ~]$
[user01@gpu01 ~]$ sinfo --Node --Format=NodeHost,Gres,GresUsed
HOSTNAMES GRES GRES_USED
cpu01 (null) (null)
gpu01 gpu:8 gpu:8
rx94headnode (null) (null)
[user01@gpu01 ~]$