0

关于 IPython Parallel,从我在 Internet 上找到的文档和几篇文章中,我知道我可以通过 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。我将 ipcontroller-engine.json 从 profile_x 复制到 profile_y 中的安全文件夹,并修改 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 中,告诉ipcluster使用 SGE 启动引擎:

c.IPClusterEngines.engine_launcher_class = 'SGE'

这就是你应该需要的。然后你可以开始:

ipcluster start

或手动运行控制器

ipcontroller

并在事后启动引擎,

ipcluster engines -n 32

集群外的控制器,带有 ssh

更复杂的是在网络之外启动控制器(例如在您的笔记本电脑上),同时在集群上启动引擎。原因之一是 SGELauncher 需要qsub是本地命令,它可能不在您的笔记本电脑上。为此,您需要使用两组配置 - 一组用于告诉ipcluster集群 ssh 并启动引擎,另一组在集群上告诉它使用 SGE。

对于这一点,我将假设控制器机器可以通过引擎进行 ssh。

控制器

在控制器上,您需要将引擎 SSH 服务器设置为ipcontroller_config.py

c.IPControllerApp.engine_ssh_server = 'mylocalmachineserver'

并告诉本地调用通过 ssh inipcluster实际调用集群: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
  • SSHcluster-login-host并运行ipcluster engines
  • cluster-login-host它上面获取本地配置,并使用 SGE 生成引擎
  • 集群上的引擎会看到引擎 ssh 服务器,并通过隧道将 localhost 连接到 localhostmylocalmachineserver
  • 希望一切正常!

注意事项

在集群上,通常有大量的网络接口,有时只有其中一个实际上可以用于引擎连接。如果是这种情况,指定一个特定的 IP 通常比指定 IP 更容易'*',这会迫使 IPython 在尝试建立连接时进行一些猜测。例如,如果您知道这eth1是您的节点可以看到彼此的网络接口,那么使用 IPeth1可能是最好的。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 的引擎,你可以这样做:

ipcluster engines -n 1

我想我还需要指定一个带有密码的密钥文件才能连接到我的本地机器。

如果你需要指定 ssh 配置,你可以在你的~/.ssh/config. IPython 使用命令行 ssh 来设置隧道,因此任何 ssh 别名等都可以使用。

如果您的控制器机器与引擎在同一个网络上,您可能根本不需要使用 SSH。通常,一组c.HubFactory.ip = '*' 一组使用 ssh 隧道。唯一同时使用这两种方法的情况是集线器与引擎根本不在同一网络上,并且引擎必须通过 ssh 连接到与控制器在同一网络上的机器,然后 ssh 服务器连接到控制器在局域网 IP 上。

于 2015-09-25T15:06:57.420 回答