OpenPBSの場合ジョブの発行に合わせてテンポラリーなディレクトリを用意できる OpenPBS/PBS_TMPDIR
これを計算ノードのSSDなスクラッチディレクトリに当てることが可能で、relionの「Copy particles to scratch directory:」に適用できる.

利点としては ジョブが完了すると 当てられたディレクトリもOpenPBS側で削除してくれる.
relion自身もジョブが完了すればスクラッチディレクトリを削除してくれるが、途中でこけたジョブの場合はスクラッチにデータを残したままで手動で消す必要がある.

っでslurmでも同じようなことをするには?

slurmの機能に prolog と epilog がある.
文字通りジョブの開始前の作業とジョブの完了後の作業を定義できる.

ごくごく簡単な例から

[illya@slurm ~]$ vi ok.sh
#!/bin/bash
echo "ok"
 
[illya@slurm ~]$ chmod +x ok.sh
[illya@slurm ~]$ ./ok.sh
ok
[illya@slurm ~]$

と「ok」と返すだけのスクリプト. これで「srun」でジョブを流してみる

[illya@slurm ~]$ srun --prolog ok.sh --pty bash
ok
  [illya@n1 ~]$
[illya@n1 ~]$ exit
exit
[illya@slurm ~]$

と実行時に「ok.sh」が実行される. ただ文字位置が多少ずれる. そうゆうものなのだろう
っで次にこの「ok.sh」をちょいと変更して

[illya@slurm ~]$ cat ok.sh
#!/bin/bash
echo "ok"
hostname
pwd
id
[illya@slurm ~]$

として再度srunを投げてみる

[illya@slurm ~]$ cd test
[illya@slurm test]$ srun --prolog ~/ok.sh --pty bash
ok
  slurm
       /home/illya/test
                       uid=1000(illya) gid=1000(illya) groups=1000(illya) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
                                                                                                                                       [illya@n1 test]$
[illya@n1 test]$
exit
[illya@slurm test]$

となる. 「ok.sh」の実行現場はジョブを発行するサイトで行われ、計算ノード先(n1)ではない. 場所はジョブ発行ノードと同じ場所の「/home/illya/test」であることがわかる.

逆にepilogではどうなるとなると

[illya@slurm test]$ srun --epilog ~/ok.sh --pty bash
[illya@n1 test]$
exit
ok
  slurm
       /home/illya/test
                       uid=1000(illya) gid=1000(illya) groups=1000(illya) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
                                                                                                                                       [illya@slurm test]$
[illya@slurm test]$

とこちらも実行現場はジョブを発行したサイトで行われ計算ノードではないごようす.

task-prologとtask-epilog

task-prologとtask-epilogはジョブが発行された先、つまりは計算ノードで評価される
試しに

[illya@slurm ~]$ cat ok.sh
#!/bin/bash
echo "ok" 
hostname  >  /tmp/a
pwd       >> /tmp/a
id        >> /tmp/a
[illya@slurm ~]$

としてジョブを投げてみる

[illya@slurm test]$ srun --task-prolog ~/ok.sh --pty bash
[illya@n1 test]$ exit
exit
[illya@slurm test]$

と「ok」と返事はくれないのですが、計算ノードのn1の/tmp/aにはok.shのそれ以後のコマンドが実行される

[illya@slurm test]$ ssh n1 cat /tmp/a
illya@n1's password:
n1
/home/illya/test
uid=1000(illya) gid=1000(illya) groups=1000(illya) context=system_u:system_r:unconfined_service_t:s0
[illya@slurm test]$

となる. 計算ノードのn1にて処理がされているみたい

ってな訳でジョブ発行時にscratchディレクトリに専用のフォルダを用意して、それを環境変数にして、ジョブが完了すればそのフォルダを消すようにするには

[illya@slurm ~]$ cat mkscr.sh
#!/bin/bash
if [ ! -d /scratch/${USER}_${SLURM_JOB_ID} ]; then
  mkdir /scratch/${USER}_${SLURM_JOB_ID}
  echo export SCRPATH=/scratch/${USER}_${SLURM_JOB_ID}
