slurmでcryoSPARCを運用する場合.
cluster_info.jsonとcluster_script.shは下記コマンドで取得できます.
cryosparcm cluster example slurmcryoSPARC v5.0.4の場合ね
中身はこんな感じ
{
"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"
}***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でいいかなぁ
中身はそれぞれの環境に合わせて調整しますが、調整例としては
{
"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画面出てくる名称ですな。付けても付けなくとも。
中身はこんな感じ
#!/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 } }
***Pukiwikiの表記のため一部表記を変えてます. 「} }」となってますが、間のスペースは実際にはないです***
主に変更する箇所としては、「--mem」の部分。cryoSPARCがジョブに使うメモリーサイズを勝手に決めてくれるのだが、場合によってはジョブに割り当てたメモリーサイズが小さくて落ちる。
なので
「#SBATCH --mem={{ (ram_gb|float * (ram_gb_multiplier|default(1))|float)|int }}G」
と変数ram_gb_multiplierを付けます。
この値はcryoSPARCのweb画面で規定値を1、そして実行時には変更できるようになるので便利。
不要な部分を削って、下記のようなcluster_script.sh でもいいかな
#!/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とか) も記録させたいかなぁ. でも項目がないので無理っぽい
ジョブ管理システムでは何か変ですが、特定のノードで計算させたい場合。cryoSPARCのweb画面で sbatch のコマンド入力ができないので予め作る必要がある
#SBATCH --nodelist=gpu01を加える
作ったcluster_info.jsonとcluster_script.shは
cryosparcm cluster connectで登録される。
目下登録済みは
cryosparcm cli "get_scheduler_lanes()"
(v5)
cryosparcm cli "api.resources.find_lanes()"で確認出来て、削除するには
cryosparcm cli "remove_scheduler_lane('pbscluster')"
(v5)
cryosparcm cli "api.resources.remove_cluster('pbscluster')"で行う
cryoSPARCは1つのunixアカウントでweb、データベース、そしてジョブの実行を行ってます。
そのためcryoSAPRC内に登録された(メールアドレスでログインする)アカウントに応じてのジョブ制約が課せない。
例えは userA さんは同時に3つのジョブを流してもいい。userB さんは倍の同時6つまでジョブを流していいとか。こうしないと特定のユーザのみのジョブが走ってしまって火種になる.
これは slurm の「#SBATCH --account=userA」という感じでジョブはslurm側に登録されたuserAのAccount情報に従うとさせます。
なのでcryoSPARCにユーザ登録をする際にメールアドレスの他に username が unixアカウントと連携させる必要がある
(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 が一致すれば、更新されます。
っで、肝心の cluster_script.sh は下記のようにします
#!/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={{ cryosparc_username }}」を追加しました。これで差し替えます。
次に、slurm側ですが、https://web.chaperone.jp/w/?slurm/accounting#e8884f2a のようにログインユーザ向けのAccountを作って、そこにunixユーザを参加させます。
っでAccount名が、cryosparc_usernameと同じであることが重要
cryoSPARCはunixアカウント cryosparc で動ているとして、そこに利用者 unixアカウント saber がいるとします。
sacctmgr -i add account cs-saber # slurmのAccount ac-server を用意して
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」で行えます
[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スクリプトで回避させる
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」を再起動させる
JobSubmitPlugins=luaただ、このluaを使えるようにコンパイルしている必要がある。
っで実際に本来は無理な4枚GPUのジョブを走らせると
sbatch: error: Error: GPUは最大3枚までです (account=cs-saber)
sbatch: error: Batch job submission failed: Unspecified errorと表示されて終わる。squeueにも残らない。