2

依存関係のある、いくつかの個別のプログラム実行に分割される計算タスクがあります。私はタスクスケジューラとしてCondor7を使用しています(Vanilla Universeでは、プログラムの制約が私の手の届かないところにあるため、チェックポイントは含まれていません)。したがって、DAGは自然な解決策のように見えます。ただし、一部のプログラムは同じホストで実行する必要があります。コンドルのマニュアルでこれを行う方法についてのリファレンスを見つけることができませんでした。

DAGファイルの例:

JOB  A  A.condor 
JOB  B  B.condor 
JOB  C  C.condor    
JOB  D  D.condor
PARENT A CHILD B C
PARENT B C CHILD D

BとCの並列実行を中断することなく、BとDを同じコンピューターノードで実行する必要があることを表現する必要があります。

ご協力いただきありがとうございます。

4

3 に答える 3

2

コンドルには簡単な解決策はありませんが、機能するはずのクラッジが少なくとも1つあります。

Bに、実行ノードに、おそらくファイルの形式で、のような状態を残してもらいますMyJobRanHere=UniqueIdentifier"STARTD_CRONサポートを使用して、これを検出し、マシンClassAdでアドバタイズします。Dに使用してもらいますRequirements=MyJobRanHere=="UniqueIdentifier"。Dの最終クリーンアップの一部、またはおそらく新しいノードEは、状態を削除します。多数のジョブを実行している場合は、残りの状態をときどきクリーンアップする必要があります。

于 2010-09-03T21:09:21.890 に答える
1

答えはわかりませんが、CondorUsersメーリングリストでこの質問をする必要があります。CondorのDAG機能をサポートする人々はそれを監視し、応答します。サブスクリプション情報については、このページを参照してください。トラフィックはかなり少ないです。

一般に、コンドルの同じホストで2つのジョブを事前に特定のホスト(DAGまたはDAGなし)にロックせずに一緒に維持することはかなり困難です。私は実際にこれを行うための本当に実行可能な方法を考えることができません。BがCの前に開始するかCがBの前に開始するようにします。Bが常にCの前に開始する必要があることを強制する場合は、ジョブBの作業の一部を作成できます。実行を開始するときに、ジョブCのClassAdのRequirements部分を変更して、「Machine ==」文字列が含まれるようにします。ここで、はマシンBが着陸したマシンの名前です。これには、ジョブCを保留して提出するか、Bが実行されるまでまったく提出しない必要があります。また、Bは、スタートアップ作業の一環としてジョブCを解放する必要があります。

それはかなり複雑です...

だから私はちょうど考えました:あなたはコンドルの動的な開始/スロット機能を使用し、DAGを折りたたんであなたが望むものを達成することができます。現在2つの別々のノードBとCがあるDAGでは、これを1つのノードB'に集約し、マシンで起動したときにBとCの両方を並行して実行します。ジョブ要件の一部として、マシンに2つのCPUが必要であることに注意してください。マシンが静的に割り当てられたスロットだけでなく、すべてのリソースをアドバタイズするように、動的スロット構成を使用するようにスターターを切り替えます。これで、BとCが常に1台のマシンで同時に実行されます。多数のシングルCPUジョブを含むキューにいくつかのマルチCPUジョブがある場合、動的スロットにはいくつかの飢餓の問題がありますが、少なくともより簡単に解決できる問題です。

別のオプションは、B'に特別なジョブ属性をタグ付けすることです。

MultiCPUJob = True

そして、マシンのスロット1だけをターゲットにします。

Requirements = Slot == 1 &&  ...your other requirements...

そして、「MultiCPUJob = Trueのジョブをスロット1で実行しようとすると、このマシンのスロット2にあるジョブをプリエンプトします。これは、このジョブに2つのコア/CPUが必要であることがわかっているためです。 "。

これは非効率的ですが、6.8.x以降の任意のバージョンのCondorで実行できます。私は実際にこのタイプのセットアップを自分の静的にパーティション化されたファームで使用しているため、ベンチマークのためにジョブがそれ自体にマシンを必要とする場合、マシンを再構成しなくても実行できます。

そのプリエンプションオプションについて詳しく知りたい場合は、私に知らせてください。condor-userlistアーカイブでさらに構成を読むことをお勧めします。

于 2010-03-09T04:46:19.867 に答える
1

ここでの解決策は、DAGManがまだノードを送信していない限り、DAGManの実行中でも送信の説明を変更できるという事実を使用することです。の単純なDAGを想定しA -> B -> Cます。すべてのノードを同じホストで実行する場合は、次のようにします。

  1. ノードAでPOSTスクリプトを定義します。

  2. ポストスクリプトはcondor_history、完成したノードAのClusterIdを検索します。たとえばcondor_history -l -attribute LastRemoteHost -m1 $JOB_ID ...、出力をクリーンアップする必要がありますが、ノードAを実行したホストが残ります。

  3. 次に、postスクリプトは、依存するジョブ送信ファイルを検索して変更し、送信ファイルの先頭にジョブジョブ要件を挿入します。この新しい要件が存在する場合は、それらがこの新しい要件を取得できるように、ジョブ要件を段階的に構築するようにしてください。

  4. 投稿スクリプトが完了すると、DAGManは準備ができたノードを送信しようとします。この例では、次のノードがありますB。これで、ステップ3で追加した新しい要件を使用してBの送信が行われるため、Bはと同じ実行ホストで実行されAます。

私は現在多くの仕事でこれを行っています。それは素晴らしい働きをします。

于 2014-12-21T15:48:57.263 に答える