#author("2025-06-10T17:45:03+00:00","default:sysosa","sysosa")
#author("2025-10-24T16:51:21+00:00","default:sysosa","sysosa")
Clusters形式

「&color(magenta){Master};」と「&color(orangered){Worker};」を別々の計算機に組み込みます
そしてジョブを実行する際、「Master-Worker」方式ではブラウザから利用する計算ノードを手動で選びますが、
この Cluster 形式ではその選択に ジョブ管理システム を使用します
「&color(magenta){Master};」のweb画面で発行するジョブを ジョブ管理システム 経由で流せます.
ジョブ管理システム で管理されているリソースから 適切に選ばれた 計算ノードが「&color(orangered){Worker};」として働きます.


目下使用できる ジョブ管理システム は
-pbs([[OpenPBS]], [[Torque>TORQUE]]ら)
-[[slurm]]
-gridengine

となっているみたい. ここでは OpenPBS を採用しています.
slurmの場合[[cryoSPARC/sbatch]]
gridengineの場合[[cryoSPARC/sge]]

&color(magenta){master};と&color(orangered){worker};の構築は [[cryoSPARC/Master-Worker]]を参照してください.
***&color(magenta){master};と&color(orangered){worker};の構築 [#tfd71507]

そしてジョブ管理システムの設定で&color(magenta){master};ノードはジョブ発行ノードとしての機能を持たせて、
各&color(orangered){worker};ノードには計算ノードの機能を持たせます。
[[cryoSPARC/Master-Worker]]と同じように構築してください.

次にジョブ管理システム毎の設定シート(&color(darkorange){cluster_info.json};と&color(darkorchid){cluster_script.sh};)を作成します
ジョブ管理システム の枠組みで
&color(magenta){master};ノード は ジョブ発行ノード を担い、
&color(orangered){worker};ノードを 計算ノードを担います.
そのように job管理システム を構築してください.
参照 [[slurm]], [[OpenPBS]]

slurmの場合[[cryoSPARC/sbatch]]
gridengineの場合[[cryoSPARC/sge]]
***テンプレートの作成 [#sa5f7bb8]

***テンプレート作成 [#sa5f7bb8]
ジョブ管理システム毎の設定シート(&color(darkorange){cluster_info.json};と&color(darkorchid){cluster_script.sh};)があってそれを現場に合わせて修正して登録します.

まずはそのテンプレートを取得.

#code(nonumber){{
[saber@cryosparc ~]$ cryosparcm cluster example
[cryosparc@cryosparc ~]$ cryosparcm cluster example
Writing example cluster_info.json and cluster_script.sh to current dir
Unknown cluster type. Supported templates are:
  pbs
  slurm
  gridengine
Any cluster scheduler is supported, but you may have to write your own custom submission script.

[saber@cryosparc ~]$
[cryosparc@cryosparc ~]$
}}



ここでは[[OpenPBS]]を使用するので「pbs」のテンプレートを頂きます。
#code(nonumber){{
[saber@cryosparc ~]$ cryosparcm cluster example pbs
[cryosparc@cryosparc ~]$ cryosparcm cluster example pbs
Writing example cluster_info.json and cluster_script.sh to current dir
[saber@cryosparc ~]$
[cryosparc@cryosparc ~]$
}}
すると、コマンドを実行した場所に設定ファイルのテンプレート「&color(darkorange){cluster_info.json};」と「&color(darkorchid){cluster_script.sh};」が置かれます.




