前回の続きQoSによる制御
前回はパーティションに優先順位を付けることで、優先するジョブを割込み実行出来るようにしました。
手軽ではあるのですが、パーティションの数が単純に二倍になるのでパーティション数が多い環境には不向きです。
そこで前回のようなパーティションに優先順位を付けるのでは無く、ジョブ単位で優先順位を付けて
優先度の高いジョブが割込実行出来るようにしていきます。
QoSを使った割込実行をするための設定
下記設定で、QoSを使った場合の優先度を大きく設定し、優先ジョブが投入されたら5秒以内で切り替わるように設定しています。
まずこの段階で大きく引っかかったのはPreemptExemptTimeの設定がPreemptExemptTime=10(秒)と思い設定をしていたら、実際は10分(分単位)であることに気付くまで1週間以上無駄な時間を掛けました。
マニュアルにちゃんと記載されていたのに、初歩的なミスで多少落ち込みました。
記述方法としては、デフォルトは分単位、0:5で分:秒、0:0:5で時:分:秒という単位で記述出来るそうですが、時間単位でwaitを掛ける必要は正直ないと思います。
本来ならばOverSubscribeを使わないで割込実行したかったのですが、現状リソースの安全な解放方法を確保出来ず、多少ダーティーなやり方で割込を実現させています。
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の設定を追加しています。
#!/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
#!/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つ実行し、ちゃんと割り込まれているか検証したいと思います。
$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パーティションからジョブを投入します。
(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なら結局再計算になってしまうので、メモリリソースを解放(スワップへの待避含め)することが出来ないかもうちょっと調査を継続する予定