#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にも残らない。
1

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