メインコンテンツまでスキップ

Slurm

ライセンスを使うジョブがキューに入る前に Slurm が LicOps にシートを要求するようにするには、OpenLM Slurm アダプターをインストールします。ユーザーは、Slurm で従来どおり --licenses=matlab:1 の形式でライセンスを要求できます。LicOps が拒否したジョブはキューに入らず、ユーザーには、どのライセンスが拒否されたかがすぐに通知されます。理由は /var/log/openlm/hpc-adapter.log に記録されます。

アダプターが Slurm に組み込まれる仕組み​

リクエスト、それぞれを送信するアダプター、実行場所、タイミングを次の表に示します。

リクエストアダプター実行場所タイミング
許可(Admit)ol-sbatch(sbatch のラッパー)各投入ノードとログインノード(ユーザー権限で実行)ジョブの投入時、ジョブが Slurm に届く前
ディスパッチ(Dispatch)ol-prolog(PrologSlurmctld として実行)Slurm コントローラージョブにリソースが割り当てられたとき
解放(Release)ol-epilog(EpilogSlurmctld として実行)Slurm コントローラージョブの終了時(終了の仕方は問わない)
チェックアウトのルーティング(任意)ol-taskprolog(TaskProlog として実行)各計算ノードジョブのタスクの開始時

許可リクエストは Slurm コントローラー内ではなくユーザー自身の sbatch 呼び出しの中で実行されるため、LicOps の応答が遅い場合や LicOps に到達できない場合でも、ほかのジョブのスケジューリングが止まることはありません。ol-sbatch はセッション ID をジョブのコメントに olsid=<session-id> として保存し、コントローラー側のフックはそこからセッション ID を読み取ります。

1 つのジョブで、--licenses=matlab:1,abaqus:2 のように複数のライセンスを一度に要求できます。アダプターはそれぞれのライセンスについて許可を求め、いずれか 1 つでも拒否された場合は、ほかのライセンスを解放して投入全体を拒否します。

はじめに​

次の前提条件を確認します。

  • OpenLM LicOps を設定するの説明どおりに LicOps が稼働しており、プールを認識していること。
  • コントローラーとすべての投入ノードおよびログインノードから、ポート 8100 で LicOps に到達できること。
  • コントローラーとすべての投入ノードおよびログインノードに、curl と jq がインストールされていること。
  • root として slurm.conf を編集し、scontrol reconfigure を実行できること。
  • OpenLM から提供される OpenLM HPC アダプターパッケージとインテグレーションキットがあること。

アダプターをインストールする​

アダプターをインストールするには、コントローラーから LicOps を確認し、ライセンス名を対応付け、アダプターを設定して、コントローラーと投入ノードにインストールします。

コントローラーから LicOps を確認する​

コントローラー上でアダプターパッケージを展開し、GET /api/v1/stats に表示されるプールを 1 つ指定して、統合キットの検証スクリプト verify-router.sh を実行します。このスクリプトは許可、ディスパッチ、解放のリクエストを 1 回ずつ送信するだけで、Slurm 側は何も変更しません。次のコマンドを実行します。

./slurm/verify-router.sh --rest-only \
--base-url http://<licops-host>:8100/api/v1/admission-controller \
--vendor MLM --feature MATLAB

報告された問題は、先に進む前にすべて修正してください。アドレスや名前の修正は、ジョブがそれらに依存するようになってからよりも、今のうちに行うほうがはるかに簡単です。

Slurm のライセンス名を LicOps のプールに対応付ける​

Slurm は matlab のような短い名前でライセンスを識別します。一方、LicOps は MLM:MATLAB のような VENDOR:FEATURE の形式で識別します。アダプターは、ライセンスマップ OL_LICENSE_MAP を使ってこの 2 つを変換します。ライセンスマップは手入力せず、インテグレーションキットの make-license-map.sh を使って、LicOps に実際に存在するプールから生成してください。