テンプレート&color(darkorange){cluster_info.json};の中身は
&color(red){*};&size(10){ここのpukiwikiの記述ルールの問題から「}}」を「} }」にしています};
テンプレート&color(darkorange){cluster_info.json};の中身は下記の通り.  &color(red){*};&size(10){***ここのpukiwikiの記述ルールの問題から「}}」を「} }」にしています***};
#code(nonumber){{
[saber@cryosparc ~]$ cat cluster_info.json
[cryosparc@cryosparc ~]$ cat cluster_info.json
{
    "name" : "pbscluster",
    "worker_bin_path" : "/path/to/cryosparc_worker/bin/cryosparcw",
    "cache_path" : "/path/to/local/SSD/on/cluster/nodes",
    "send_cmd_tpl" : "ssh loginnode {{ command } }",
    "qsub_cmd_tpl" : "qsub {{ script_path_abs } }",
    "qstat_cmd_tpl" : "qstat -as {{ cluster_job_id } }",
    "qdel_cmd_tpl" : "qdel {{ cluster_job_id } }",
    "qinfo_cmd_tpl" : "qstat -q"
}
[saber@cryosparc ~]$
[cryosparc@cryosparc ~]$
}}
&size(10){以前素材していた「transfer_cmd_tpl」が消えたみたい};
こんな感じ。もう一つの&color(darkorchid){cluster_script.sh};は
&color(red){*};&size(10){ここのpukiwikiの記述ルールの問題から「}}」を「} }」にしています};
もう一つの&color(darkorchid){cluster_script.sh};はこんな感じ.   &color(red){*};&size(10){***ここのpukiwikiの記述ルールの問題から「}}」を「} }」にしています***};
#code(nonumber){{
[saber@cryosparc ~]$ cat cluster_script.sh
[cryosparc@cryosparc ~]$ cat cluster_script.sh
#!/usr/bin/env bash
#### cryoSPARC cluster submission script template for PBS
## Available variables:
## {{ run_cmd } }            - the complete command string to run the job
## {{ num_cpu } }            - the number of CPUs needed
## {{ num_gpu } }            - the number of GPUs needed.
##                            Note: The code will use this many GPUs starting from dev id 0.
##                                  The cluster scheduler has the responsibility
##                                  of setting CUDA_VISIBLE_DEVICES or otherwise enuring that the
##                                  job uses the correct cluster-allocated GPUs.
## {{ ram_gb } }             - the amount of RAM needed in GB
## {{ job_dir_abs } }        - absolute path to the job directory
## {{ project_dir_abs } }    - absolute path to the project dir
## {{ job_log_path_abs } }   - absolute path to the log file for the job
## {{ worker_bin_path } }    - absolute path to the cryosparc worker command
## {{ run_args } }           - arguments to be passed to cryosparcw run
## {{ project_uid } }        - uid of the project
## {{ job_uid } }            - uid of the job
## {{ job_creator } }        - name of the user that created the job (may contain spaces)
## {{ cryosparc_username } } - cryosparc username of the user that created the job (usually an email)
##
## What follows is a simple PBS script:

#PBS -N cryosparc_{{ project_uid } }_{{ job_uid } }
#PBS -l select=1:ncpus={{ num_cpu } }:ngpus={{ num_gpu } }:mem={{ (ram_gb*1000)|int } }mb:gputype=P100
#PBS -o {{ job_log_path_abs } }
#PBS -e {{ job_log_path_abs } }

{{ run_cmd } }

[saber@cryosparc ~]$
[cryosparc@cryosparc ~]$
}}
こんな感じ。これら2つを既設のジョブ管理システムに会うように調整します
これら2つを ジョブ管理システム openPBS に適合するように修正します



***cluster_info.json [#xd24055f]
変更箇所
-name:
cryoSPARCで認識できる名称
-worker_bin_path
&color(orangered){worker};ノードでの「cryosparcw」までの絶対パス
「/home/cryosparc/cryoSPARC/cryosparc_worker/bin/cryosparcw」
-cache_path
&color(orangered){worker};全計算ノードでのssdパス. 「/scratch/cryoSPARC」とか   &size(10){指定なしはブランクとする};
&color(orangered){worker};ノードでの「Fast Local Storage」パス.    &size(10){指定フォルダの所有者は「cryosparc」.  指定なしはブランクとする};
「/scr/cs」
-send_cmd_tpl
&color(magenta){master};ノードが直接qsubを実行できないシーンで、qsubを実行できるノードに接続するコマンド
「{{ command }}」
&color(magenta){master};ノードが直接qsubを実行できないシーンなら、qsubを実行できるノードに接続するコマンドを加える「ssh loginnode {{ command }}」




&color(red){*};&size(10){ここのpukiwikiの記述ルールの問題から「}}」を「} }」にしています};
&color(red){*};&size(10){***ここのpukiwikiの記述ルールの問題から「}}」を「} }」にしています***};
#code(diff,nonumber){{
--- cluster_info.json.orig      2025-06-11 02:05:25.949887726 +0900
+++ cluster_info.json   2025-06-11 02:06:42.558128107 +0900
--- cluster_info.json.orig      2025-10-25 00:14:26.247479928 +0900
+++ cluster_info.json   2025-10-25 01:06:35.750542940 +0900
@@ -1,8 +1,8 @@
 {
     "name" : "pbscluster",
-    "worker_bin_path" : "/path/to/cryosparc_worker/bin/cryosparcw",
-    "cache_path" : "/path/to/local/SSD/on/cluster/nodes",
-    "send_cmd_tpl" : "ssh loginnode {{ command } }",
+    "worker_bin_path" : "/home/saber/cryoSPARC/cryosparc_worker/bin/cryosparcw",
+    "cache_path" : "/scratch/cs",
+    "worker_bin_path" : "/home/cryosparc/cryoSPARC/cryosparc_worker/bin/cryosparcw",
+    "cache_path" : "/scr/cs",
+    "send_cmd_tpl" : "{{ command } }",
     "qsub_cmd_tpl" : "qsub {{ script_path_abs } }",
     "qstat_cmd_tpl" : "qstat -as {{ cluster_job_id } }",
     "qdel_cmd_tpl" : "qdel {{ cluster_job_id } }",
}}



