在Sun Grid Engine上使用IPython Parallel

时间:2013-07-22 15:10:38

标签: ipython sungridengine ipython-parallel

我正在尝试将IPython Parallel用于一个非常常见的场景,我想在运行Sun Grid Engine的集群上运行模拟,我找不到一种可靠的方法来实现这一点。

这就是我想要做的事情:

我想运行具有几个不同参数值的数值模拟(使用Numpy数组) - 任务显然是''令人尴尬'并行。我有权(通过ssh)访问运行Grid Engine的集群的头节点。直到现在,我使用QSUB命令运行shell脚本,但这非常笨拙(处理节点崩溃等),我正在寻找一种方法来处理Python中的所有这些。

IPython似乎非常适合这种情况,但是让设置顺利运行变得非常麻烦。我在头节点上使用IPCLUSTER启动n(比方说20)引擎,然后将.json文件复制到我使用IPython.parallel.Client连接的本地机器。

我已设置IPClusterStart.controller_launcher_class = 'SGEControllerLauncher'IPClusterEngines.engine_launcher_class = 'SGEEngineSetLauncher'

IPCLUSTER似乎运行良好;我从ssh终端的头节点获得此输出:

-- [IPClusterStart] Starting Controller with SGEControllerLauncher
-- [IPClusterStart] Job submitted with job id: '143396'
-- [IPClusterStart] Starting 4 Engines with SGEEngineSetLauncher
-- [IPClusterStart] Job submitted with job id: '143397'
-- [IPClusterStart] Engines appear to have started successfully

但是,我有这些问题:

  1. 很多时候,即使我看到上面的消息说发动机已成功启动,许多引擎也无法注册到控制器。当我用20个引擎启动IPCLUSTER时,我可以看到10-15个引擎出现在Grid Engine队列上。我不知道其他引擎会发生什么 - 没有输出文件。在这些10-15个引擎中,只有部分引擎注册到控制器,我在其输出文件中看到了这一点:

    ... [IPEngineApp] Using existing profile dir: .../.ipython/profile_sge'
    ... [IPEngineApp] Loading url_file ... .ipython/profile_sge/security/ipcontroller-engine.json'
    ... [IPEngineApp] Registering with controller at tcp://192.168.87.106:63615
    ... [IPEngineApp] Using existing profile dir: .../.ipython/profile_sge'
    ... [IPEngineApp] Completed registration with id 0
    

    在其他人看来,我看到了:

    ... [IPEngineApp] Using existing profile dir: .../.ipython/profile_sge'
    ... [IPEngineApp] Loading url_file .../.ipython/profile_sge/security/ipcontroller-engine.json'
    ... [IPEngineApp] Registering with controller at tcp://192.168.87.115:64909
    ... [IPEngineApp] Registration timed out after 2.0 seconds
    

    知道为什么会这样吗?

  2. 有时,引擎会成功启动并注册,但是当我让它们运行非常简单的view.execute('%pylab')时,它们就会开始死亡,而我唯一的例外就是:

    [引擎例外] Traceback(最近一次调用最后一次):   在_handle_stranded_msgs中输入文件“/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/IPython/parallel/client/client.py”,第708行     raise error.EngineError(“运行任务%r时发动机%r死了”%(eid,msg_id)) EngineError:引擎1在运行任务时死亡'b9601e8a-cff5-4037-b9d9-a0b93ca2f256'

  3. 以这种方式启动引擎意味着只要引擎正在运行,我就会占用节点和队列,即使它们没有执行任何操作。有没有一种简单的启动引擎的方法,只有当你想运行一些脚本时它们才会产生,一旦它们返回计算结果就会关闭它们?

  4. Grid Engine似乎每次都在不同的节点上启动控制器,所以IPCLUSTER配置文件中的--ruse标志没用;每次我使用IPCLUSTER时都必须复制JSON文件。有没有办法避免这种情况?

  5. 如果有人可以为这个常见场景提供简单的工作流程,那将非常有用:使用IPython parallel将明显并行的作业通过SSH连接提交给SGE集群。应该有一些处理引擎崩溃重新提交的方法,如果有一种方法只在模拟期间使用群集资源,那也很好。

1 个答案:

答案 0 :(得分:1)

这有点晚了,实际上并没有回答你的具体问题。但是,你试过pythongrid吗?