./make-license-map.sh --router http://<licops-host>:8100
# 1) /etc/openlm/hpc-adapter.conf -- single-quoted, so $ and %20 stay literal:
OL_LICENSE_MAP='MATLAB=MLM:MATLAB Acrobat_Pro=adskflex:Acrobat%20Pro 86508IDSS_2016_0F=ansyslmd:86508IDSS_2016_0F'
#
# 2) slurm.conf, then: scontrol reconfigure
Licenses=MATLAB:100,Acrobat_Pro:25,86508IDSS_2016_0F:10

各 = の左側の名前は自由に決められます。これはユーザーが --licenses に入力する名前です。matlab のように、ユーザーが普段使っている名前に変更し、Licenses= でも同じ名前を使ってください。右側の VENDOR:FEATURE の値は決して編集しないでください。複数のライセンスサーバーが提供するプールは 1 回だけ表示され、シート数は合算されます。

マップにエントリがない Slurm の名前は、ベンダー名とフィーチャー名の両方としてそのまま送信されます(matlab は matlab:matlab になります)。この名前に一致するプールはありません。ユーザーが投入に使うすべての名前について、マップにエントリが必要です。

設定ファイルを準備する​

設定ファイルを準備するには、アダプターパッケージからテンプレートをコピーし、コピーしたファイルを編集します。

cp config/hpc-adapter.conf.example hpc-adapter.conf

少なくとも次の項目を設定します。

設定値
OL_BASE_URLhttp://<licops-host>:8100/api/v1/admission-controller
OL_LICENSE_MAP生成スクリプトが出力した行を、一重引用符で囲んだまま設定します。
OL_FAIL_MODE_ADMIT、OL_FAIL_MODE_DISPATCHopen または closed。LicOps に到達できない場合の動作を決めるを参照してください。
OL_TIMEOUTアダプターが LicOps の応答を待つ秒数。保持時間の長いスロットルルールを使う場合を除き、既定値の 2 のままにしてください。
OL_CLUSTER_NAME任意。LicOps の記録に使われる、このクラスターの名前。

同じファイルがインストーラーの入力になり、アダプターの実行時の設定ファイル /etc/openlm/hpc-adapter.conf にもなります。

コントローラーと投入ノードにインストールする​

コントローラーにインストールするには、root として次のコマンドを実行します。

sudo ./slurm/install-slurm-adapters.sh --settings hpc-adapter.conf --role controller

インストーラーはアダプターを /opt/openlm/hpc にコピーし、slurm.conf をバックアップしてから PrologSlurmctld と EpilogSlurmctld を追加し、scontrol reconfigure を実行します。プロローグやエピローグがすでに別のスクリプトを指している場合、インストーラーはそれを上書きしません。その場合はその旨が表示されるので、既存のスクリプトから OpenLM のフックを呼び出してください。まず --dry-run を付けて実行すると、行われるすべての変更を事前に確認できます。インストーラーは何度実行しても問題ありません。

すべての投入ノードとログインノードにインストールするには、次のコマンドを実行します。

sudo ./slurm/install-slurm-adapters.sh --settings hpc-adapter.conf --role submit

これにより ol-sbatch が /usr/local/bin にインストールされます。コントローラーから投入ノードへ一度にインストールするには、コントローラー用のコマンドに --submit-nodes login1,login2 を追加します。この場合、それらのノードにパスワードなしの root SSH で接続できる必要があります。

両方のロールをインストールする

コントローラーのロールだけをインストールすると、投入ノードに ol-sbatch がないため、ジョブは LicOps に問い合わせずに投入されます。投入ノードのロールだけをインストールすると、許可されたジョブがディスパッチも解放もされないため、そのシートはセッションのタイムアウトまで保持されたままになります。

ライセンス名を Slurm に宣言する​

--licenses は Slurm 本来のオプションで、Slurm は認識していないライセンス名を拒否します。生成された Licenses= の行を、すでに宣言しているライセンスと統合して slurm.conf に追加し、sudo scontrol reconfigure を実行します。または、コントローラーのインストール時に --register-licenses を指定すると、マップ内のすべての名前が --license-count の数(既定値は 100)で追加されます。--license-count は、最も大きいプールの合計数以上に設定してください。

