KnowHow

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

RockyLinxu9.4にてCroupv1とし、SLURM ver 21でGPUのリソース管理を行う

登録日 :2025/09/06 20:19
カテゴリ :SLURM

RockyLinux9.4は、cgroup v2であるがv1にダウングレードでして、slurm ver21でGPUリソースの管理をできるかを調査する。

cgroup v1にする方法は以下にまとめている。lリンク

1. 設定手順

1-1. cgroupファイルを展開する

CPU、GPUマシンふくめてすべてに/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
#--
CgroupAutomount=yes
ConstrainCores=yes
ConstrainRAMSpace=yes
ConstrainDevices=yes

1-2. slurm.confでcgroup有効化

/etc/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

JobAcctGatherType=jobacct_gather/cgroup

DebugFlags=CPU_Bind,gres

GPUノードのステータス情報を登録する(以下、GPU1つ搭載の場合の例)

NodeName=rx9gpu01 CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=1775 Gres=gpu:1 State=UNKNOWN

参考)GPUノードのより詳細な定義は以下のようになる
(GPU2つの場合、GPUのハードウェア情報もあり。GPUのハードウェア情報はnvidia-smiなどでチェック)

ex)
NodeName=computenode05 State=UNKNOWN CPUs=32 Boards=1 SocketsPerBoard=1 CoresPerSocket=16 ThreadsPerCore=2 RealMemory=245847 Gres=gpu:M60:2

GPU機のパーティションも定義しておく

PartitionName=gpu1 Nodes=rx9gpu01 Default=NO MaxTime=30:00 State=UP

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=rx9gpu01 Name=gpu File=/dev/null

設定反映結果の確認

 sinfo --Node --Format=NodeHost,Gres,GresUsed
[root@headnode slurm]# sinfo --Node --Format=NodeHost,Gres,GresUsed
HOSTNAMES           GRES                GRES_USED
compute01           (null)              gpu:0
compute02           (null)              gpu:0
headnode            (null)              gpu:0
node1               (null)              gpu:0
node2               (null)              gpu:0
rx9gpu01            gpu:1               gpu:0
[root@headnode slurm]#

エラーなく設定反映ができた。
RockyLinux9.4マシンで、gpuリソースを認識している。


2. テスト計算

2-1 GPU1つの場合

テスト実行スクリプト

[user01@rx94headnode ~]$ cat gpurun.sh
#!/bin/sh
srun -l /bin/hostname
sleep 60
[user01@rx94headnode ~]$

以下のコマンドでジョブを投入する

[nobuyuki@headnode ~]$ sbatch -p gpu1 --gpus=1 --job-name gpu gpurun.sh

ジョブが実行されたことを確認する

[root@headnode slurm]# squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
               120      gpu1      gpu nobuyuki  R       0:02      1 rx9gpu01
[root@headnode slurm]#

GPUリソースが割り当てられていることを確認する

[root@headnode slurm]# sinfo --Node --Format=NodeHost,Gres,GresUsed
HOSTNAMES           GRES                GRES_USED
compute01           (null)              gpu:0
compute02           (null)              gpu:0
headnode            (null)              gpu:0
node1               (null)              gpu:0
node2               (null)              gpu:0
rx9gpu01            gpu:1               gpu:1
[root@headnode slurm]# 

2-1 GPU8つの場合

GPUボードを模擬するためのダミーファイルを作成する

for i in $(seq 0 7); do sudo mknod /dev/fakegpu${i} c 195 $i; done

以下のようなファイルが作成される

[root@rx9gpu01 slurm]# ll /dev/fake*
crw-r--r--. 1 root root 195, 0  9  6 21:18 /dev/fakegpu0
crw-r--r--. 1 root root 195, 1  9  6 21:18 /dev/fakegpu1
crw-r--r--. 1 root root 195, 2  9  6 21:18 /dev/fakegpu2
crw-r--r--. 1 root root 195, 3  9  6 21:18 /dev/fakegpu3
crw-r--r--. 1 root root 195, 4  9  6 21:18 /dev/fakegpu4
crw-r--r--. 1 root root 195, 5  9  6 21:18 /dev/fakegpu5
crw-r--r--. 1 root root 195, 6  9  6 21:18 /dev/fakegpu6
crw-r--r--. 1 root root 195, 7  9  6 21:18 /dev/fakegpu7
[root@rx9gpu01 slurm]# 

GPUノードの/etc/slurm/grep.confを以下のように修正する

[root@rx9gpu01 slurm]# cat gres.conf
NodeName=rx9gpu01 Name=gpu File=/dev/fakegpu0
NodeName=rx9gpu01 Name=gpu File=/dev/fakegpu1
NodeName=rx9gpu01 Name=gpu File=/dev/fakegpu2
NodeName=rx9gpu01 Name=gpu File=/dev/fakegpu3
NodeName=rx9gpu01 Name=gpu File=/dev/fakegpu4
NodeName=rx9gpu01 Name=gpu File=/dev/fakegpu5
NodeName=rx9gpu01 Name=gpu File=/dev/fakegpu6
NodeName=rx9gpu01 Name=gpu File=/dev/fakegpu7
[root@rx9gpu01 slurm]# 

/etc/slurm/slurm.conf の定義でGPU数を8つにする

NodeName=rx9gpu01 CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=1775 Gres=gpu:8 State=UNKNOWN

設定を反映して、GPUが8つに構成されたことを確認する

