---
title: Slurm
description: OpenLM Slurm アダプターをインストールし、ライセンスを使うジョブがキューに入る前に OpenLM Platform から LicOps のシートを取得できるようにします。
product: OpenLM Platform
---

ライセンスを使うジョブがキューに入る前に 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 を設定する](https://www.openlm.com/documentation/ja/cloud/deployment-operations/licops/configuration)の説明どおりに 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 側は何も変更しません。次のコマンドを実行します。

```bash
./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 に実際に存在するプールから生成してください。

```bash
./make-license-map.sh --router http://<licops-host>:8100
```

```text
# 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` になります）。この名前に一致するプールはありません。ユーザーが投入に使うすべての名前について、マップにエントリが必要です。

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

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

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

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

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

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

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

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

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

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

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

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

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

:::warning[両方のロールをインストールする]

コントローラーのロールだけをインストールすると、投入ノードに `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/`）にコピーし、更新スクリプトをタイマーで実行します。

```bash
# /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` の一番最後に次の行を追加し、更新されたマップがその上にあるマップより優先されるようにします。

```bash
[ -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` と普段使っているオプションでジョブを投入します。

```bash
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` に次の行を追加します。

```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` を追加します。

```bash
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 にサーバーも選ばせるかどうかを決める](https://www.openlm.com/documentation/ja/cloud/deployment-operations/licops/integrations/index#licops-にサーバーも選ばせるかを決める)を参照してください。

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

## 動作を確認する

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

```bash
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` を設定するジョブはこれと競合するため、ライセンスを使うジョブではコメントを使わないでください。

## アダプターを削除する

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

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