KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

SLURMで/scratchの利用を促す方法検討

登録日 :2026/02/14 15:46
カテゴリ :SLURM

Lusterの/scratch環境があるが、これをうまく利用できていない。
SLURMを用いて当該環境を活用する方法を模索する。

FLUENTに/scratchを自動的に用いる方法があるとよかったのだが、どうもそのような機能ははなさそう。
FLUENTはカレントディレクトリにデータを保存するため、/scratchのパスにcdして実行すれば良い。

SLURMで可能なこととして
Prologで自動的に、/scrtach/userfolder/jobidを作成し
TaskPrologで、環境変数 SRCRATCHにこのパスを格納しておく、
Epilogで、最後に/scratchを削除することで、自動的に掃除する

ユーザは、自分のランスクリプトに$SCRATCHを利用する設定を入れることで、$SCRATCHを活用することができるという仕組みである。

1. Prologで/scratch作成

Prolog(root権限)で/scratch 自動作成
root権限で、userのパーミッションへの切り替えも行う

# /etc/slurm/prolog.sh (root権限でディレクトリ作成)
#!/bin/bash
mkdir -p /scratch/${SLURM_JOB_USER}_${SLURM_JOB_ID}
chown ${SLURM_JOB_USER}:${SLURM_JOB_USER} /scratch/${SLURM_JOB_USER}_${SLURM_JOB_ID}
chmod 700 /scratch/${SLURM_JOB_USER}_${SLURM_JOB_ID}

2. TaskProlog

Prologで作成した/scratch領域を、ユーザの環境変数$SCRATCHにセットする

# /etc/slurm/task_prolog.sh (ユーザ環境でexport)
#!/bin/bash
echo "export SCRATCH=/scratch/${SLURM_JOB_USER}_${SLURM_JOB_ID}"
echo "export TMPDIR=/scratch/${SLURM_JOB_USER}_${SLURM_JOB_ID}"

これにより、

cd $SCRATCH

で、/scratch/***の環境を即時利用可能となる

3. ランスクリプトで/scratchを使う設定を入れる

$SCRATCHを利用するかどうかは、利用者のランスクリプトで選択可能。
$SCRATCHを利用する場合の設定の記述方法

スクラッチにインプットデータをコピーして、CDでWORKDIRも変える
計算を実行後、計算結果をSUBMITディレクトリに戻す。

#!/bin/bash
#SBATCH --job-name=fluent_scratch
#SBATCH --ntasks=32
#SBATCH --cpus-per-task=1
#SBATCH --time=02:00:00

# 1. scratchに移動(ここが重要!)
cd "$SCRATCH" || { echo "SCRATCH not found"; exit 1; }

# 2. 入力ファイルをsubmitディレクトリからscratchへコピー
cp "$SLURM_SUBMIT_DIR"/my_case.cas.h5 "$SCRATCH"/
cp "$SLURM_SUBMIT_DIR"/my_case.jou "$SCRATCH"/

# 3. Fluent実行(scratch上で)
module load ansys
fluent 3ddp -t $SLURM_NTASKS -cnf=hosts.$SLURM_JOB_ID -g -i my_case.jou

# 4. 結果をsubmitディレクトリへコピー戻し
cp *.cas.h5 *.dat *.log "$SLURM_SUBMIT_DIR"/

echo "Completed. Results in $SLURM_SUBMIT_DIR"

journalファイルの記載例

; 絶対パス不要(cd $SCRATCH済み)
(file/read-case "my_case.cas.h5")
(file/read-mesh "my_case.msh.h5")

; ソルバー実行
/solve/iterate 1000

; 結果書き出し(scratch上)
(file/write-case-data "my_case-1000.cas.h5")
(file/write-data "my_case-1000.dat")
(quit)

TMPDIR=$SCRATCHもexportされている場合、Fluentの内部一時ファイル(メッシュ変換など)も自動でscratchへ。

3. Epilogで後処理

Epilog機能を使って、計算終了後の/scratchを削除する

#!/bin/bash
SCR=/scratch/${SLURM_JOB_USER}_${SLURM_JOB_ID}
if [ -d "$SCR" ]; then
    rm -rf "$SCR"
fi
exit 0