fi
 
[illya@slurm ~]$ cat delscr.sh
#!/bin/bash
if [ -d /scratch/${USER}_${SLURM_JOB_ID} ]; then
  /bin/rm -rf /scratch/${USER}_${SLURM_JOB_ID}
fi
[illya@slurm ~]$

とファイルを用意してとすれば環境変数 SCRPATH にテンポラリな書き込み領域が得られて、ジョブの終了とともに消える

[illya@slurm test]$ srun --task-prolog ~/mkscr.sh --task-epilog ~/delscr.sh --pty bash

SBATCHの書式の中で

前段は srun でのお話. インターラクティヴモードでのお話.

っでsbatchでは?
sbatchで流すスクリプトにprologとepilogにまつわるものを書き込んでしまえば話しが済みそうな件ですが、システム側で計算ノードにそのジョブ向けの
スクラッチディレクトリ作成とそこへ至る環境変数を提供できるようにしてみる.
ほぼほぼOpenPBS互換のため

実行するprolog/epilogスクリプトは割り当てられた計算ノードで実行されるので、スクリプトは計算ノード間で共有されている必要がある.
簡単には「/home/task_prolog」「/home/task_epilog」とします. /homeが共有されているとして

[root@slurm ~]# cat /home/task_prolog
#!/bin/bash
if [ -d /scratch ]; then
   scr=/scratch/${USER}_${SLURM_JOB_ID}
   mkdir $scr
   echo export SCRPATH=$scr
fi
exit;
[root@slurm ~]#
[root@slurm ~]# cat /home/task_epilog
#!/bin/bash
if [ -d /scratch/${USER}_${SLURM_JOB_ID} ]; then
   /bin/rm -rf /scratch/${USER}_${SLURM_JOB_ID}
fi
exit;
[root@slurm ~]#

この作ったスクリプトを slurm.conf に反映させます

[root@slurm ~]# vi /opt/slurm/etc/slurm.conf
 :
 :
SlurmctldParameters=enable_configless
TaskProlog=/home/task_prolog
TaskEpilog=/home/task_epilog
 
[root@slurm ~]# 
[root@slurm ~]# scontrol reconfig

っでテスト
実行ファイルはこんなもの

[illya@slurm ~]$ cat a.sh
#!/bin/bash
hostname
echo $SCRPATH
ls -ld $SCRPATH
[illya@slurm ~]$

っで流してみる

[illya@slurm ~]$ sbatch a.sh
Submitted batch job 87
[illya@slurm ~]$ cat slurm-87.out
n1
/scratch/illya_87
drwxr-xr-x. 2 illya illya 6 Sep 10 05:00 /scratch/illya_87
[illya@slurm ~]$

っでその後計算ノードの/scratchを確認するが、当然ながら何もない. 一応成功かな

relionにおいては「Compute」タグの「Copy particles to scratch directory:」で先の「SCRPATH」を「$SCRPATH」として使う
環境変数としてはRELION_SCRATCH_DIRに割り当てる
2023y09m12d_024717617.png

最新の60件
2024-02-23 2024-02-22 2024-02-21 2024-02-20 2024-02-19 2024-02-18 2024-02-17 2024-02-16 2024-02-13 2024-02-12 2024-02-09 2024-02-04 2024-02-03 2024-01-31 2024-01-30 2024-01-29 2024-01-28 2024-01-22 2024-01-16 2024-01-15 2024-01-13 2024-01-12 2024-01-09 2024-01-08 2024-01-07 2024-01-03 2023-12-22 2023-12-17 2023-12-16 2023-12-11 2023-12-09 2023-12-06 2023-11-30 2023-11-27 2023-11-21 2023-11-19 2023-11-18 2023-11-14 2023-11-10 2023-11-09 2023-11-05 2023-11-03 2023-10-30 2023-10-26

edit


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-09-12 (火) 02:52:11