0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

slurm24.11:preempt機能によるジョブのSUSPENDと割込実行②

Posted at

前回の続きQoSによる制御

前回はパーティションに優先順位を付けることで、優先するジョブを割込み実行出来るようにしました。

手軽ではあるのですが、パーティションの数が単純に二倍になるのでパーティション数が多い環境には不向きです。

そこで前回のようなパーティションに優先順位を付けるのでは無く、ジョブ単位で優先順位を付けて
優先度の高いジョブが割込実行出来るようにしていきます。

QoSを使った割込実行をするための設定

下記設定で、QoSを使った場合の優先度を大きく設定し、優先ジョブが投入されたら5秒以内で切り替わるように設定しています。
まずこの段階で大きく引っかかったのはPreemptExemptTimeの設定がPreemptExemptTime=10(秒)と思い設定をしていたら、実際は10分(分単位)であることに気付くまで1週間以上無駄な時間を掛けました。
マニュアルにちゃんと記載されていたのに、初歩的なミスで多少落ち込みました。
記述方法としては、デフォルトは分単位、0:5で分:秒、0:0:5で時:分:秒という単位で記述出来るそうですが、時間単位でwaitを掛ける必要は正直ないと思います。

本来ならばOverSubscribeを使わないで割込実行したかったのですが、現状リソースの安全な解放方法を確保出来ず、多少ダーティーなやり方で割込を実現させています。

slurm.conf
PriorityType=priority/multifactor
PriorityWeightQOS=100000

PreemptType=preempt/qos
PreemptMode=SUSPEND,GANG
PreemptExemptTime=0:5

PartitionName=standard Nodes=ALL Default=YES MaxTime=INFINITE State=UP PreemptMode=SUSPEND,GANG OverSubscribe=FORCE:1

ジョブに設定するQoSとして、low,normal,highを作ります。

# low: 優先度が低く、誰もプリエンプトしない
sacctmgr add qos low Priority=500 Preempt=off Flags=NO_DECAY

# normal: 少し高めの優先度、誰もプリエンプトしない
sacctmgr add qos normal Priority=1000 Preempt=off Flags=NO_DECAY

# high: 優先度が高く、lowとnormalをプリエンプト(suspend)できる
sacctmgr add qos high Priority=10000 Preempt=low,normal Flags=NO_DECAY

実行するジョブは前回の記事のジョブを少し修正し、Qosの設定を追加しています。

normal.sh
#!/bin/bash
#SBATCH --job-name=test.sh
#SBATCH -o job_%J_%j.out
#SBATCH -e job_%J_%j.err
#SBATCH --qos=normal

# メモリを1GB消費して300秒waitするだけのスクリプト
python mem.py
high.sh
#!/bin/bash
#SBATCH --job-name=high.sh
#SBATCH -o job_%J_%j.out
#SBATCH -e job_%J_%j.err
#SBATCH --qos=high

python mem.py

それではnormalのジョブを3つ実行し、ちゃんと割り込まれているか検証したいと思います。

bash
$sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
normal*      up   infinite      1   idle slurm2411c1

(base) testuser1@slurm2411c1:/work/temp$ squeue
JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)

まずは、normalパーティションからジョブを投入します。

bash
(base) testuser1@slurm2411c1:/work/temp$ sbatch normal.sh 
Submitted batch job 177
(base) testuser1@slurm2411c1:/work/temp$ sbatch normal.sh 
Submitted batch job 178
(base) testuser1@slurm2411c1:/work/temp$ sbatch normal.sh 
Submitted batch job 179

(base) testuser1@slurm2411c1:/work/temp$ squeue

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
179  normal      test.sh  testuser1 PD       0:00      1 (Resources)
178  normal      test.sh  testuser1  R       3:46      1 slurm2411c1
177  normal      test.sh  testuser1  R       3:49      1 slurm2411c1

qos=highを設定したジョブを投入するとJOBID:177がS(SUSPEND)になり、high.shが実行されました。

(base) testuser1@slurm2411c1:/work/temp$ sbatch normal.sh 
Submitted batch job 180

(base) testuser1@slurm2411c1:/work/temp$ squeue

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
179  normal      test.sh  testuser1 PD       0:00      1 (Resources)
178  normal      test.sh  testuser1  R       3:46      1 slurm2411c1
177  normal      test.sh  testuser1  S       3:49      1 slurm2411c1
180  normal      high.sh  testuser1  R       0:09      1 slurm2411c1

しかし経過を見ていると、JOBID:177と180(high.sh)が交互にR(RUN)とS(SUSPEND)になりました。

(base) testuser1@slurm2411c1:/work/temp$ squeue

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
179  normal      test.sh  testuser1 PD       0:00      1 (Resources)
178  normal      test.sh  testuser1  R       3:46      1 slurm2411c1
177  normal      test.sh  testuser1  R       3:49      1 slurm2411c1
180  normal      high.sh  testuser1  S       0:09      1 slurm2411c1

(base) testuser1@slurm2411c1:/work/temp$ squeue

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
179  normal      test.sh  testuser1 PD       0:00      1 (Resources)
178  normal      test.sh  testuser1  R       3:46      1 slurm2411c1
177  normal      test.sh  testuser1  S       3:49      1 slurm2411c1
180  normal      high.sh  testuser1  R       0:09      1 slurm2411c1

終わりに

OverSubscribeによって、CPUのリソースは競合していても動作する事ができました。
しかしマニュアル上ではGPUリソースを使う場合は割込は出来ないと記載されていますので、
GPUを使うジョブに関しては素直に待つしかないようです。

REQUEUEなら結局再計算になってしまうので、メモリリソースを解放(スワップへの待避含め)することが出来ないかもうちょっと調査を継続する予定

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?