***cluster_script.sh [#q36925f9]
既定では gputypeを指定してますが外します.
あとopenpbsでcgroupによるmemoryリソース管理、gpuリソース管理を入れているならngpusやmemを加えます
cpu数のみ管理ならncpusのみを入れて置きます.
ジョブ監視システムに投入されるスクリプト文です.
openPBSなので「#PBS」とディレクティブが含まれ、要求するリソースが定義されます. 
「cluster_script.sh」はテンプレートでジョブの内容でテンプレート内の変数が上書きされジョブが発行される.

&color(red){*};&size(10){ここのpukiwikiの記述ルールの問題から「}}」を「} }」にしています};
変数には
num_cpu: CPUの数
num_gpu: GPUの数
ram_gb: RAMのサイズ
とかがあります.
これらの値はジョブの設定画面で決められるものや、内部で既に決まっている場合もあります.

計算に必要なCPUの数、GPUの数、RAMのサイズが定まれば、ジョブ管理システムを経由して実行すべき計算ノードが定まり、そこにジョブが投入される次第ですね.

テンプレートの「#PBS -l」欄には「gputype=P100」とあります. これはP100を持つ計算ノード限定にジョブを流すことを意図してまして、まぁー不要. なのでここを削ります.

#code(diff,nonumber){{
--- cluster_script.sh.orig      2025-06-11 02:17:35.136772454 +0900
+++ cluster_script.sh   2025-06-11 02:17:43.902686421 +0900
--- cluster_script.sh.orig      2025-10-25 01:21:29.464702751 +0900
+++ cluster_script.sh   2025-10-25 01:21:38.559632567 +0900
@@ -22,7 +22,7 @@
 ## What follows is a simple PBS script:

 #PBS -N cryosparc_{{ project_uid } }_{{ job_uid } }
-#PBS -l select=1:ncpus={{ num_cpu } }:ngpus={{ num_gpu } }:mem={{ (ram_gb*1000)|int } }mb:gputype=P100
+#PBS -l select=1:ncpus={{ num_cpu } }
+#PBS -l select=1:ncpus={{ num_cpu } }:ngpus={{ num_gpu } }:mem={{ (ram_gb*1000)|int } }mb
 #PBS -o {{ job_log_path_abs } }
 #PBS -e {{ job_log_path_abs } }
}}
&color(red){*};&size(10){以前「for devidx in $(seq 0 16);」の処理が入っていてgpuリソースの簡易管理を行っていましたが取り払われた模様. そこらはjob queuingで管理しましょうなのかも};
&color(red){*};&size(10){***ここのpukiwikiの記述ルールの問題から「}}」を「} }」にしています***};






***カスタマイズしたテンプレートの取り込み [#x8613478]

こうしてカスタマイズした&color(darkorange){cluster_info.json};と&color(darkorchid){cluster_script.sh};をシステムに反映させるには、
こうしてカスタマイズした&color(darkorange){cluster_info.json};と&color(darkorchid){cluster_script.sh};をシステムに登録させる.
これらのファイルが置かれた場所で「cryosparcm cluster connect」を実行します
#code(nonumber){{
[saber@cryosparc ~]$ cryosparcm cluster connect
[cryosparc@cryosparc ~]$ cryosparcm cluster connect
 :
Successfully added cluster lane pbscluster

(確認は下記コマンドで)
[saber@cryosparc ~]$ cryosparcm cli "get_scheduler_lanes()"
[cryosparc@cryosparc ~]$ cryosparcm cli "get_scheduler_lanes()"

(削除はcluster_info.jsonのnameを使います)
[saber@cryosparc ~]$ cryosparcm cluster remove pbscluster
[cryosparc@cryosparc ~]$ cryosparcm cluster remove pbscluster
(あるいは)
[cryosparc@cryosparc ~]$ cryosparcm cli "remove_scheduler_lane('pbscluster')"
}}


