#author("2024-10-14T12:17:08+00:00","default:sysosa","sysosa")
#author("2024-10-14T15:58:55+00:00","default:sysosa","sysosa")
大規模なcluster環境でcryoSPARCを動かすことになった.

cryoSPARCはdatabaseとweb機能を持つ&color(magenta){master};と実際の計算を行う&color(orange){worker};の2つから構成される。

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

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

なのでコンテナ技術で&color(magenta){master};を覆って、batchジョブとして流してみる. &size(10){singularity/apptainerのinstance機構を活用してみる};

***&color(magenta){master};作成 [#jd571ed7]

まずは&color(magenta){master};を singularity image file にしてみます。
作ったsingularity の定義ファイルは下記になります.  config.shファイルとcryoSPARCのデータベース部分とlog部分を外だしとして「$HOME/cs-data」に集まるようにしてます。 &size(10){singularity内の/mntが$HOME/cs-dataに繋げる魂胆です};
下記を「cs.def」として保存します    &size(10){ここでは事前に取得したmasterのソースを /Public/em/ に置いてます};
#code(nonumber){{
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
}}
っで&color(magenta){master};のsingularity image fileを作ります.  &size(10){cluster環境の計算ノードには39000-39009/tcpの穴が必要ですが...大抵の所は計算ノードにfwを掛けていないと思う}; clusters運用のための設定ファイル [[cryoSPARC/Singularity/script]]

#code(nonumber){{
(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の情報を組み込みます。
#code(nonumber){{

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
}}

***&color(orange){worker};の準備 [#ifffc9a3]
&color(orange){worker};はSingularity を使わず、ホームディレクトリ内に設置します。「cluster_info.json」のPATHに合わせます。
理由はsshdの稼働が&color(orange){worker};に必要でSingularity では難しかったので.
#code(nonumber){{
[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ファイルの作成 [#p147a0d3]

こうして作ったcs.sifをログインノードに持って行って、batchジョブで動くようにします. ファイル名は「cs.sh」とかで

#code(nonumber){{
#!/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に流してみる
#code(nonumber){{
[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画面へアクセス. [#r82d2731]
ローカルのPCから計算ノードで動いているcryoSPARCのwebアクセスには ssh トンネルを使います

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

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

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

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




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

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


***停止方法 [#u3af52ab]

やみくもにJOBIDを停止すると危ないかも。「cryosarcm stop」を経ないで落とすと(scancel)、計算ノードに「/tmp/cryosparc-*.sock」らが残る.

計算ノードにログインして「apptainer exec instance://cs-instance cryosparcm stop」と行ってcryoSPARCを停止させる
#code(nonumber){{
[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 を停止させる
#code(nonumber){{
[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
}}

これで完了かな



***メモ [#fd5544ec]

なぜインスタンスを使うのか。cryoSPARC masterを実行するとバックグランドジョブが発生します。
インスタンス経由にするとqsubが切れれば、そのバックグラウンドジョブも全て落ちます。(/tmp/にsockファイルが残ってしまうが..)
単にqsubで「apptainer run --bind $HOME/cs-data:/mnt cs.sif」でも動きますが、qsubが切れた際、そのバックグランドジョブが残ってしまう。(あとでSEに小言を言われるかも..)
1

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS