Slurmを使用して複数のノードでスクリプトを実行するには?

Slurmを使用して複数のノードでスクリプトを実行するには?

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 $i1から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

関連情報