大規模なcluster環境でcryoSPARCを動かすことになった.

cryoSPARCはdatabaseとweb機能を持つmasterと実際の計算を行うworkerの2つから構成される。

masterのweb画面操作でjobが発行されるとworkerが起動して計算を始める(この場合はjob管理システム経由で).
計算が終わるまで適時masterworkerは互いに通信を行うみたい。なのでworkerが稼働中ならmasterは停止できない。

masterは一度実行するとデーモンのようにバックグランドで稼働するので、cluster環境のインターラクティヴジョブとして動かすのもありなのだが、
インターラクティヴモードは大抵時間制限があって、制限時間内にworkerのジョブが終わるかは分からない...

なのでコンテナ技術でmasterを覆って、batchジョブとして流してみる. singularity/apptainerのinstance機構を活用してみる

master作成

まずは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の準備

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

これで完了

batchファイルの作成

こうして作った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)が動いているのが分かる.

cryoSPARC web画面へアクセス.

ローカルのPCから計算ノードで動いているcryoSPARCのwebアクセスには ssh トンネルを使います

MobaXtermを立ち上げて、上部メニューの「Tunneling」ボタンを押下して「MobaSSHTunnel」を開きます
画面下部の「New SSH tunnel」ボタンを押下します
2024y10m14d_205721273.png

ここではログインノードを踏み台にしてcryoSPARC masterが動いている n1 の 39000 と ローカルPCの 39000 を繋げます。
左側の「Forwarded port」はローカルPC側なので「39000」として、右側のSSHサーバはログインノードの「slurm」ユーザ名、portは22を指定して、右上の「Remote server」には計算ノードの「n1」ポートは「39000」を指定します
2024y10m14d_205551512.png

「save」後にssh tunnelの一覧が表示されます(無課金なら3つまで登録可能です)
2024y10m14d_210804485.png

「Name」欄には区別する文言を入れて、その右側にあるstartのアイコンをクリックするとログインノードへの接続が開始されます。パスワード接続でなく公開鍵方式なら右側にある「鍵」のマークを押下して、持っている秘密鍵を指定します。
接続が行われたら、ローカルPCのブラウザを立ち上げて「localhost:39000」でn1で実行中のcryoSPARCのweb画面が表示されます。

っでここにアクセスして、ログインしてジョブの「instance」を見ると下記のようになっている.
2024y10m14d_203633639.png

これでジョブが流せそう.

停止方法

やみくもに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に小言を言われるかも..)

最新の60件
2024-12-08 2024-12-05 2024-12-04 2024-11-28 2024-11-23 2024-11-22 2024-11-15 2024-11-14 2024-11-12 2024-11-06 2024-11-05 2024-11-04 2024-11-02 2024-11-01 2024-10-29 2024-10-28 2024-10-27 2024-10-23 2024-10-18 2024-10-17 2024-10-15
  • cryoSPARC/Singularity
2024-10-14 2024-10-13 2024-10-11 2024-10-10 2024-10-09 2024-10-08 2024-10-05 2024-10-04 2024-10-03 2024-10-02 2024-10-01 2024-09-30 2024-09-29 2024-09-28 2024-09-27 2024-09-22 2024-09-20 2024-09-17

edit


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2024-10-15 (火) 00:58:55