SGEを使用して、クラスター上の完全なノードをどのように予約しますか?
1つのマシンから2つのプロセッサ、別のマシンから3つのプロセッサなどは必要ありません。クアッドコアクラスターがあり、それぞれに4つのスロットがある4つの完全なマシンを予約したいと思います。 16台のスロットが必要だと指定することはできません。これは、4台のマシンにそれぞれ4つのスロットがあるとは限らないためです。
割り当てルールをFILL_UPに変更するだけでは不十分です。完全にアイドル状態のマシンがない場合、SGEは、4台のアイドル状態のマシンを待つのではなく、最も負荷の少ないマシンを可能な限り「埋める」だけですその後タスクのスケジュール。
これを行う方法はありますか?この質問をするのに良い場所はありますか?
SGEはこれに不思議であり、私はこれを一般的なケースで行うための良い方法を見つけていません。必要なノードのメモリサイズがわかっている場合に実行できることの1つは、ノードの全容量にほぼ等しいメモリ量を予約しながらqsubを実行することです。これにより、他で何も実行されていないシステムを確実に取得します。
私は方法を見つけたと思いますが、おそらく私のような古いSGEでは機能しません。 SGEの新しいバージョンには排他的スケジューリングが組み込まれているようです。
私が検討したもう1つの可能性は、エラーが発生しやすいことですが、qsubの代わりにqloginを使用し、目的の各クアッドコアマシンで4つのスロットを手動で予約することです。当然のことながら、これを自動化することは特に簡単でも楽しいことでもありません。
最後に、おそらくこれはホストグループを使用できる状況です。たとえば、4つのクアッドコアマシンを含むホストグループを作成し、キューのこの特定のサブセットにqsubbingして、グループ内の最大合計数と同じ数のプロセッサを要求します。残念ながら、これはハードコーディングのようなもので、多くの欠点があります。たとえば、特定のハードコーディングされたホストグループを空けるまで待たなければならず、4台ではなく8台に切り替える場合は変更が必要です。
追加する次の隠されたコマンドラインリクエストがあるようです:
-l excl=true
ただし、複雑な値のリストに追加し(qconf -mc)、個々のホストを有効にして(qconf -me hostname)、SGEまたはOpenGridSchedulerに構成する必要があります。
詳細については、次のリンクを参照してください: http://web.archive.org/web/20130706011021/http://docs.Oracle.com/cd/E24901_01/doc.62/e21978/management.htm#autoId61
要約すれば:
タイプ:
qconf -mc
次の行を追加します。
exclusive excl BOOL EXCL YES YES 0 1000
次に:
qconf -me <Host_name>
次に、complex_values行を編集して読み取ります。
complex_values exclusive=true
ホスト固有のcomplex_valueがすでにある場合は、それらをカンマで区切るだけです。
PE構成の割り当てルールを$ pe_slotsとして指定します
これにより、すべてのスロットが単一のホストに割り当てられます
ほぼ同じことをしようとしていて、アイデアを探しています。 pe_hostsfileが最良のオプションだと思いますが、私はSGEシステムのマネージャーではなく、hostsファイルが設定されていないため、すぐに回避する必要があります。排他的スケジュールの構成リンクをチェックアウトし、管理権限も必要であることを確認してください...
ラッパースクリプトでそれができると思います。マシンに残っている利用可能なコアの数を把握するために、bashワンライナーを作成しました(以下)。私たちのグリッドは異種混合であり、1つのノードが24コア、約8コア、大部分が4コアしかないため、少し厄介です。
とにかく、これがそのバッシュワンライナーです。
n_processors=`qhost | awk 'BEGIN{name="'\`hostname\`'"} ; {if($1==name){print int($3)-int($4+0.99)}}'`
問題は、このbash変数をSGE起動スクリプトの前処理ディレクティブに取り込む方法ですか? pvm環境にはSGEが付属しているので、シェルスクリプトで以下の引数を指定するだけかもしれません。ただし、設定されているわけではありません...
#$ -pe pvm 24-4
並列環境の管理に関するSunのページ は非常に役立ちますが、ここでも説明は主に管理者を対象としています。
割り当てルールをノードで使用可能なスロットの数(この場合は4)に設定します。これは、n * 4 CPUでのみジョブを開始できることを意味しますが、望ましい結果が得られます。16CPUは、それぞれ4 CPUの4ノードとして割り当てられます。
ようやくこれに対する答えを見つけました。最初、私は上記の-l excl=True
設定を上記のように使用しました。しかし、これは問題を完全には解決しません。
この問題を完全に解決するには、追加のpe_environmentを設定する必要がありました。私のクラスターには、12個のコアノードがあります。これを例として使用します。
Mpich2_12という追加の環境を作成しました。下に貼り付けました。
pe_name mpich_12
slots 999
user_lists sge_user
xuser_lists NONE
start_proc_args /opt/gridengine/mpi/startmpi.sh -catch_rsh $pe_hostfile
stop_proc_args /opt/gridengine/mpi/stopmpi.sh
allocation_rule 12
control_slaves TRUE
job_is_first_task FALSE
urgency_slots min
accounting_summary TRUE
ここで、allocation_ruleが12に設定されていることに注意してください。これは、ジョブがノードで12コアを使用する必要があることを意味します。 48個のCPUを要求するジョブを送信すると、4つのフルノードが使用可能になると待機して取得します。
私はまだ-l excl=True
オプションを使用していますが、これは今は無関係だと思います。
1つのCPUのみを必要とするジョブがある場合(そして私はそうします)、それらを同じキューに送信しますが、-l exel=True
オプションは使用せず、pe_environment
を持つ元のallocation_rule = 'fillup'
を使用します。mpich_12環境で送信されたジョブはすべてそこまで待機します完全なノードフリーです。私のクラスターは今ではとてもうまく機能しています。