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やメモリにウェイトを設定していれば合計値が変わります。