使い所
slurmに投入されるジョブは比較的自作のプログラムやOSSツールが多いですが、有償ツールをジョブに投入することがあります。通常有償ツール自身にライセンス管理機能があり、ライセンス違反が起こると自動的に止まります。
この適切なライセンス管理がslurmでジョブを投げる時には、少し注意が必要です。
slurmで大量のジョブを投入する場合、通常このライセンス数を考慮すること無くジョブが投げられますが、ライセンス数を違反したら自動的にジョブが全部エラーになってしまいます。
本来はライセンス数が解放されるまでジョブを待機して欲しい。
そのためには簡単に実装する方法としては以下の2つの方法があります。
同時に実行出来るジョブ数の制限を制限する
パーティション単位で同時に実行出来るジョブ数MaxJobsPerPartition
をライセンス数の上限に設定することで擬似的にライセンス管理をすることが出来ます。
PartitionName=licpart PartitionType=normal Nodes=node[01-04] MaxJobsPerPartition=1 Default=YES State=UP
sbatch --partition=licpart test.sh
slurmのライセンス管理機能を使う
もう一つの方法としては、slurm.confにLicenses項目に管理したいライセンス名:ライセンス数を指定することで
同時に実行出来るジョブを制限することが出来ます。
Licenses=fluent:30
しかし、このslurm側のライセンス管理を正常に動作させるためには、下記のようにライセンス名と消費するライセンス数をユーザー側が指定する必要がある。
sbatch -L fluent:1 test.sh
簡易的なライセンス制御の問題点
性善説でエンドユーザーが正しくライセンス違反しないように指定して頂く事を期待したいところですが、オペミス含めて、正しく利用されないことをインフラ屋としては想定しなくてはなりません。
上記の問題点は、パーティションの最大数制限は、設定しているパーティションのみしか効果がないため、別のパーティションでジョブを実行されてしまえば制御は出来ません。
またライセンス機能の方もsbatchを実行時に明示的にライセンス指定をしない限り管理することが出来ません。
この問題を解決するためには、ジョブが投入された時にライセンス管理が必要なツールを使っている場合、適切なオプションに補正してあげる必要があります。
job_submit.luaを使ったライセンス管理
このジョブ(ジョブスクリプト)が投入された時に、制御を入れる機能が「job submit plugins」です。
今回その中でluaスクリプトで制御するやり方を今回は取り上げます。
今回は、sleepコマンドを有償ツールに見立てて、ライセンス数:1としてjob_submit.luaを使った制御を設定してみます。
Licenses=lic:1
JobSubmitPlugins=lua
function slurm_job_submit(job_desc, part_list, submit_uid)
-- ジョブスクリプトの内容を読み取る
if job_desc.script ~= nil then
if string.find(job_desc.script, "sleep") then
if job_desc.licenses == nil then
job_desc.licenses = "lic:1"
else
job_desc.licenses = job_desc.licenses .. ",lic:1"
end
else
slurm.log_info("slurm_job_submit: Unable to read job script at path: %s", script_path)
end
end
return slurm.SUCCESS
end
scontrol show lic
LicenseName=lic
Total=1 Used=0 Free=1 Reserved=0 Remote=no
sbatch sleep.sh
Submitted batch job 275
scontrol show lic
LicenseName=lic
Total=1 Used=1 Free=0 Reserved=0 Remote=no
これでライセンス設定を忘れたとしても、ジョブが投入された時に自動的にライセンス設定をしてくれるようになります。