KnowHow

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

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 ~]$