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

ライセンスを使うジョブがキューに入る前に LSF が LicOps にシートを要求するようにするには、OpenLM LSF アダプターをインストールします。ユーザーがジョブのリソース要求に `openlm[...]` ブロックを追加すれば、あとは LSF が処理します。LicOps が拒否したジョブはキューに入りません。

:::warning[まずお使いのクラスターでテストする]

LSF のサポートはアーリーアクセスです。アダプターを本番で利用する前に、本番以外のキューで[動作を確認する](#動作を確認する)の確認を実施してください。

:::

## アダプターが LSF に組み込まれる仕組み

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

| リクエスト | アダプター | 実行場所 | タイミング |
| --- | --- | --- | --- |
| 許可（Admit） | `esub.openlm`（LSF の `esub`） | 各投入ホスト | ジョブの投入時、ジョブが `mbatchd` に届く前 |
| ディスパッチ（Dispatch） | `ol-pre-exec`（キューの `PRE_EXEC` として実行） | ジョブの最初の実行ホスト | ジョブの開始時 |
| 解放（Release） | `ol-post-exec`（キューの `POST_EXEC` として実行） | ジョブの最初の実行ホスト | ジョブの終了時（終了の仕方は問わない） |

`esub.openlm` はセッション ID をジョブの環境変数 `OL_SESSION_ID` に保存し、キューのフックはそこからセッション ID を読み取ります。LSF の構成によっては `POST_EXEC` の前にこの変数が削除されるため、`ol-pre-exec` はセッション ID を実行ホスト上の小さなファイルにも書き込み、`ol-post-exec` は変数がない場合にそのファイルを使います。

Slurm と異なり、LSF ではライセンスマップは不要です。ベンダーとフィーチャーは、ジョブ自体のリソース要求で渡されます。

## はじめに

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

- [OpenLM LicOps を設定する](https://www.openlm.com/documentation/ja/cloud/deployment-operations/licops/configuration)の説明どおりに LicOps が稼働しており、プールを認識していること。
- LSF 管理ホスト、実行ホスト、すべての投入ホストから、ポート `8100` で LicOps に到達できること。
- 管理ホスト、実行ホスト、すべての投入ホストに、`curl` と `jq` がインストールされていること。
- 管理ホストで `lsb.queues` を編集して `badmin reconfig` を実行でき、各投入ホストで `$LSF_SERVERDIR` に書き込めること。
- OpenLM から提供される LSF 用の OpenLM HPC アダプターパッケージと統合キットがあること。

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

アダプターをインストールするには、次の手順を実行します。

1. LSF 管理ホスト上でアダプターパッケージを展開します。

2. 管理ホストから、統合キットの `verify-router.sh` で LicOps を確認します。

   ```bash
   ./lsf/verify-router.sh --base-url http://<licops-host>:8100/api/v1/admission-controller
   ```

3. 管理ホスト上で、ディスパッチと解放のフックをキューに組み込みます。

   ```bash
   sudo ./lsf/install-lsf-adapters.sh --role master --queue normal \
     --base-url http://<licops-host>:8100/api/v1/admission-controller
   ```

   インストーラーはアダプターを `/opt/openlm/hpc` にコピーし、`/etc/openlm/hpc-adapter.conf` を作成し、`lsb.queues` をバックアップしてから、指定したキューに `PRE_EXEC` と `POST_EXEC` を追加し、`badmin reconfig` を実行します。`PRE_EXEC` や `POST_EXEC` がすでに別のスクリプトを指している場合、インストーラーはそれを上書きしません。1 回の実行で組み込めるキューは 1 つだけです。ライセンスを使うジョブを実行するキューごとに、`--queue` を変えて再度実行してください。

4. すべての投入ホストに `esub` をインストールします。

   ```bash
   sudo ./lsf/install-lsf-adapters.sh --role submit \
     --base-url http://<licops-host>:8100/api/v1/admission-controller
   ```

   管理ホストから投入ホストへ一度にインストールするには、`--role master` のコマンドに `--submit-nodes host1,host2` を追加します。この場合、それらのホストにパスワードなしの root SSH で接続できる必要があります。

5. すべてのホストで `/etc/openlm/hpc-adapter.conf` を開き、次の値を設定します。インストーラーは初回にテンプレートからこのファイルを作成して `OL_BASE_URL` を入力し、以降は上書きしません。

   | 設定 | 値 |
   | --- | --- |
   | `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_CLUSTER_NAME` | 任意。LicOps が LSF クラスターの名前を知る唯一の方法です。 |
   | `OL_STATE_DIR` | 任意。実行ホスト上で `PRE_EXEC` と `POST_EXEC` の両方からアクセスできるディレクトリ。[問題が発生した場合](#問題が発生した場合)を参照してください。 |

どちらのコマンドも、まず `--dry-run` を付けて実行すると、行われるすべての変更を事前に確認できます。どちらも何度実行しても問題ありません。

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

投入ホストに `esub` がないと、ジョブは LicOps に問い合わせずにキューに入ります。キューのフックがないと、ジョブは許可されてもディスパッチも解放もされないため、そのシートはセッションのタイムアウトまで保持されたままになります。

:::

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

ユーザーは `-a openlm` で `esub` を選択し、`openlm[...]` ブロックでプールを指定します。

```bash
bsub -a openlm -R "openlm[vendor=MLM:feature=MATLAB:count=1]" ./my-simulation.sh
```

`vendor` と `feature` は、大文字と小文字の区別も含めてプールと完全に一致している必要があります。`GET /api/v1/stats` からコピーしてください。フィーチャー名に含まれるスペースは、`feature=Acrobat%20Pro` のように `%20` と書きます。`count` はシート数で、既定値は `1` です。同じブロックを、ジョブスクリプトの先頭の `#BSUB -R` の行として書くこともできます。

許可の確認を省略できないようにするには、ユーザーが `-a openlm` を指定することに頼らず、`lsf.conf` で `openlm` を必須の `esub` として構成します。`openlm[...]` ブロックのないジョブは、そのまま通過します。

各ジョブが要求できるのは、1 つのベンダーとフィーチャーです。2 つの異なる製品を必要とするジョブは、1 回の投入で両方を要求することはできません。

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

既定では、アダプターが制御するのはジョブの開始タイミングで、アプリケーションは自身の設定にあるライセンスサーバーからチェックアウトします。アプリケーションが LicOps を経由してチェックアウトし、LicOps が選んだサーバーからライセンスを取得するようにするには、両方のインストールコマンドに `--lb-endpoint 30001@<licops-host>` を追加します。`/etc/openlm/hpc-adapter.conf` がすでに存在する場合、インストーラーはそのファイルを変更しないため、各投入ホストで `OL_LB_ENDPOINT="30001@<licops-host>"` を自分で追加してください。

これにより、`esub` はジョブの `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
bsub -a openlm -R "openlm[vendor=MLM:feature=MATLAB:count=1]" sleep 30
tail -f /var/log/openlm/hpc-adapter.log
```

ログには、投入時に許可、ジョブの開始時にディスパッチ、終了時に解放が記録されます。ジョブが許可済みまたは実行中の間は、`GET /api/v1/stats` に表示されるプールの `reserved` の数が 1 多くなります。

また、解放がセッションのタイムアウト後ではなく、`POST_EXEC` の実行時に行われることも確認してください。ジョブが終了するとすぐに `reserved` の数が減るはずです。

## 問題が発生した場合

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

| 症状 | 原因 | 対処 |
| --- | --- | --- |
| 何も許可されない。 | `$LSF_SERVERDIR` に `esub.openlm` がないか、`-a openlm` を付けずにジョブが投入されています。 | 投入ホストのロールをインストールするか、`esub` を必須にします。 |
| `ol-common.sh not found` | アダプターのフォルダーが別々の場所に移動されたか、`$LSF_SERVERDIR` の `esub` がシンボリックリンクに置き換えられています。 | `/opt/openlm/hpc` 配下のインストール時の構成を維持し、インストーラーが書き込んだ 1 行の `esub` ラッパーをそのまま残します。 |
| フックがまったく実行されない。 | `badmin reconfig` が実行されていないか、フックのないキューでジョブが実行されています。 | `bqueues -l <queue>` で `PRE_EXEC` と `POST_EXEC` を確認します。 |
| シートがセッションのタイムアウト後にしか戻らない。 | `POST_EXEC` で `OL_SESSION_ID` が失われ、代わりのファイルも読み取れませんでした。 | 実行ホスト上で `PRE_EXEC` と `POST_EXEC` の両方からアクセスできるディレクトリを `OL_STATE_DIR` に設定します。 |
| ライセンスを使うジョブが、投入時にすべて拒否される。 | LicOps に到達できず `OL_FAIL_MODE_ADMIT=closed` になっているか、`OL_BASE_URL` が間違っています。 | その投入ホストから `verify-router.sh` を実行します。 |
| 開始後にジョブがキューに戻される。 | ディスパッチ時に LicOps に到達できず、`OL_FAIL_MODE_DISPATCH=closed` になっています。 | LicOps を復旧するか、ディスパッチを `open` に切り替えます。 |

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

削除内容をプレビューしてからアダプターを削除するには、次のコマンドを実行します。

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

アンインストーラーは、インストーラーが残した記録 `/etc/openlm/hpc-adapter.install` を読み取り、そのインストールで追加されたものだけを削除します。