***ホスト毎にジョブを流したい [#o64a290a]

これで反映できました。


***複数のqueueを作りたい [#o64a290a]

例えば、特定の計算機にcryoSPARCジョブを流したいとかがある。
&size(10){リソースの最適な分配は ジョブ管理システム で行うが、そうであっても特定の計算機にジョブを流したいことはある};
&size(10){加えて、ジョブ管理システム を経ないでジョブを勝手に流すと他のユーザのジョブに影響が及ぶ. なのであくまでもジョブ管理システムの下で指定する必要がある};

例えば、OpenPBSで特定の計算機を指定するには
#code(nonumber){{
qsub -q workq -l select=1:ncpus=8:host=s -I
 「1ノードでcore数が8のhost名がsなノードをインターラクティヴモードで接続」
もはやジョブ管理システムではなくなっているような気がしますが、ジョブ管理システムでホスト指定でジョブを流すには
「&color(darkorchid){cluster_script.sh};」の「#PBS -l」欄で「host=gpu01」と明記します
#code(diff,nonumber){{
#PBS -l select=1:ncpus={{ num_cpu } }:ngpus={{ num_gpu } }:mem={{ (ram_gb*1000)|int } }mb:host=gpu01
}}
と指定します。    &size(10){「-l」の後にhostが来るとダメみたい. selectが来ないと};
そして「&color(darkorange){cluster_info.json};」でnameを「cs-gpu01」とかにして登録します。

これを模します.

「cluster_info.json」は
gpu02なら
#code(diff,nonumber){{
--- cluster_info.json.pbscluster        2021-04-25 04:07:49.614387651 +0900
+++ cluster_info.json   2021-04-25 04:07:19.611757357 +0900
@@ -1,5 +1,5 @@
 {
-    "name" : "pbscluster",
+    "name" : "run-on-s",
     "worker_bin_path" : "/home/saber/cryoSPARC/cryosparc_worker/bin/cryosparcw",
     "cache_path" : "",
     "send_cmd_tpl" : "{{ command } }",
#PBS -l select=1:ncpus={{ num_cpu } }:ngpus={{ num_gpu } }:mem={{ (ram_gb*1000)|int } }mb:host=gpu02
}}
として、「cluster_script.sh」は下記のようにします.
#code(diff,nonumber){{
--- cluster_script.sh.pbscluster        2021-04-25 03:40:45.286240573 +0900
+++ cluster_script.sh   2021-04-25 03:41:40.361398185 +0900
@@ -22,7 +22,7 @@
 ## What follows is a simple PBS script:
「&color(darkorange){cluster_info.json};」でnameを「cs-gpu02」として登録とかでしょうか.  &color(red){*};&size(10){***ここのpukiwikiの記述ルールの問題から「}}」を「} }」にしています***};
これでホスト指定でジョブ投入が行えます。

 #PBS -N cryosparc_{{ project_uid } }_{{ job_uid } }
-#PBS -l select=1:ncpus={{ num_cpu } }
+#PBS -l select=1:ncpus={{ num_cpu } }:host=s
 #PBS -o {{ job_dir_abs } }
 #PBS -e {{ job_dir_abs } }
&size(10){これなら「master-worker」方式でもよさげですが...};

}}

これを取り込み当たなlane 「run-on-s」が用意されます.
#code(nonumber){{
[saber@cryosparc ~]$ cryosparcm cluster connect
 :
Successfully added cluster lane run-on-s
[saber@cryosparc ~]$
}}

***今登録されているclusterは? [#b7fb242f]
#code(nonumber){{
cryosparcm cli "get_scheduler_lanes()"
}}
にて表示される
っで削除は
#code(nonumber){{
cryosparcm cli "remove_scheduler_lane('em-g1-a01')"
}}
とlaneの名前を入れます


