slurm.confファイルを下記の様に修正する
| [root@slurm ~]# cat /etc/slurm/slurm.conf
ClusterName=cluster
SlurmctldHost=slurm # FQDNでも構わないが、search domainにdomainが入っていれば[hostname -s]でもok
# AuthType=auth/munge
AuthType=auth/slurm # slurm v23.11 以降はslurm内の認証プラグインが使えます
CredType=cred/slurm
#DisableRootJobs=NO # rootによるジョブを禁止するか. 既定はNoでrootもジョブを流せます
#EnforcePartLimits=NO # 投入したジョブがパーティションの制限(時間とかリソース)を超えた場合の対処
# ALLならコマンド実行時(sbatchら)に即時にエラー. No(既定値)はPendingでずっと待ち
#GroupUpdateForce=0 # /etc/groupのタイムスタンプが変わったら再読み込み. 1はGroupUpdateTime毎に再読み込み.
#GroupUpdateTime=600 # 単位は秒. ldap/sssdでgroup情報を引き出す場合は/etc/groupを使わないのでGroupUpdateForceは[1]にする
#JobFileAppend=0 # std/errファイルへの対処. 既定は[0]でstd/errファイルの中身を消去. [1]はappendします
#JobRequeue=1 # 計算ノードが原因でジョブが異常終了したら自動的に再度ジョブが投入されるか. [1](既定)は再実行. [0]は失敗として扱う
#JobSubmitPlugins=job_submit/lua # /etc/slurm/job_submit.luaにてLUA言語でジョブの受付可否スクリプトが定義できる
#KillOnBadExit=0 # [1](規定)はmpiプロセスで1つのworkerでエラーが起きたら全部止める. [0]は残りのmpiプロセスを生かしておく.
#Licenses=matlab*4,moe:4 # ライセンス. でも特段FlexLMとかと連携してないです. 本格的に規制したいなら JobSubmitPlugins でライセンス制御します
# 「sbatch --licenses=matlab:1 my_job.sh」とかで今現在残りのライセンス数とか数えられますがそれだけ. 強制力はない.
#MailProg=/bin/mail # jobの開始、終了、エラー時にメールを飛ばす際のMTAを指定.「sbatch --mail-type=END --mail-user=user@example.com a.sh」とかで.
# [--mail-type=END]の他にもBEGIN(開始時),END(終了時),FAIL(エラー時),ALL(開始,終了,エラー)時に.
MpiDefault=pmix # [sbatch a.sh]でa.sh内でmpirunが使われているなら,mpirunをsrunに変更すべし. っでそのsrunが使うmpiを定義
# none(規定)は指定しない. pmixはopenmpi(v4 - v5),mpich, intel mpi, mpi2は古いopenmpi.
#PlugStackConfig= # 計算ノードでのジョブ実行時に適用したいプラグインを指定. /etc/slurm/plugstack.conf(既定値)
# [required /usr/lib64/slurm/pam_slurm_adopt.so]と/etc/slurm/plugstack.confに記載して計算ノードへのssh接続を制御する(要pam設定)
#PrivateData=jobs # 他人のジョブ情報をどこまで見ていいか. none(規定)は制限なし. jobsは自分のジョブだけ, partitionsは許可されたqueue内の情報だけ
ReturnToService=1 # 計算ノードが復活した際、0(規定)は手動操作でIDLEにする. 1なら自動でIDLEになる. 2は手動で止めててもslurmdが再起動したら強制的にIDLEになる
TmpFS=/scratch # 環境変数 $SLURM_TMPFS で定義される場所. 実行者専用のフォルダが用意されるわけではない...
JobContainerType=job_container/tmpfs # [/etc/slurm/job_container.conf]に[BasePath=/scratch]と記載すると計算ノードでは /scratch は仮想的に作られる.
# 現実の/scratchに何かあっても用意された可能な/scratchには何もなく、データが置ける. 終わったら削除されます.
#TrackWCKey=1 # SlurmDBDに記録されるタグを有効にする. そのタグで計算時間とか修正が可能になる. 「sbatch --wckey=projectABC a.sh」と使う
# 決められたタグしか許容しないようにするには JobSubmitPlugins でLuaスクリプトを書く.
# あるいは[AccountingStorageEnforce=wckeys]としてSlurmDBD側でユーザ別に使えるタグを指定する個が出来る
#UnkillableStepProgram= # ジョブ終了したのにゾンビとして残ったプロセスがあった際に渡すスクリプトを指定します. 通知のスクリプトか、強制再起動を呼ぶスクリプトとか.
ProctrackType=proctrack/cgroup
SlurmctldPidFile=/var/run/slurm/slurmctld.pid
SlurmctldPort=6817
SlurmdPidFile=/var/run/slurm/slurmd.pid
SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurm/d
SlurmUser=slurm
SlurmdUser=root
StateSaveLocation=/var/spool/slurm/ctld
SwitchType=switch/none
TaskPlugin=task/cgroup
SrunPortRange=60001-63000
# TIMERS
InactiveLimit=0
KillWait=30
MinJobAge=300
SlurmctldTimeout=120
SlurmdTimeout=300
Waittime=0
# SCHEDULING
#DefMemPerCPU=0 # core/threads当たりに供給されるメモリーの量. 既定は制限なし. 計算ノード/core数が簡単だけど計算ノードのOS分は考慮するように
#MaxMemPerCPU=0 # 最大メモリ/core. 1coreで全メモリーを使いたいとかなら core 数を増やしてそれに達するように仕向ける.
SchedulerType=sched/backfill
SelectType=select/cons_tres
SelectTypeParameters=CR_Core # SelectTypeParameters が CR_Core なら DefMemPerCPU と MaxMemPerCPU を無視できる
# SelectTypeParameters が CR_Core_Memory なら DefMemPerCPU=0 は全memをジョブに渡るので、実際にmem空きがあってもジョブが入らない.
# JOB PRIORITY
# LOGGING AND ACCOUNTING
AccountingStorageType=accounting_storage/none
#AccountingStorageTRES=gres/gpu
AccountingStoreFlags=YES
JobCompType=jobcomp/none
JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/cgroup
SlurmctldDebug=info
SlurmctldLogFile=/var/log/slurmctld.log
SlurmdDebug=info
SlurmdLogFile=/var/log/slurmd.log
GresTypes=gpu
# COMPUTE NODES
NodeName=n1 CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=16001 Gres=gpu:1
NodeName=n2 CPUs=2 Boards=1 SocketsPerBoard=1 CoresPerSocket=2 ThreadsPerCore=1 RealMemory=15732 Gres=gpu:1
NodeName=n3 CPUs=4 Boards=1 SocketsPerBoard=1 CoresPerSocket=4 ThreadsPerCore=1 RealMemory=16000
NodeName=s CPUs=8 Boards=1 SocketsPerBoard=1 CoresPerSocket=4 ThreadsPerCore=2 RealMemory=31712 Gres=gpu:2 AllowGroups=bio # AllowGroupsはunixグループで許可
# RealMemoryの値は、実際の計算機の値より小さくていい. OS分のメモリーをここで差し引くのもいいかと. DefMemPerCPU/MaxMemPerCPUは RealMemory の値で考える.
# 128GBで32coreのマシンなら128GBのうち8GBをOS向けとして差し引いて 120GB(120*1024->122880)(MB単位で記載) あるとします
# NodeName=gpu1 CPUs=32 ... RealMemory=122880 Gres=gpu:4
# ここで1core当たり2GBを最低として「DefMemPerCPU=2048」で32core指定で64GB.一方でMaxMemPerCPUは120/32->3.75GB(3840MB)で「MaxMemPerCPU=3840」で32coreなら120GB.
PartitionName=workq Nodes=ALL Default=YES MaxTime=INFINITE State=UP
SlurmctldParameters=enable_configless
# POWER SAVE
#SuspendProgram= # SuspendTime(秒)の間、ジョブが来なかったら実行されるスクリプト
#ResumeProgram= # 眠った計算ノードを叩き起こすスクリプト. ipmitool系か wake-on-LAN系のプログラム
#SuspendTime= # 単位は秒. 時間が経過するとSuspendProgramが実行される
#ResumeTimeout= # 単位は秒. SuspendProgramgaが実行されてResumeTimeout後に確認して生きてたらエラーと記録されてDRAINと表記される.
#SuspendExcNodes= # 絶対眠らないノード
#SuspendExcParts= # 絶対に眠らないqueue. このqueueに含まれる計算ノードは眠らない
#SuspendRate= # 1分ごとに眠っていいノード数. 値が10なら10台眠って、次の1分後にまた10台眠る. 既定値は60
[root@slurm ~]#
|
複数のqueueを作る†
pbsとかではqueueというが、slurmでは「Partition」って言うみたい.
上記の「PartitionName=workq Nodes=ALL Default=YES MaxTime=INFINITE State=UP」では登録されているノード全てがqueueの「workq」に所属される
これをGPUノードだけ、CPUノードだけにするなら
#PartitionName=workq Nodes=ALL Default=YES MaxTime=INFINITE State=UP <--無効化
PartitionName=cpu Nodes=n2 MaxTime=INFINITE State=UP
PartitionName=gpu Nodes=n1,n2,s MaxTime=INFINITE State=UP
とNodesでカンマでそのノードを指定します。反映させるには「scontrol reconfig」で反映されます
どちらも「Default=YES」にしていないので、この場合はqueueの際に使用するqueueを指定する必要があります.
参照先 https://oracle-japan.github.io/ocitutorials/hpc/tech-knowhow/slurm-tips/
「ReturnToService」の値. DOWNとされた計算ノードが立ち上がった際の取り扱い.
値「0」は計算ノードが立ち上がってslurmdで通信出来ても手動で操作で「idle」に変更する必要がある.
値「1」はメモリ不足とか予期しない再起動でDONWとされたならDOWNのまま. それ以外で復帰後slurm.confに記載されたノード構成なら使えるようになる
値「2」はslurm.confに記載されたノード構成なら利用可能になります. でも何かが起こったよ.