Slurm はこれらのライセンスを自分でもカウントし、そのカウントを超えるジョブはキューで待機させます。各カウントはプールの実際の合計数(生成スクリプトが書き出す値)を下回らないように設定し、実際の上限の適用は LicOps に任せてください。

ライセンスマップを最新に保つ​

生成したマップは、その時点のスナップショットです。後から OpenLM Platform に追加されたライセンスはマップに含まれないため、それを要求するジョブは NoServerAvailable として拒否されます。マップを最新に保つには、インテグレーションキットの refresh-license-map.sh と make-license-map.sh を、各投入ノードの同じフォルダー(例: /opt/openlm/)にコピーし、更新スクリプトをタイマーで実行します。

# /etc/cron.d/openlm-license-map
0 * * * * root /opt/openlm/refresh-license-map.sh --router http://<licops-host>:8100 --quiet

次に、/etc/openlm/hpc-adapter.conf の一番最後に次の行を追加し、更新されたマップがその上にあるマップより優先されるようにします。

[ -r /etc/openlm/license-map.generated ] && . /etc/openlm/license-map.generated

更新スクリプトはファイルを 1 回の操作で置き換え、LicOps に到達できない場合は以前のマップを保持し、空のマップをインストールすることはありません。生成スクリプトが選ばない名前をプールに付けるには、/etc/openlm/license-map.overrides に name=VENDOR:FEATURE の行を追加します。この行は更新後も保持されます。

更新スクリプトが最新に保つのはアダプターのマップであり、slurm.conf ではありません。ユーザーが新しいライセンスを要求できるようにするには、その名前を Licenses= にも追加し、scontrol reconfigure を実行してください。

ライセンスを使うジョブを投入する​

ユーザーは、ol-sbatch と普段使っているオプションでジョブを投入します。

ol-sbatch --licenses=matlab:1 my-simulation.sh

ジョブスクリプト内の #SBATCH --licenses=matlab:1 の行も使えます。拒否されたジョブはキューに入らず、ユーザーには OpenLM: licence admission denied for MLM:MATLAB. と表示されます。ライセンスを要求しないジョブは、そのまま通過します。

ユーザーが引き続き sbatch と入力できるようにするには、投入ノードで、ラッパーを指すエイリアスを設定します。たとえば /etc/profile.d/openlm.sh に次の行を追加します。

alias sbatch='/usr/local/bin/ol-sbatch'

実際の sbatch も PATH 上に残しておいてください。ラッパーがそれを呼び出します。

実際の sbatch を直接実行したユーザーは、LicOps を経由しません。これを防ぐには、ライセンスを要求しているのにコメントに olsid= がないジョブを拒否するチェックを job_submit.lua に追加します。このチェックはコメントの確認だけにとどめてください。job_submit.lua はコントローラーのスケジューリングループ内で実行されるため、そこから LicOps を呼び出してはいけません。

チェックアウトを LicOps 経由でルーティングする​

既定では、アダプターが制御するのはジョブの開始タイミングで、アプリケーションは自身の設定にあるライセンスサーバーからチェックアウトします。アプリケーションが LicOps を経由してチェックアウトし、LicOps が選んだサーバーからライセンスを取得するようにするには、コントローラーのインストールに --lb-endpoint を追加します。

sudo ./slurm/install-slurm-adapters.sh --settings hpc-adapter.conf --role controller \
--lb-endpoint 30001@<licops-host>

インストーラーは ol-taskprolog を Slurm の TaskProlog として追加し、作成する設定ファイルに OL_LB_ENDPOINT を設定します。/etc/openlm/hpc-adapter.conf がすでに存在する場合、インストーラーはそのファイルを変更しないため、OL_LB_ENDPOINT="30001@<licops-host>" を自分で追加してください。

