Slurmを使用して複数のノードで実行したいRコードがあり、パラメータの各反復が1つのノードで実行されます。これは私のSlurmコードです。
#!/bin/bash
#SBATCH -o job-%A_task.out
#SBATCH --job-name=paral_cor
#SBATCH --partition=normal
#SBATCH --time=1-00:00:00
#SBATCH --mem=124G #I want to use 124Go / node
#SBATCH --cpus-per-task=32 #and 32CPUs / node
#SBATCH --exclude=hpcsmp01
module load gcc/8.1.0 openblas/0.3.3 R
OUTPUT="$HOME"/PROJET_M2/data/$parallel_nodes_test
mkdir -p "$OUTPUT"
echo "Start job :"`date`
Rscript my_scrit.R --subset $i --file $1 > "$OUTPUT"
echo "Stop job :"`date`
パラメータには--subset $i
1からXまでの値があります(Xは私のRコードの入力ファイルによって異なります)。それから、各繰り返しごとにノードでi
スクリプトを実行したいと思います。たとえば--subset 1
-> あるノード、--subset 2
--> 別のノード... --subset X
-> 最後のノードまで
私のクラスタではうまく機能しないので、一連のタスクを使用したくありません。だから私は次のようなbashループを作りたいと思います。
for i in ?
sbatch slurm_code.sh $i
done
パラメータ間のリンクを作成する方法と、ループ内でパラメータを1からXに増やす--subset $i
方法がわかりません。for
答え1
srun
スクリプトからノードを要求するために、forループ内にforループを含めたいと思います。 5つのサブセットがあると仮定すると、次のものを使用できます。
for i in `seq 1 5`; do
srun \
-N1 \
--mem=124G \
--cpus-per-task=32 \
Rscript my_script.R --subset $i --file $1 > "$OUTPUT-$i" &
done
wait
手順も参考に&
してくださいwait
。これにより、これらのプロセスを並列に実行でき、SLURMはforループ内のすべてが完了するのを待ちます。
このパスを選択した場合は、出力ファイルの仕様を並列に作成できることも確認する必要があります。上記では、$OUTPUT
各サブセットごとに異なるファイルを提供するインジケータを変数に追加しました。wait
出力を大きなファイルに再組み立てするには、コマンドの後にいくつかのコードを追加する必要があります。
ジョブに使用するノードの総数を示す--nodes
値をファイルに割り当てたい場合があります。sbatch
srun
別のオプションは、コマンドライン引数を使用し、ファイル内のforループを使用してそれを呼び出すシェルスクリプトにすべての作業コードを含めることですsbatch
。前任者。
for i in `seq 1 5`; do
srun -N1 --mem=124G --cpus-per-task=32 bash runAnalysis.sh --subset $i &
done
wait