[root@headnode slurm]# sinfo --Node --Format=NodeHost,Gres,GresUsed
HOSTNAMES           GRES                GRES_USED
compute01           (null)              gpu:0
compute02           (null)              gpu:0
headnode            (null)              gpu:0
node1               (null)              gpu:0
node2               (null)              gpu:0
rx9gpu01            gpu:8               gpu:0
[root@headnode slurm]#

テストジョブを投入する(GPUを4つ利用)

[nobuyuki@headnode ~]$ sbatch -p gpu1 --gpus=4 --job-name gpu gpurun.sh
[nobuyuki@headnode ~]$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
               122      gpu1      gpu nobuyuki  R       0:02      1 rx9gpu01

[nobuyuki@headnode ~]$ 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]
gpu1         up      30:00      1  alloc rx9gpu01

GPUが使用されていることを確認する

[root@headnode slurm]# sinfo --Node --Format=NodeHost,Gres,GresUsed
HOSTNAMES           GRES                GRES_USED
compute01           (null)              gpu:0
compute02           (null)              gpu:0
headnode            (null)              gpu:0
node1               (null)              gpu:0
node2               (null)              gpu:0
rx9gpu01            gpu:8               gpu:4
[root@headnode slurm]# s
[root@headnode slurm]# scontrol show job 122
JobId=122 JobName=gpu
   UserId=nobuyuki(1000) GroupId=nobuyuki(1000) MCS_label=N/A
   Priority=4294901759 Nice=0 Account=(null) QOS=normal
   JobState=RUNNING Reason=None Dependency=(null)
   Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0
   RunTime=00:02:14 TimeLimit=00:30:00 TimeMin=N/A
   SubmitTime=2025-09-06T21:37:36 EligibleTime=2025-09-06T21:37:36
   AccrueTime=2025-09-06T21:37:36
   StartTime=2025-09-06T21:37:36 EndTime=2025-09-06T22:07:36 Deadline=N/A
   SuspendTime=None SecsPreSuspend=0 LastSchedEval=2025-09-06T21:37:36 Scheduler=Backfill
   Partition=gpu1 AllocNode:Sid=headnode:3834
   ReqNodeList=(null) ExcNodeList=(null)
   NodeList=rx9gpu01
   BatchHost=rx9gpu01
   NumNodes=1 NumCPUs=1 NumTasks=1 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
   TRES=cpu=1,node=1,billing=1,gres/gpu=4
   Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=*
   MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0
   Features=(null) DelayBoot=00:00:00
   OverSubscribe=OK Contiguous=0 Licenses=(null) Network=(null)
   Command=/home/user01/gpurun.sh
   WorkDir=/home/user01
   StdErr=/home/user01/slurm-122.out
   StdIn=/dev/null
   StdOut=/home/user01/slurm-122.out
   Power=
   TresPerJob=gres:gpu:4

TresPerJob=grep:gpu:4 となっているので、GPU4つ指定されていることがわかる

一方で、squeueコマンドのオプションではGPUが認識できなかった。
これは、GPUの設定がフェイクのためかもしれない。

[nobuyuki@headnode ~]$ squeue -O NumTasks,StateCompact,GRES
TASKS               ST                  TRES_PER_NODE
1                   R                   N/A

sacctでの結果確認

--format=AllocTRES%40,

--format=ReqTRES%40,

で結果をGPUの使用数を確認することが可能
コマンド例

startdate="2025-01-01"
endddate="2025-12-31"
sacct --starttime=${startdate} --endtime=${enddate} --format JobID%5,end%16,User%8,JobName%8,Partition%8,NCPU%5,AllocTRES%40,ReqTRES%40,elapsed,state -X
  121 2025-09-06T21:14 nobuyuki      gpu     gpu1     1        billing=1,cpu=1,gres/gpu=1,node=1 billing=1,cpu=1,gres/gpu=1,mem=1775M,no+   00:01:00  COMPLETED
  122 2025-09-06T21:47 nobuyuki      gpu     gpu1     1        billing=1,cpu=1,gres/gpu=4,node=1 billing=1,cpu=1,gres/gpu=4,mem=1775M,no+   00:10:00  COMPLETED

billing=1,cpu=1,gres/gpu=4,node=1
というところで、gpu=4より、GPUを4つ使用したことがわかる。


Appendix

AllocTRES%40としたときに、billingについて。

billing(Billing TRES)は、Slurmにおける利用リソースの「課金単位」や「重み付け合計」を示すTRES(Trackable Resource)です。これは単なるリソースの物理的な数ではなく、管理者が各リソース種別に重み(ウェイト)を設定できるもので、優先度計算や利用量レポート、利用制限、課金集計などに利用されます。

具体的な意味
各パーティションの TRESBillingWeights という設定で、例として

TRESBillingWeights="CPU=1.0,Mem=0.25G,GRES/gpu=2.0"

などと定義できます。

これを使ってジョブ単位で「billing値=CPU数×CPUウェイト+メモリ量×メモリウェイト+GPU数×GPUウェイト」のように重み付きの合計が計算されます。

何も設定しない場合、デフォルトは単純なCPU数合計となります。

用途
FairShare(利用公平性)計算

利用量の制限や会計管理

帳票・ユーザーへの課金計算など。


billing=1は今回のジョブに割り当てられた重み付き合計値が1であった、という意味です。

これは「1CPU×1.0=1」のような設定の場合。そのほかGPUやメモリにウェイトを設定していれば合計値が変わります。