Slurm は TaskProlog を計算ノード上ですべてのタスクに対して実行します。ol-sbatch を使わずに投入されたジョブも対象になるため、この変更はノード全体に及びます。インストーラーは計算ノードには何も変更を加えません。/opt/openlm/hpc/slurm/bin/ol-taskprolog と /etc/openlm/hpc-adapter.conf をすべての計算ノードの同じパスにコピーするか、共有ファイルシステム上に配置してください。各ノードでこのスクリプトは、ジョブの LM_LICENSE_FILE の先頭に 30001@<licops-host> を追加し、既存の値はフォールバックとしてその後ろに残します。LicOps にサーバーも選ばせるかどうかを決めるを参照してください。

多くのアプリケーションは、LM_LICENSE_FILE より先に独自の変数を読み取ります。たとえば MATLAB は MLM_LICENSE_FILE を読み取ります。そのような変数が設定されている場合はそちらが優先され、アプリケーションは LicOps を経由せずにチェックアウトします。

動作を確認する​

アダプターをテストするには、投入ノードから次のコマンドを実行します。

ol-sbatch --licenses=matlab:1 --wrap 'sleep 30'
scontrol show job <job-id> | grep -i comment

コメントは olsid=<session-id>;olvendor=MLM;olfeature=MATLAB となります。ジョブの実行中は、GET /api/v1/stats に表示されるプールの reserved の数が、ジョブがチェックアウトするか終了するまで 1 増えます。ジョブが終了すると、元の値に戻ります。

アダプターは、すべてのリクエストを /var/log/openlm/hpc-adapter.log に記録します。許可は投入ノードに、ディスパッチと解放はコントローラーに記録されます。ジョブを追跡するときは、両方を確認してください。

問題が発生した場合​

症状、原因、対処を次の表に示します。

症状原因対処
ライセンスを使うジョブが、投入時にすべて拒否される。LicOps に到達できず OL_FAIL_MODE_ADMIT=closed になっているか、OL_BASE_URL が間違っています。その投入ノードから verify-router.sh を実行します。
OpenLM: admission controller warming up; please resubmit shortly.LicOps が数秒前に再起動し、OpenLM Platform に追いついていません。ジョブを再投入します。
特定のライセンス名だけが常に NoServerAvailable として拒否され、ほかの名前は動作する。その名前がライセンスマップにないか、マップがライセンスより古くなっています。マップを再生成し、定期更新を設定します。
フックがまったく実行されない。slurm.conf が再読み込みされていないか、PrologSlurmctld と EpilogSlurmctld ではなく、ノード側の Prolog と Epilog が使われています。scontrol show config | grep -i slurmctld を確認します。
ジョブのコメントに olsid がない。実際の sbatch で投入されています。ol-sbatch またはそのエイリアスを使います。
ログに許可の行は記録されるが、ディスパッチや解放の行がない。コントローラー側のフックを実行する SlurmUser が、ログディレクトリに書き込めません。/var/log/openlm の所有者を chown で SlurmUser に変更します。フック自体は実行されており、失われたのはログ出力だけです。
投入後にジョブが保留される。ディスパッチ時に LicOps に到達できず、OL_FAIL_MODE_DISPATCH=closed になっています。LicOps を復旧するか、ディスパッチを open に切り替えます。

アダプターはセッション ID をジョブのコメントに保存します。独自の --comment を設定するジョブはこれと競合するため、ライセンスを使うジョブではコメントを使わないでください。

アダプターを削除する​

sudo ./slurm/uninstall-slurm-adapters.sh --dry-run
sudo ./slurm/uninstall-slurm-adapters.sh

アンインストーラーは、インストーラーが残した記録 /etc/openlm/hpc-adapter.install を読み取り、そのインストールで行われた変更だけを正確に元に戻します。ラッパーと、インストーラーが追加したフックの行だけを削除し、その後 scontrol reconfigure を実行します。設定ファイルとログも削除するには、--purge を追加します。

ドキュメントチームは、大規模言語モデルを使ってこのページを下書きすることがあります。公開前に、テクニカルライターがすべてのページをレビューし、製品と照らし合わせて検証します。最終的な判断は人間が行います。