1

私はコンピューティングクラスターでいくつかの実験を行っています。私のアルゴリズムには 2 つのステップがあります。最初のものは、2番目のステップで使用されるいくつかのファイルに出力を書き込みます。依存関係は 1 から n であり、1 つの step2 プログラムが n step1 プログラムの出力を必要とすることを意味します。クラスター リソースを消費せず、ヘッド ノードをビジー状態に保つ方法もわかりません。私の現在の解決策は次のとおりです。

送信スクリプト (これはヘッド ノードで実行されます)

for different params, p:
    run step 1 with p

sleep some time based on the an estimate of how much step 1 takes

for different params, q:
    run step 2 with q

ステップ 2 アルゴリズム (これは計算ノードで実行されます)

while files are not ready:
    sleep a few minutes
do the step 2

これを行うより良い方法はありますか?

4

1 に答える 1

4

SGE は、そのためのジョブの依存関係と配列ジョブの両方を提供します。を使用して、フェーズ 1 の計算を配列ジョブとしてサブミットし、フェーズ 2 の計算を依存ジョブとしてサブミットできますqsub -hold_jid <phase 1 job ID|name> ...。これにより、フェーズ 1 のすべての計算が完了するまでフェーズ 2 ジョブが待機し、その後解放されてディスパッチされます。フェーズ 1 の計算は、クラスターに十分なスロットがある限り、並行して実行されます。

サブミット スクリプトでは、ホールドをジョブ名で指定し、各アレイ ジョブに固有の名前を付けると便利な場合があります。例えば

mkdir experiment_1; cd experiment_1
qsub -N phase1_001 -t 1-100 ./phase1
qsub -hold_jid phase1_001 -N phase2_001 ./phase2 q1
cd ..
mkdir experiment_2; cd experiment_2
qsub -N phase1_002 -t 1-42 ./phase1 parameter_file
qsub -hold_jid phase1_002 -N phase2_002 ./phase2 q2
cd ..

phase1これにより、スクリプトの 100 回の実行が array job としてスケジュールされphase1_001、別の 42 回の実行がarray job としてスケジュールされphase1_002ます。クラスターに 142 個のスロットがある場合、142 個すべての実行が並行して実行されます。次に、ジョブ内のすべてのタスクが終了した後にphase2スクリプトの 1 回の実行がディスパッチされ、phase1_001ジョブ内のすべてのタスクが終了した後に 1 回の実行がディスパッチされますphase1_002。繰り返しますが、それらは並行して実行できます。

配列 job 内の各$SGE_TASK_IDタスクは、 job 内のタスクに対して 1 から 100 まで、 job 内phase1_001のタスクに対して 1 から 42までの範囲の固有の値を受け取りphase1_002ます。そこからpパラメータを計算できます。

于 2012-05-12T14:00:36.387 に答える