#author("2026-04-04T16:35:40+00:00","default:sysosa","sysosa") #author("2026-04-04T17:34:26+00:00","default:sysosa","sysosa") slurmでcryoSPARCを運用する場合. &color(darkorange){cluster_info.json};と&color(darkorchid){cluster_script.sh};は下記コマンドで取得できます. #code(nonumber){{ cryosparcm cluster example slurm }} cryoSPARC v5.0.4の場合ね ***&color(darkorange){cluster_info.json}; [#lae79ece] 中身はこんな感じ #code(nonumber){{ { "send_cmd_tpl": "ssh loginnode {{ command } }", "qsub_cmd_tpl": "sbatch {{ script_path_abs } }", "qstat_cmd_tpl": "squeue -j {{ cluster_job_id } }", "qdel_cmd_tpl": "scancel {{ cluster_job_id } }", "qinfo_cmd_tpl": "sinfo", "cache_path": "/path/to/local/SSD/on/cluster/nodes", "cache_reserve_mb": null, "cache_quota_mb": null, "name": "slurmcluster", "title": "", "worker_bin_path": "/path/to/cryosparc_worker/bin/cryosparcw" } }} &size(10){&color(red){***Pukiwikiの表記のため一部表記を変えてます. 「} }」となってますが、間のスペースは実際にはないです***};}; 以前のバージョンで合った「qstat_code_cmd_tpl」が無くなってますね 代わりに「cache_reserve_mb」と「cache_quota_mb」が追加されたみたい cache_reserve_mb:「cache_path」で指定されたストレージを全部使うのではなく、使わずに空き容量として残しておくサイズ。単位はMBで 100000 とか(10GB) cache_quota_mb:cacheをどれくらい使うか。4TBのSSDで2TBまで使わせるかとか。cryoSAPRCにログインするユーザ毎の制限ではなく、cryoSPARCを稼働しているユーザへの制限です。まぁnullでいいかなぁ 中身はそれぞれの環境に合わせて調整しますが、調整例としては #code(nonumber){{ { "send_cmd_tpl": "{{ command } }", "qsub_cmd_tpl": "sbatch {{ script_path_abs } }", "qstat_cmd_tpl": "squeue -j {{ cluster_job_id } }", "qdel_cmd_tpl": "scancel {{ cluster_job_id } }", "qinfo_cmd_tpl": "sinfo", "cache_path": "/scratch/cs", "cache_reserve_mb": null, "cache_quota_mb": null, "name": "slurmcluster", "title": "", "worker_bin_path": "/home/cryosparc/cryosparc_worker/bin/cryosparcw" } }} titleはcryoSPARCのweb画面出てくる名称ですな。付けても付けなくとも。 ***&color(darkorchid){cluster_script.sh}; [#uc13e0c9] 中身はこんな感じ #code(nonumber){{ #!/usr/bin/env bash #### CryoSPARC cluster submission script template for SLURM ## 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) ## ## A simple SLURM submission script: #SBATCH --chdir={{ job_dir_abs } } #SBATCH --export=NONE #SBATCH --job-name cryosparc_{{ project_uid } }_{{ job_uid } } #SBATCH --cpus-per-task={{ num_cpu } } #SBATCH --gres=gpu:{{ num_gpu } } #SBATCH --mem={{ ram_gb } }G #SBATCH --comment="created by {{ cryosparc_username } }" {{ run_cmd } } }} &size(10){&color(red){***Pukiwikiの表記のため一部表記を変えてます. 「} }」となってますが、間のスペースは実際にはないです***};}; 主に変更する箇所としては、「--mem」の部分。cryoSPARCがジョブに使うメモリーサイズを勝手に決めてくれるのだが、場合によってはジョブに割り当てたメモリーサイズが小さくて落ちる。 なので 「#SBATCH --mem={{ (ram_gb|float * (&color(orange){''ram_gb_multiplier''};|default(1))|float)|int }}G」 と変数&color(orange){''ram_gb_multiplier''};を付けます。 この値はcryoSPARCのweb画面で規定値を1、そして実行時には変更できるようになるので便利。 不要な部分を削って、下記のような&color(darkorchid){cluster_script.sh}; でもいいかな #code(nonumber){{ #!/usr/bin/env bash #SBATCH --job-name cs{{ project_uid } }{{ job_uid } } #SBATCH --nodes=1 # -N 仕様ノード数。1台 #SBATCH --ntasks=1 # -n task数。単純にプロセスの数 #SBATCH --cpus-per-task={{ num_cpu } } # -c 1つのtaskに含まれるcore数. ハイブリッドmpiで言う所のthreads #SBATCH --gres=gpu:{{ num_gpu } } #SBATCH --partition=workq #SBATCH --mem={{ (ram_gb|float * (ram_gb_multiplier|default(1))|float)|int } }G # メモリ量を可変にするため #SBATCH --output={{ job_log_path_abs } } #SBATCH --error={{ job_log_path_abs } } #SBATCH --comment="created by {{ cryosparc_username } }" # slurmでAccount管理機能が付いていればこれが記録されます {{ run_cmd } } }} って感じで slurmでAccount機能が有効ならジョブの名称(Patch Motion Correction, Blob Picker, Topaz, Ab-Initio Reconstructionとか) も記録させたいかなぁ. でも項目がないので無理っぽい ジョブ管理システムでは何か変ですが、特定のノードで計算させたい場合。&size(10){cryoSPARCのweb画面で sbatch のコマンド入力ができないので予め作る必要がある}; #code(nonumber){{ #SBATCH --nodelist=gpu01 }} を加える ***登録 [#r78ad386] 作った&color(darkorange){cluster_info.json};と&color(darkorchid){cluster_script.sh};は #code(nonumber){{ cryosparcm cluster connect }} で登録される。 目下登録済みは #code(nonumber){{ cryosparcm cli "get_scheduler_lanes()" (v5) cryosparcm cli "api.resources.find_lanes()" }} で確認出来て、削除するには #code(nonumber){{ cryosparcm cli "remove_scheduler_lane('pbscluster')" (v5) cryosparcm cli "api.resources.remove_cluster('pbscluster')" }} で行う ***ログインユーザ毎でslurmのリソース制限を課すには [#l730e285] cryoSPARCは1つのunixアカウントでweb、データベース、そしてジョブの実行を行ってます。 そのためcryoSAPRC内に登録された(メールアドレスでログインする)アカウントに応じてのジョブ制約が課せない。 例えは userA さんは同時に3つのジョブを流してもいい。userB さんは倍の同時6つまでジョブを流していいとか。こうしないと特定のユーザのみのジョブが走ってしまって火種になる. これは slurm の「#SBATCH --account=userA」という感じでジョブはslurm側に登録されたuserAのAccount情報に従うとさせます。 なのでcryoSPARCにユーザ登録をする際にメールアドレスの他に &color(magenta){username}; が unixアカウントと連携させる必要がある #code(nonumber){{ (v4) cryosparcm createuser --email saber@fgo.jp --password saber --username saber --firstname Artoria --lastname Pendragon --role user (v5) cryosparcm user create --email saber@fgo.jp --password saber --username saber --firstname Artoria --lastname Pendragon --role user [更新] cryosparcm user update --email saber@fgo.jp --password saber --username userA }} 更新時は email と password が一致すれば、更新されます。 っで、肝心の &color(darkorchid){cluster_script.sh}; は下記のようにします #code(nonumber){{ #!/usr/bin/env bash #SBATCH --job-name cs{{ project_uid } }{{ job_uid } } #SBATCH --nodes=1 # -N 仕様ノード数。1台 #SBATCH --ntasks=1 # -n task数。単純にプロセスの数 #SBATCH --cpus-per-task={{ num_cpu } } # -c 1つのtaskに含まれるcore数. ハイブリッドmpiで言う所のthreads #SBATCH --gres=gpu:{{ num_gpu } } #SBATCH --partition=workq #SBATCH --mem={{ (ram_gb|float * (ram_gb_multiplier|default(1))|float)|int } }G # メモリ量を可変にするため #SBATCH --output={{ job_log_path_abs } } #SBATCH --error={{ job_log_path_abs } } #SBATCH --comment="created by {{ cryosparc_username } }" # slurmでAccount管理機能が付いていればこれが記録されます #SBATCH --account=sc-{{ cryosparc_username } } {{ run_cmd } } }} 末尾に「#SBATCH --account={{ &color(magenta){cryosparc_username}; }}」を追加しました。これで差し替えます。 次に、slurm側ですが、[[https://web.chaperone.jp/w/?slurm/accounting#e8884f2a]] のようにログインユーザ向けのAccountを作って、そこにunixユーザを参加させます。 っでAccount名が、&color(magenta){cryosparc_username};と同じであることが重要 cryoSPARCはunixアカウント cryosparc で動ているとして、そこに利用者 unixアカウント saber がいるとします。 #code(nonumber){{ sacctmgr -i add account cs-saber # slurmのAccount ac-server を用意して sacctmgr -i add user saber Account=cs-saber # ac-server に unixアカウントの saber を登録 sacctmgr -i add user saber Account=cs-saber # ac-server に unixアカウントの saber を登録(or 登録しなくてもいい) sacctmgr -i modify account cs-saber \ set MaxJobs=3 \ GrpTRES=gres/gpu=3 \ MaxTRESPerJob=gres/gpu=3 sacctmgr -i add user cryosparc Account=cs-saber # unixアカウント cryosparc が、cs-saber も使えるようにします }} 確認は「sacctmgr show association format=Cluster,Account,User,MaxJobs,GrpTRES,MaxTRESPerJob,Fairshare」で行えます #code(nonumber){{ [root@slurm ~]# sacctmgr show association format=Cluster,Account,User,MaxJobs,GrpTRES,MaxTRESPerJob,Fairshare Cluster Account User MaxJobs GrpTRES MaxTRES Share ---------- ---------- ---------- ------- ------------- ------------- --------- cluster root 1 cluster root root 1 cluster cs-saber 3 gres/gpu=3 gres/gpu=3 1 cluster cs-saber cryosparc 3 gres/gpu=3 1 cluster cs-saber saber 3 gres/gpu=3 1 [root@slurm ~]# }} あとはcryoSPARCのログインユーザ分、sc-saber のようなのを作り続ける.. これで必要以上のリソースを要求した場合はエラーにならずにpendingになります。ユーザでキャンセルしようにも相手はunixアカウントの cryosparc なので一般ユーザはscancelを発行でいない。 そのためにはluaスクリプトで回避させる #code(lua,nonumber){{ function slurm_job_submit(job_desc, part_list, submit_uid) local gres = job_desc.tres_per_node or "" -- gpu数を取得 local gpu = string.match(gres, "gpu:(%d+)") if gpu ~= nil then gpu = tonumber(gpu) -- accountごとの制限 if job_desc.account == "cs-saber" and gpu > 3 then slurm.log_user("Error: GPUは最大3枚までです (account=cs-saber)") return slurm.ERROR end end return slurm.SUCCESS end function slurm_job_modify(job_desc, job_rec, part_list, modify_uid) return slurm.SUCCESS end }} このスクリプトを「/opt/slurm/etc/job_submit.lua」に置いたらな「/opt/slurm/etc/slurm.conf」に下記を追加して「slurmctld」を再起動させる #code(nonumber){{ JobSubmitPlugins=lua }} ただ、このluaを使えるようにコンパイルしている必要がある。 っで実際に本来は無理な4枚GPUのジョブを走らせると #code(nonumber){{ sbatch: error: Error: GPUは最大3枚までです (account=cs-saber) sbatch: error: Batch job submission failed: Unspecified error }} と表示されて終わる。squeueにも残らない。