***メモ [#i6ab2782]
cryoSPARCではどのGPUを使うかはスクリプトで決めている.
「nvidia-smi -i $i --query-compute-apps=pid --format=csv,noheader」
この「$i」を0から16まで動かしてエラーではなく値の無いもので計算をさせる.
「&color(red){[Errno 2] No such file or directory: 'qsub': 'qsub'};」と表示されたらそれは&color(magenta){master};でqsubへのPATHが入っていない可能性がある

っが、やっすいGPUカードだとこの「nvidia-smi -i 0 --query-compute-apps=pid --format=csv,noheader」が正しく動かない.
それで対応GPUがないとかでジョブが停止します.

あと使われていないGPUを探すのはいいのだが、2つGPUを使って計算していて、他のジョブ(relion)が来たとして
その使っているGPU-IDを避けてGPU-IDが指定されるか微妙...

そこらは cgroupやHookを使う必要があり、結構面倒. 可能な限り1台で済ませるようなジョブ投入が宜しいかと.


「[Errno 2] No such file or directory: 'qsub': 'qsub'」と表示されたらそれは&color(magenta){master};でqsubへのPATHが入っていない可能性

Clusters形式で自動起動する場合、/etc/profile.d/slurm.sh もしくは /etc/profile.d/pbs.sh を噛んで立ち上がる必要があり.
その際「cryosparc.service」で
#code(nonumber){{
ExecStart=/home/cryosparc/cryosparc_master/bin/cryosparcm start
  ↓
ExecStart=/bin/bash -l /home/cryosparc/cryosparc_master/bin/cryosparcm start
}}
とする. そうしないとsbatchやqsubコマンドが見つからずに落ちる



***メモ clusterでのpatchの当て方 [#x9457434]
master側には
#code(nonumber){{
cryosparcm patch
}}
でいいのだが、worker側にはpatchがあたらない. なので
#code(nonumber){{
cryosparcm patch --download
あるいは
cryosparcm patch --download --force
}}
にてパッチファイルを取得して、
#code(nonumber){{
cd cryosparc_worker/
cp ../cryosparc_master/cryosparc_worker_patch.tar.gz .
bin/cryosparcw patch
}}
で行う

***変数を追加 [#m4be6276]
「cluster_script.sh」に変数を定義してジョブ投入時に適時値を修正できるようにします. これでqsubで確保されるメモリー量を意図的に拡大させることが可能になる.
「cluster_script.sh」を下記のように修正して変数「ram_gb_multiplier」を導入します. これを「cryosparcm cluster connect」で反映させると

「とある系で計算してたらメモリーが足らない」と表示された. でも「設定画面にメモリーの項目がない」とか発生する時があります.

たいていは、cryoSPARCが想定しているメモリー量よりも多くのメモリーが必要なのに、「#PBS -l」に必要量のメモリーが指定されていないために起こる現象ですね.

回避策としては「#PBS -l」にパラメータを設置します. するとcryoSPARC側がそれを察知して「設定画面」にメモリーの係数を項目として表示します. これを調整してジョブを流します.

&color(darkorchid){cluster_script.sh};の例.  ram_gb_multiplier が係数になります.
#code(nonumber){{
#!/usr/bin/env bash
#PBS -N cryosparc_{{ project_uid } }_{{ job_uid } }
#PBS -l select=1:ncpus={{ num_cpu } }:ngpus={{ num_gpu } }:mem={{ (ram_gb|float * (ram_gb_multiplier|default(1))|float)|int } }G
#PBS -o {{ job_log_path_abs } }
#PBS -e {{ job_log_path_abs } }

{{ run_cmd } }
}}
するとcryoSPARCサービスのAdmin->Cluster Configurationが下記のようになります
これで登録すると
cryoSPARCサービスのAdmin->Cluster Configurationが下記のようになります
&ref(2025y06m11d_023041213.png,nolink,80%);
このままでは「No cluster variables have been set.」なので「1」を入力して「set」を押下します。これで何も変更しなければデフォの値で計算が進みます
&ref(2025y06m11d_023740044.png,nolink); --> &ref(2025y06m11d_023746965.png,nolink);

これでジョブを投入する際にLaneから「pbscluster」を選ぶと下記のように「Cluster submittion script variables」が選べて、それを開いて「This job」でこのジョブの実行の際の変数を入れます。2倍で行うなら2と入力します
これでジョブを投入する際にLaneから「pbscluster」を選ぶと下記のように「Cluster submittion script variables」が選べて、それを開いて「This job」でこのジョブの実行の際の係数を入れます。2倍で行うなら2と入力します
&ref(2025y06m11d_024146948.png,nolink); --> &ref(2025y06m11d_024200276.png,nolink);
1

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