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