はじめに
ジョブスケジューラを利用してHPCクラスタ上でCAEアプリを動作させる際、CPUやメモリ等のH/W関連の計算リソースを指定するだけでなくソルバが消費するライセンス数も管理できます。
何度か実装したことはあるものの、毎回その手順を忘れてしまうので備忘録的にまとめようと思い記事にすることとしました。ここで紹介する機能はPBS ProであってもOpenPBSであっても利用可能な機能となっています。
システム構成図
今回は下図のようなシステム構成を想定しています。CAEアプリケーションのライセンスサーバはPBS管理ノードと分けて図示しています。しかし、これらの機能を管理ノードにて兼用しているケースも多々あるように思いますので、そのような場合、以下手順を適宜読み替えてご参照ください。また管理ノード/計算ノードはNFS等にて共有ディレクトリを持つ想定で記載します。

PBSにおける設定事項
ここからはPBS設定ファイルに記述する項目を3Stepでまとめます。以降CAEアプリの消費ライセンス数を格納する変数(=リソース名)をcae_licとして説明します。
- リソースを定義すること
今回、残ライセンス数を管理する変数cae_licをPBSに定義します。root権限で実行します。
### PBSで整数のリソースを設定する場合、typeはintではなくlongとして与えること
> qmgr -c "create resource cae_lic type=long"
- 定義したリソースをPBSが管理するように設定する
リソース定義しただけではPBSがリソースを管理してくれないため下記のように /var/spool/pbs/sched_priv/sched_config に作成したリソースを追記します。
### 編集前 (初期値)
resources: "ncpus, mem, arch, host, vnode, aoe, eoe"
### 編集後
resources: "ncpus, mem, arch, host, vnode, aoe, eoe, cae_lic"
- 残ライセンス数を取得するためのスクリプトを登録する
実際には次の段階で作成しますが先に、ライセンスサーバと通信し、残ライセンス数を取得するスクリプト check_num_of_cae_lic.sh をPBS設定ファイル内に登録します。追記するファイルは項番2と同様です(当該ファイルの末尾に書き方のサンプルなども記載されています)。
### スクリプト名や設置するディレクトリは任意 (フルパスで)
### 記述位置はserver_dyn_resのサンプルが記載されている位置に定義するとよい
server_dyn_res: cae_lic !/opt/script/check_num_of_cae_lic.sh
PBSに対して設定する事項は以上です。それでは次に、先ほど定義だけを済ませたcheck_num_of_cae_lic.shを作成したいと思います。
ライセンス数の取得スクリプト作成
CAEアプリによって異なりますが、「本来使用できるライセンス数の合計」と「現時点で利用中のライセンス数」を確認するコマンドがほぼ必ず存在します。この2つの値を利用することで、ユーザが利用可能なライセンス数を算出し、ジョブの投入可否を確認します。
分かりにくいかもしれませんので、こちら(参照[1])の具体例を参考に説明します。この例では、ライセンスサーバは合計10のライセンスを保有しており、そのうち1ライセンスが現在ユーザによって利用されていることを示しています。
> lmutil lmstat -a -c (ポート番号)@(ライセンスサーバ名またはIPアドレス)
Users of rvd_arm: (Total of 10 licenses issued; Total of 1 license in use)
そのため、残りの9ライセンス分はユーザが消費できるということであり、check_num_of_cae_lic.shの中では、その計算が行えるように上記のハイライト箇所から必要なデータをgrepなどを駆使して取り出せばよいということになります。諸々が厳密ではありませんが、参照[1] で扱った場合のライセンス取得スクリプトは下記のような記述になります。
#!/bin/bash
### 合計ライセンス数を下記コマンドにて取得する
total_license=$(lmutil lmstat -a -c 27000@License-server | grep -oE 'Total of [0-9]+ licenses issued' | grep -oE '[0-9]+')
### 同様に利用中のライセンス数を取得する
using_license=$(lmutil lmstat -a -c 27000@License-server | grep -oE 'Total of [0-9]+ license[s]? in use' | grep -oE '[0-9]+')
### 取得した2つの値から利用可能なライセンス数を取得して出力する。出力は必須です
remaining_license=$((total_license - using_license))
### 今回の例では10-1で9と出力される想定
echo $remaining_license
上記のようなスクリプトを作成/動作確認まで済ませたら、最後にsched_config内で指定したディレクトリ(今回は/opt/script/)にスクリプトを設置して完了です。実行権限を付与しておくことも忘れずに。
設定自体もひと通り完了しましたので、PBSのサービスを再起動するなどの処理を済ませた上で、最後にジョブ投入を行い動作確認を実施します。
ジョブスクリプトでのリソース指定例
例として、生成AIに出力させたサンプルジョブスクリプトに、今回定義したリソースを追記+微修正を加えたものが下記になります。
#!/bin/bash
#PBS -N CAE_lic_test # ジョブ名の指定
#PBS -l nodes=1:ncpus=16 # 使用するノード数とプロセッサ数の指定
#PBS -l walltime=03:00:00 # 実行時間の上限を指定
#PBS -l cae_lic=1 # 定義したリソースはここ。CAEアプリで消費するライセンス数を入力する
cd $PBS_O_WORKDIR # ワークディレクトリに移動
mpirun -hostfile $PBS_NODEFILE -np 16 /your/cae/app/hogehoge # 任意のCAEアプリの実行ファイルを指定する。
おわりに
やっていること自体は難しくないのですが、知識が無いと実装方法が分からないものの1つだなと思うところもあり、まとめさせていただきました。同様のことがSlurmでも実装できるハズなので、今後こちらも記事にできればと思います。
StarCCM/CONVERGE/Nastran/Abaqusなど、各CAEアプリは基本的に有償なのでライセンス数を引いてくる通信の動作検証が個人レベルだと難しいですね・・・
参考情報
[1] DTSインサイト 使用中のFlexlmライセンス数を集計するにはどのようにすればよいですか
以上
コメントを残す