13

バッチ スクリプトを使用して多数のジョブ ステップを起動しようとしています。異なるステップは完全に異なるプログラムである可能性があり、それぞれに正確に 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と (たとえば、クラスター内のノードあたりの CPU の数よりも大きな数に増やすことによって)、スクリプトが期待どおりに機能しなくなり、戻り値が返されます。

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

1つのノードのみを使用し続けます(つまり、私の場合は48個のCPUで、以前と同じくらい速くジョブステップを通過し、その後、他のノードのすべてのプロセスが強制終了されます)。

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

複数のノードで確実に使用できるように、バッチ スクリプトを実装するにはどうすればよいですか?

4

1 に答える 1

12

それを見つけた!命名法と 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 -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 つのノードでジョブを実行することを指定します。

于 2014-06-09T17:44:25.423 に答える