0

IPython Parallel に関しては、ドキュメンテーションとインターネットで見つけたいくつかの投稿から、SSH を介してマシンでコントローラーを起動し、別のマシンでエンジンを起動できることを知っています。ただし、SGE クラスターで IPython Parallel を使用したいのですが、ローカル マシンでコントローラーを起動し、キュー システムを介してエンジンを起動します。(ローカル マシンでコントローラを起動する理由は、ローカル ノードも使用できるようにするためです)。

ローカル マシンでは、profile_x の ipcontroller_config.py に c.HubFactory.ip = '*' を追加しました。コントローラーを正常に起動できます
ipcontroller --profile=x

また、ipengine を使用してローカルでエンジンを起動し、次のように接続することもできます。

c=Client(url_file='/path/to/profile_x/security/ipcontroller-client.json')

問題は、エンジンがキュー システムによって管理され、ローカル マシンのコントローラーに接続されるように、クラスター内でエンジンを起動するにはどうすればよいかということです。これまでのところ、クラスターに新しいプロファイル profile_y を作成しました。profile_x から profile_y の security フォルダーに ipcontroller-engine.json をコピーし、profile_y の構成ファイルを次のように変更しました。

ipengine_config.py で:

  • c.EngineFactory.ip = '*'
  • c.EngineFactory.sshserver = 'mylocalmachineserver'

ipcluster_config.py で:

  • c.IPClusterEngines.engine_launcher_class = 'SGE'

しかし、やるとき

ipengine --profile=y

新しいエンジンは、キュー システムではなく、私がいるノードで作成されます。SGE システムを介して n 個のエンジンを始動できるようにしたいと考えています。ローカルマシンに接続するには、パスワードを含むキーファイルを指定する必要があると思います。そのお手伝いができれば幸いです。

さらに、クラスターに空きスロットがないためにすべてのエンジンを一度に作成できない場合に備えて、起動時にエンジンに「動的に」接続することは可能ですか?

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

4

1 に答える 1

0

エンジンと同じ LAN 上のコントローラ

単純なケースは、コントローラがエンジンと同じネットワーク (ログイン ノードやその他の作業ノードなど) にあり、エンジンがそれに接続できる場合です。この場合、次の構成が必要になります。

ipcontroller_config.py で、コントローラにすべての IP をリッスンするように指示します (これに対する例外については警告を参照してください)。

c.HubFactory.ip = '*' # see caveat for cases where '*' may not work

ipcluster_config.py で、ipclusterSGE を使用してエンジンを起動するように指示します。

c.IPClusterEngines.engine_launcher_class = 'SGE'

それはあなたが必要とするすべてです。次に、次のように起動できます。

ipcluster start

またはコントローラーを手動で実行します

ipcontroller

事後にエンジンを起動し、

ipcluster engines -n 32

ssh を使用したクラスター外のコントローラー

より複雑なのは、ネットワークの外部 (ラップトップなど) でコントローラーを起動すると同時に、クラスターでエンジンを起動することです。この理由の 1 つは、SGELauncher がqsubローカル コマンドである必要があるためです。これはおそらくラップトップにはありません。このためには、2 セットの構成を使用する必要があります。1 つipclusterはクラスターに ssh してエンジンを開始するように指示するためのもので、もう 1 つはクラスターに SGE を使用するように指示するためのものです。

ここでは、コントローラー マシンがエンジンから ssh 可能であると仮定します。

コントローラ

コントローラーでは、エンジン SSH サーバーを次のように設定しますipcontroller_config.py

c.IPControllerApp.engine_ssh_server = 'mylocalmachineserver'

そして、ssh 経由でローカル呼び出しをクラスターでipcluster実際に呼び出すように指示します。ipclusteripcluster_config.py

c.IPClusterEngines.engine_launcher_class = 'SSHProxy'
c.SSHProxyEngineSetLauncher.hostname = 'cluster-login-host'

集まる

クラスターでは、以下を使用してプロファイルを作成する必要がありますipcluster_config.py

c.IPClusterEngines.engine_launcher_class = 'SGE'

そして、それはそれであるべきです。

クラスターの開始

ipcluster startonでクラスターを起動するとどうなるかmylocalmachineserver:

  • ローカル ipcontroller を開始し、localhost をリッスンし、エンジン接続ファイルに ssh ホストを書き込みます
  • に接続ファイルを送信しますcluster-login-host
  • にsshしcluster-login-hostて実行ipcluster engines
  • その上cluster-login-hostでローカル構成を取得し、SGE でエンジンを生成します
  • クラスタ上のエンジンは、エンジンの ssh サーバーを認識し、localhost を localhost にトンネリングします。mylocalmachineserver
  • うまくいけば、すべてがうまくいきます!

注意事項

クラスターでは、多数のネットワーク インターフェイスが存在するのが一般的であり、エンジンが接続するために実際に機能するのはそのうちの 1 つだけである場合があります。このような場合は、多くの場合、特定の IP を指定する方が簡単です'*'。これにより、IPython は接続を試行する際に何らかの推測を行う必要があります。たとえば、それがeth1ノードが相互に認識できるネットワーク インターフェイスであることがわかっている場合は、IP を使用するのeth1が最適な場合があります。netifacesは、この種の情報を取得するための便利なライブラリです。

import netifaces
eth0 = netifaces.ifaddresses('eth0')
c.HubFactory.ip = eth0[netifaces.AF_INET][0]['addr']

以下のサブ質問への回答:

c.EngineFactory.ip = '*'

この構成が必要になることはめったになく、決して必要ではありません*。これは、接続ファイルが正しい情報を提供しない場合に、コントローラーへの接続方法を ipengine に指示するために使用されます。通常、最適な解決策は、エンジン構成で値を設定するのではなく、最初に接続ファイル (ipcontroller config) を正しく取得することです。

新しいエンジン [ipengine で開始] は、キュー システムではなく、現在のノードに作成されます。

IPClusterEnginesconfig は、でエンジンを起動した場合にのみ影響しますipcluster。この構成で SGE を使用して 1 つのエンジンを起動する場合は、次のようにします。

ipcluster engines -n 1

ローカルマシンに接続するには、パスワードを含むキーファイルを指定する必要があると思います。

ssh 構成を指定する必要がある場合は、~/.ssh/config. IPython はコマンドライン ssh を使用してトンネルをセットアップするため、任意の ssh エイリアスなどが機能します。

コントローラー マシンがエンジンと同じネットワーク上にある場合、おそらく SSH を使用する必要はまったくありません。通常、1 つのセットc.HubFactory.ip = '*' または1 つが ssh トンネルを使用します。これらの両方を使用する唯一の場合は、ハブがエンジンと同じネットワーク上にまったくなく、エンジンがコントローラーと同じネットワーク上のマシンに ssh する必要があり、その後 ssh サーバーがコントローラーに接続する場合です。 LAN IP上。

于 2015-09-25T15:06:57.420 に答える