大規模なcluster環境でcryoSPARCを動かすことになった.
cryoSPARCはdatabaseとweb機能を持つmasterと実際の計算を行うworkerの2つから構成される。
masterのweb画面操作でjobが発行されるとworkerが起動して計算を始める(この場合はjob管理システム経由で).
計算が終わるまで適時masterとworkerは互いに通信を行うみたい。なのでworkerが稼働中ならmasterは停止できない。
masterは一度実行するとデーモンのようにバックグランドで稼働するので、cluster環境のインターラクティヴジョブとして動かすのもありなのだが、
インターラクティヴモードは大抵時間制限があって、制限時間内にworkerのジョブが終わるかは分からない...
なのでコンテナ技術でmasterを覆って、batchジョブとして流してみる. singularity/apptainerのinstance機構を活用してみる
まずはmasterを singularity image file にしてみます。
作ったsingularity の定義ファイルは下記になります. config.shファイルとcryoSPARCのデータベース部分とlog部分を外だしとして「$HOME/cs-data」に集まるようにしてます。 singularity内の/mntが$HOME/cs-dataに繋げる魂胆です
下記を「cs.def」として保存します ここでは事前に取得したmasterのソースを /Public/em/ に置いてます
BootStrap: docker
From: rockylinux:9.3
%files
/Public/em/cs_m_453.tar.gz /usr/src/cs_m.tar.gz <--- /Public/emにある「cs_m_453.tar.gz」をコンテナの/usr/src/cs_m.tar.gzにコピー
%environment
export PATH="/apps/cs/cryosparc_master/bin:$PATH"
%post
LICENSE="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx " <--- cryoSPARCのライセンスコード
export TZ="Asia/Tokyo"
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
dnf install git which iputils -y
mkdir /apps/cs -p
cd /apps/cs && tar xf /usr/src/cs_m.tar.gz && rm -f /usr/src/cs_m.tar.gz <-- /apps/csに展開してソースを削除
cd cryosparc_master
rm -rf /apps/cs/cryosparc_master/run && mkdir /mnt/run
ln -s /mnt/run /apps/cs/cryosparc_master/run <-- bindする場所にrunフォルダを作って、csのログファイルにする
rm -rf /apps/cs/cryosparc_master/config.sh && ln -s /mnt/config.sh /apps/cs/cryosparc_master/config.sh
./install.sh --license $LICENSE --dbpath /mnt/database --port 39000 --yes <-- cs のインストール. bindする場所にdatabaseフォルダを作る
echo "export CRYOSPARC_FORCE_HOSTNAME=true" >> ./config.sh
/apps/cs/cryosparc_master/bin/cryosparcm stop
%runscript
cryosparcm start
っでmasterのsingularity image fileを作ります. cluster環境の計算ノードには39000-39009/tcpの穴が必要ですが...大抵の所は計算ノードにfwを掛けていないと思う clusters運用のための設定ファイル cryoSPARC/Singularity/script
(sifを作成)
mkdir $HOME/cs-data
cp /Public/em/{cluster_info.json,cluster_script.sh} $HOME/cs-data <-- cluster向けの設定ファイルを置いておきます
apptainer build --bind $HOME/cs-data:/mnt cs.sif cs.def <-- sifを作ります. bind で ホスト側:コンテナ側 で接続させている. コンテナの/mnt が $HOME/cs-data になる
次にcryoSPARCのデータベースを作成して、ユーザアカウントの作成とclusterの情報を組み込みます。
apptainer shell --bind $HOME/cs-data:/mnt cs.sif
Apptainer>
Apptainer> ls -l /apps/cs/cryosparc_master/
:
lrwxrwxrwx. 1 illya illya 8 Oct 14 20:22 run -> /mnt/run <-- ログの置き場所がコンテナの/mnt/runで、それはホスト側の$HOME/cs-data/runとなる
:
Apptainer> cryosparcm start <-- cryoSPARC 起動. /mntにdatabaseがなければ新規にdatabaseを作ります. ホスト側の39000を叩けばwebが表示される
:
Apptainer> ls -lF /mnt/
-rw-r--r--. 1 illya illya 361 Oct 14 20:17 cluster_info.json
-rw-r--r--. 1 illya illya 561 Oct 14 20:17 cluster_script.sh
-rw-rw-r--. 1 illya illya 657 Oct 14 20:23 config.sh
drwxr-xr-x. 4 illya illya 12288 Oct 14 20:28 database/ <--「cryosparcm start」で初めて作られる
drwxrwxr-x. 3 illya illya 4096 Oct 14 20:28 run/
Apptainer>
(cryoSPARCのアカウント作成)
Apptainer> cryosparcm createuser --email saber@chaperone.jp --password artoria --username SABER --firstname Artoria --lastname Pendragon
Creating user SABER with email: ssaber@chaperone.jp and name: Artoria Pendragon
Successfully created user account.
Apptainer> cryosparcm listusers
| Name | Email | Admin | ID |
----------------------------------------------------------------------------------------------------------
| SABER | ssaber@chaperone.jp | True | 670bc2e97a3dea322e43ce97 |
Apptainer>
Apptainer> cd /mnt
Apptainer> cryosparcm cluster connect
Successfully added cluster lane pbscluster
:
(停止)
Apptainer> cryosparcm stop
Apptainer> exit
workerはSingularity を使わず、ホームディレクトリ内に設置します。「cluster_info.json」のPATHに合わせます。
理由はsshdの稼働がworkerに必要でSingularity では難しかったので.
[illya@slurm ~]$ tar xf /Public/em/cs_w_453.tar.gz
[illya@slurm ~]$ cd cryosparc_worker/
[illya@slurm cryosparc_worker]$ ./install.sh --license xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
これで完了
こうして作ったcs.sifをログインノードに持って行って、batchジョブで動くようにします. ファイル名は「cs.sh」とかで
#!/bin/bash
#SBATCH -J cryoSPARC_instance
#SBATCH -p workq
#SBATCH -n 1
#SBATCH -o %x.%j.out
#SBATCH -e %x.%j.err
#SBATCH -t 1:00:00
cs=$HOME/cs-data
config=$cs/config.sh
sif=$HOME/cs.sif
rm -rf /tmp/cryosparc-supervisor-*
rm -rf /tmp/mongodb-*
# cryoSPARCのCRYOSPARC_MASTER_HOSTNAMEをsubmitされたノードにします
sed -i "s/export CRYOSPARC_MASTER_HOSTNAME=\(.*\)/export CRYOSPARC_MASTER_HOSTNAME=\"$SLURMD_NODENAME\"/" $config
apptainer instance start --bind $cs:/mnt $sif cs-instance
apptainer run instance://cs-instance
while true ; do sleep 1 ; done
っでsbatchに流してみる
[illya@slurm ~]$ sbatch cs.sh
[illya@slurm ~]$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
47 workq cryoSPAR illya R 2:26 1 n1
[illya@slurm ~]$
ここで n1 でジョブ(cryoSPARC master)が動いているのが分かる.
ローカルのPCから計算ノードで動いているcryoSPARCのwebアクセスには ssh トンネルを使います
MobaXtermを立ち上げて、上部メニューの「Tunneling」ボタンを押下して「MobaSSHTunnel」を開きます
画面下部の「New SSH tunnel」ボタンを押下します
ここではログインノードを踏み台にしてcryoSPARC masterが動いている n1 の 39000 と ローカルPCの 39000 を繋げます。
左側の「Forwarded port」はローカルPC側なので「39000」として、右側のSSHサーバはログインノードの「slurm」ユーザ名、portは22を指定して、右上の「Remote server」には計算ノードの「n1」ポートは「39000」を指定します
「save」後にssh tunnelの一覧が表示されます(無課金なら3つまで登録可能です)
「Name」欄には区別する文言を入れて、その右側にあるstartのアイコンをクリックするとログインノードへの接続が開始されます。パスワード接続でなく公開鍵方式なら右側にある「鍵」のマークを押下して、持っている秘密鍵を指定します。
接続が行われたら、ローカルPCのブラウザを立ち上げて「localhost:39000」でn1で実行中のcryoSPARCのweb画面が表示されます。
っでここにアクセスして、ログインしてジョブの「instance」を見ると下記のようになっている.
これでジョブが流せそう.
やみくもにJOBIDを停止すると危ないかも。「cryosarcm stop」を経ないで落とすと(scancel)、計算ノードに「/tmp/cryosparc-*.sock」らが残る.
計算ノードにログインして「apptainer exec instance://cs-instance cryosparcm stop」と行ってcryoSPARCを停止させる
[illya@n1 ~]$ apptainer instance list
INSTANCE NAME PID IP IMAGE
cs-instance 33496 /home/illya/cs.sif
[illya@n1 ~]$
[illya@n1 ~]$ apptainer exec instance://cs-instance cryosparcm stop
CryoSPARC is running.
Stopping cryoSPARC
app_api: stopped
app: stopped
database: stopped
command_core: stopped
command_vis: stopped
command_rtp: stopped
Shut down
[illya@n1 ~]$ apptainer instance stop cs-instance
[illya@n1 ~]$ ls -l /tmp/cryosparc* /tmp/mongodb*
ls: cannot access '/tmp/cryosparc*': No such file or directory
ls: cannot access '/tmp/mongodb*': No such file or directory
[illya@n1 ~]$ exit
その後に job を停止させる
[illya@slurm ~]$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
47 workq cryoSPAR illya R 14:54 1 n1
[illya@slurm ~]$
[illya@slurm ~]$
[illya@slurm ~]$ scancel 47
これで完了かな
なぜインスタンスを使うのか。cryoSPARC masterを実行するとバックグランドジョブが発生します。
インスタンス経由にするとqsubが切れれば、そのバックグラウンドジョブも全て落ちます。(/tmp/にsockファイルが残ってしまうが..)
単にqsubで「apptainer run --bind $HOME/cs-data:/mnt cs.sif」でも動きますが、qsubが切れた際、そのバックグランドジョブが残ってしまう。(あとでSEに小言を言われるかも..)