1
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?

Slurm:job_submit.luaを使ったライセンス管理①

Last updated at Posted at 2025-03-07

使い所

slurmに投入されるジョブは比較的自作のプログラムやOSSツールが多いですが、有償ツールをジョブに投入することがあります。通常有償ツール自身にライセンス管理機能があり、ライセンス違反が起こると自動的に止まります。

この適切なライセンス管理がslurmでジョブを投げる時には、少し注意が必要です。

slurmで大量のジョブを投入する場合、通常このライセンス数を考慮すること無くジョブが投げられますが、ライセンス数を違反したら自動的にジョブが全部エラーになってしまいます。

本来はライセンス数が解放されるまでジョブを待機して欲しい。

そのためには簡単に実装する方法としては以下の2つの方法があります。

同時に実行出来るジョブ数の制限を制限する

パーティション単位で同時に実行出来るジョブ数MaxJobsPerPartitionをライセンス数の上限に設定することで擬似的にライセンス管理をすることが出来ます。

slurm.conf
PartitionName=licpart PartitionType=normal Nodes=node[01-04] MaxJobsPerPartition=1 Default=YES State=UP
bash
sbatch --partition=licpart test.sh

slurmのライセンス管理機能を使う

もう一つの方法としては、slurm.confにLicenses項目に管理したいライセンス名:ライセンス数を指定することで
同時に実行出来るジョブを制限することが出来ます。

slurm.conf
Licenses=fluent:30

しかし、このslurm側のライセンス管理を正常に動作させるためには、下記のようにライセンス名と消費するライセンス数をユーザー側が指定する必要がある。

bash
sbatch -L fluent:1 test.sh

簡易的なライセンス制御の問題点

性善説でエンドユーザーが正しくライセンス違反しないように指定して頂く事を期待したいところですが、オペミス含めて、正しく利用されないことをインフラ屋としては想定しなくてはなりません。

上記の問題点は、パーティションの最大数制限は、設定しているパーティションのみしか効果がないため、別のパーティションでジョブを実行されてしまえば制御は出来ません。

またライセンス機能の方もsbatchを実行時に明示的にライセンス指定をしない限り管理することが出来ません。

この問題を解決するためには、ジョブが投入された時にライセンス管理が必要なツールを使っている場合、適切なオプションに補正してあげる必要があります。

job_submit.luaを使ったライセンス管理

このジョブ(ジョブスクリプト)が投入された時に、制御を入れる機能が「job submit plugins」です。
今回その中でluaスクリプトで制御するやり方を今回は取り上げます。

今回は、sleepコマンドを有償ツールに見立てて、ライセンス数:1としてjob_submit.luaを使った制御を設定してみます。

slurm.conf
Licenses=lic:1
JobSubmitPlugins=lua
/etc/slurm/job_submit.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

bash
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

これでライセンス設定を忘れたとしても、ジョブが投入された時に自動的にライセンス設定をしてくれるようになります。

1
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
1
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?