メモです。下記は実際に試していないです. 出来ないかもしれません
特に Clusters形式 で cryoSPARC を運用していると同じ「常に」特定の計算ノードでジョブが動くわけではなので
計算ノードが違うと /scratch に初めから再度データ転送が始まって、計算の完了に時間を要する.
ネットワークが太かったり高速なストレージを持っていれば気にしないのかもしれませんが、まぁー転送時間はなるべく小さくしたい..
ではどうするべきか?
安直にBeeONDを考えた。でもこれって他のノードの/scratchを合わせられるが、他のノードの計算リソースも使うなら有利だけど(relionなら)、
cryoSPARCは単一ノードでしか計算しないから微妙. 加えてネットワークを跨ぐので律速はネットワーク。
ローカルのNVMeのみ使うならそっちのほうが断然いい。
ならば、そのプロジェクトで計算が行われたノードを調べ、そのノードにある/scratchを丸ごとrsyncで持ってくる。転送が終わってからcryoSPARCのジョブを開始させると。
これは単純に「cluster_script.sh」の「{{ run_cmd }}」の後、末尾に実行ノードを別ファイルに記載するコードを追加
例えばこんな感じに
echo "{{ project_uid } } `hostname -s`" >> $HOME/cryoSPARC/project-worker-mapと「project_uid hostname」のリストを作る
っで実際に使う際、例えば P100 の直近のworkerは
「grep P100 $HOME/cryoSPARC/project-worker-map | tail -n 1 | awk '{print $2}'」
で得られる.
これも「cluster_script.shにて「{{ run_cmd }}」の前に記載する
なので全体像は
#!/usr/bin/env bash
#SBATCH --chdir={{ job_dir_abs } }
#SBATCH --export=NONE
#SBATCH --job-name cs_{{ project_uid } }{{ job_uid } }
#SBATCH --cpus-per-task={{ num_cpu } }
#SBATCH --gres=gpu:{{ num_gpu } }
#SBATCH --partition=workq
#SBATCH --mem={{ (ram_gb|float * (ram_gb_multiplier|default(1))|float)|int } }G
#SBATCH --comment="created by {{ cryosparc_username } }"
#SBATCH --account={{ cryosparc_username } }
#SBATCH --output={{ job_log_path_abs } }
#SBATCH --error={{ job_log_path_abs } }
# /scratchデータのコピー
worker=$(grep {{ project_uid } } $HOME/cryoSPARC/project-worker-map | tail -n 1 | awk '{print $2}')
if [ -n "$work" ]; then
if ping -c 1 "$work" > /dev/null 2>&1; then
rsync -aH \
--delete \
--whole-file \
--numeric-ids \
$work:/scratch/instance_cryosparc:39001/ $work:/scratch/instance_cryosparc:39001/
fi
fi
# cryoSPARC job実行
{{ run_cmd } }
# 実行場所の記録
grep {{ project_uid } } $HOME/cryoSPARC/project-worker-map | tail -n 1 | awk '{print $2}'
* このwebページの記載書式により「} }」となってますが、実際には「}」は繋がって表記されます
まったくもって試していない。なんかネットワーク依存なのであんまり時短にはらないかも.