关于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中:
在ipcluster_config.py中:
但是在做的时候
ipengine --profile=y
在我所在的节点上创建新引擎,而不是通过队列系统。我希望能够通过SGE系统启动n个引擎。我想我需要指定一个带密码的密钥文件来连接到我的localmachine。如果你能帮助我,我会很高兴的。
此外,是否有可能在启动时“动态”连接到引擎,以防由于群集上缺少空闲插槽而无法同时创建所有引擎?
感谢您的帮助。
答案 0 :(得分:0)
简单的情况是控制器与引擎在同一网络上,例如登录节点或其他工作节点,引擎可以连接到它。在这种情况下,您需要以下配置:
在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
更复杂的是在网络外部启动控制器(例如在笔记本电脑上),同时启动群集上的引擎。其中一个原因是SGELauncher需要qsub
作为本地命令,它可能不在您的笔记本电脑上。为此,您需要使用两组配置 - 一组用于告知ipcluster
ssh到集群并启动引擎,一组在集群上告诉它使用SGE。
对于这一点,我将假设控制器机器可以从引擎中获取。
在控制器上,您需要在ipcontroller_config.py
:
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
启动群集时会发生什么:
cluster-login-host
cluster-login-host
并运行ipcluster engines
cluster-login-host
它获取本地配置,并使用SGE 在群集上,通常会有大量网络接口,有时只有其中一个实际上可以用于连接引擎。如果是这种情况,通常更容易指定一个特定的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上。