複数のノードを使用してSLURMスクリプトの実行、1タスクでジョブステップを起動します。

StackOverflow https://stackoverflow.com//questions/24056961

  •  26-12-2019
  •  | 
  •  

質問

バッチスクリプトを使用して多数のジョブステップを起動しようとしています。さまざまなステップは、完全に異なるプログラムであり、それぞれ1つのCPUが必要です。まず、--multi-progへのsrun引数を使用してこれを実行しました。残念ながら、このように私の仕事に割り当てられたすべてのCPUを使用するとき、パフォーマンスは大量に低下します。実行時間はほぼそのシリアル化された値に増加します。下位の上記によって、私はこれを少し改善することができました。私はこの問題に関してオンラインで何かを見つけることができなかったので、私は私が使用しているクラスタの構成問題となると思います。

だから私は別の道を進んでみました。次のスクリプトを実装しました(sbatch my_script.slurm経由で起動):

#!/bin/bash
#SBATCH -o $HOME/slurm/slurm_out/%j.%N.out
#SBATCH --error=$HOME/slurm/slurm_out/%j.%N.err_out
#SBATCH --get-user-env
#SBATCH -J test
#SBATCH -D $HOME/slurm
#SBATCH --export=NONE
#SBATCH --ntasks=48

NR_PROCS=$(($SLURM_NTASKS))
for PROC in $(seq 0 $(($NR_PROCS-1)));
do
    #My call looks like this:
    #srun --exclusive -n1 bash $PROJECT/call_shells/call_"$PROC".sh &
    srun --exclusive -n1 hostname &
    pids[${PROC}]=$!    #Save PID of this background process
done
for pid in ${pids[*]};
do
    wait ${pid} #Wait on all PIDs, this returns 0 if ANY process fails
done
.

私は知っており、--exclusive引数は私の場合には実際には必要ありません。呼び出されたシェルスクリプトには、異なるバイナリとその引数が含まれています。私のスクリプトの残りの部分は、すべてのプロセスがwaitを終了したという事実に依存しています。私はそれを最小限の実施例にするために呼び出し回線を変更しました。

最初には解決策があるようでした。残念ながら、ジョブ割り当てで使用されるノードの数を増やすと(たとえば、--ntasksを1ノードごとのCPUの数よりも大きい番号に増やすなど)、スクリプトはもう期待どおりに動作しません。

srun: Warning: can't run 1 processes on 2 nodes, setting nnodes to 1
.

と1つのノードだけを使用して(すなわち、Job Stepsが以前のように高速に進むと、他のノード)のすべてのプロセスはその後殺される。

これは予想される行動のようですが、私はそれを本当に理解することはできません。特定の割り当てのすべてのジョブステップが、割り当てに含まれるノードの数に等しい最小数のタスクを含める必要があるのはなぜですか。私は通常、私の割り当てで使用されているノードの数については通常本当に気にしません。

バッチスクリプトを実装する方法を実装できますので、複数のノードで確実に使用できますか?

役に立ちましたか?

解決

それを見つけました!命名法とスラルの多くのコマンドラインオプションは私を混乱させる。溶液は

によって与えられる
#!/bin/bash
#SBATCH -o $HOME/slurm/slurm_out/%j.%N.out
#SBATCH --error=$HOME/slurm/slurm_out/%j.%N.err_out
#SBATCH --get-user-env
#SBATCH -J test
#SBATCH -D $HOME/slurm
#SBATCH --export=NONE
#SBATCH --ntasks=48

NR_PROCS=$(($SLURM_NTASKS))
for PROC in $(seq 0 $(($NR_PROCS-1)));
do
    #My call looks like this:
    #srun --exclusive -N1 -n1 bash $PROJECT/call_shells/call_"$PROC".sh &
    srun --exclusive -N1 -n1 hostname &
    pids[${PROC}]=$!    #Save PID of this background process
done
for pid in ${pids[*]};
do
    wait ${pid} #Wait on all PIDs, this returns 0 if ANY process fails
done
.

これは、単一のタスクのみを組み込んだ1つのノードでジョブを実行することを指定します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top