从本地控制器在SGE集群上运行IPython Parallel(使用队列系统)

时间:2015-08-25 12:33:46

标签: python parallel-processing ipython-parallel

关于IPython Parallel,从我在互联网上找到的文档和几篇帖子中,我知道我可以通过SSH在一台机器和另一台机器上启动一个控制器。但是,我想在SGE集群上使用IPython Parallel,但在本地计算机中启动控制器,并通过队列系统启动引擎。 (在本地计算机中启动控制器的原因是也能够使用本地节点)。

在本地机器中,我在profile_x的ipcontroller_config.py中添加了c.HubFactory.ip ='*'。我可以用VB成功启动控制器 ipcontroller --profile=x

我也可以使用ipengine在本地启动引擎并使用

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

现在的问题是如何在集群中启动引擎,使它们由队列系统管理并连接到本地计算机中的控制器? 到目前为止,我做了:我在群集上创建了一个新的配置文件profile_y。我将profile_x中的ipcontroller-engine.json复制到profile_y中的security文件夹,并修改了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个引擎。我想我需要指定一个带密码的密钥文件来连接到我的localmachine。如果你能帮助我,我会很高兴的。

此外,是否有可能在启动时“动态”连接到引擎,以防由于群集上缺少空闲插槽而​​无法同时创建所有引擎?

感谢您的帮助。

1 个答案:

答案 0 :(得分: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。

对于这一点,我将假设控制器机器可以从引擎中获取。

控制器

在控制器上,您需要在ipcontroller_config.py

中设置引擎SSH服务器
c.IPControllerApp.engine_ssh_server = 'mylocalmachineserver'

告诉本地电话ipcluster通过ipcluster中的ssh在群集上执行来电ipcluster_config.py

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

在群集上,您必须使用ipcluster_config.py创建个人资料:

c.IPClusterEngines.engine_launcher_class = 'SGE'

那应该是它。

启动集群

现在,当您在ipcluster start上使用mylocalmachineserver启动群集时会发生什么:

  • 启动本地ipcontroller,侦听localhost,在引擎连接文件中写入ssh主机
  • 将连接文件发送到cluster-login-host
  • ssh到cluster-login-host并运行ipcluster engines
  • on cluster-login-host它获取本地配置,并使用SGE
  • 生成引擎 集群上的
  • 引擎查看引擎ssh服务器,并将{local}上的localhost隧道传送到localhost {/ 1>
  • 希望一切顺利!

注意事项

在群集上,通常会有大量网络接口,有时只有其中一个实际上可以用于连接引擎。如果是这种情况,通常更容易指定一个特定的IP,而不是mylocalmachineserver,这会迫使IPython在尝试建立连接时进行一些猜测。例如,如果您知道'*'是您的节点可以看到的网络接口,那么使用eth1的IP可能是最好的。 netifaces是获取此类信息的有用库:

eth1

以下子问题的答案:

  

c.EngineFactory.ip ='*'

这个配置很少,如果有的话,是必要的,永远不应该是import netifaces eth0 = netifaces.ifaddresses('eth0') c.HubFactory.ip = eth0[netifaces.AF_INET][0]['addr'] 。当连接文件未提供正确的信息时,这用于告诉ipengine如何连接到控制器。通常,最好的解决方案是首先获取连接文件(ipcontroller配置),而不是在引擎配置中设置值。

  

在我所在的节点上创建了一个新的引擎[以ipengine启动],而不是通过队列系统。

*配置仅在您使用IPClusterEngines启动引擎时受到影响。如果你想用这个配置启动一个带有SGE的引擎,你可以这样做:

ipcluster
  

我想我需要指定一个带密码的密钥文件,以便连接到我的localmachine。

如果您需要指定ssh配置,则可以在ipcluster engines -n 1 中执行此操作。 IPython使用命令行ssh来设置隧道,因此任何ssh别名等都可以工作。

如果您的控制器计算机与引擎位于同一网络上,则可能根本不需要使用SSH。通常,一组~/.ssh/config 一组使用ssh隧道。唯一一次使用这两种情况的方法是Hub与引擎根本不在同一网络上,并且引擎必须ssh到与控制器在同一网络上的机器,然后ssh服务器连接到控制器在局域网IP上。