Slurmスケジューラを使用して2つ以上のノードでGNU Parallelを実行する

Slurmスケジューラを使用して2つ以上のノードでGNU Parallelを実行する

Slurm Workload Managerを使用して、HPCでGNU Parallelを使用してスタンドアロンプ​​ロセスを展開しようとしています。簡単に言えば、これはデータ分析のための設定です。

スクリプト#1: myCommands

./myscript --input infile.txt --setting 1 --output out1
./myscript --input infile.txt --setting 2 --output out2
./myscript --input infile.txt --setting 3 --output out3
./myscript --input infile.txt --setting 4 --output out4

スクリプト#2:run.sh

#SBATCH --time=00:02:00
#SBATCH --nodes=2
#SBATCH --cpus-per-task=2

cat myCommands | parallel -j 4

これは機能しますが、1つのノードのみを使用します。このノードの2つのコアは4つのスレッドに分割され、並列要求に応じて4つの作業用のスペースを確保します。これは望ましくありません。

nodefile私の検索によると、これを行うにはaとaが必要ですが、オンラインでシステムをsshloginfile使用する例はありません。SlurmPBS

スクリプトで(1)2つのノードを使用し、(2)コアをスレッドに分割しないようにするにはどうすればよいですか?

答え1

srun次のラウンドロビン方式でこれを行うことができます。

jobs=({1..4})
nodes=($(scontrol show hostname $SLURM_NODELIST))
for ((n = 0; n < ${#jobs[@]}; n++)); do
  index=$(expr $n % ${#nodes[@]})
  srun --nodes=1 --ntasks=1 --nodelist=${nodes[$index]} \
       --exclusive ./myscript --input infile.txt \
       --setting $n --output out$n &
done
wait

--cpus-per-task=2与えられると思いますsrun。ご質問がございましたらお知らせください。今朝は並列処理作業をしていましたが、この問題を直接解決する方法がわかりません。また、scancelジョブにGNU並列ジョブが含まれている場合srun

答え2

私は現在、GNU Parallelを使ってデフォルトでタスクをリモートクラスタに「バッチ」しています。

以下はスクリプト名を削除してみました。

parallel --colsep '\t' \
         --shuf \
         --jobs=25% \
         --delay=1s \
         ssh -q ${remote} \
         sbatch --chdir="${remote_dir}" \
         --job-name="my-job-name-{1}-{2}-{4}-{5}_{6}" \
         --output="${OUTPUT_PREFIX}/joblogs/%x.out" \
         --error="${OUTPUT_PREFIX}/joblogs/%x.err" \
         my-job.sh \
         "${OUTPUT_PREFIX}/" "{1}" "{2}" "{4}" "{3}" "{5}" "{6}" \
         :::: "${COMPARISONS}" \
         :::: "${REPORTS}" \
         :::: "${METHODS}"

${COMPARISONS}変数と変数${REPORTS}は、${METHODS}タブで区切られたファイルに渡されますsbatch。デフォルトでは、これは引数の並列交差積を使用してさまざまなバリアントを送信し、ジョブ制御は並列ではなくSLURMに委ねられます。

my-job.sh次のようになります。

#!/usr/bin/env bash

#SBATCH -N 1
#SBATCH -n 1
#SBATCH -c 4
#SBATCH -t 0-01:00:00

exec ~/bin/job.bin $@

キューがそれをサポートしている場合は、ノードを手動で指定する必要はありません(他の理由がない限り)。

これが役に立つことを願っています。私は実際にスケジューラを圧倒しないように作業速度を遅くする方法を探しています。 (ジョブが完了し始めるまで、キュー内のQOSに十分なジョブを直接送信しました。ほとんどのジョブは完了するのに数秒かかります。)10分)。 Parallelには、--delay何百ものジョブを送信するのに役立つオプションがあります。

sbatch最初に起動したスクリプトで並列処理を使用し、SLURMで作業を開始するには、@barrymooの答えをよりよく適用し、ノードリストを削除する方が良いかもしれません(再度、サブセットのみを使用する特別な要件がない限り) )。ノードのリスト)あなたが使用できるノード、ほとんどのHPCはそのキューのノード間で公平に設計されています。 )

関連情報