使用多处理模块进行集群计算

时间:2011-03-03 14:21:49

标签: python parallel-processing multiprocessing

我对使用计算机集群运行Python程序感兴趣。我过去一直在使用Python MPI接口,但由于编译/安装这些接口有困难,我更喜欢使用内置模块的解决方案,例如Python的multiprocessing模块。

我真正想做的只是设置一个跨越整个计算机集群的multiprocessing.Pool实例,然后运行Pool.map(...)。这是可能/容易做的事情吗?

如果这是不可能的,我希望至少能够从中央脚本的任何节点上启动Process个实例,每个节点都有不同的参数。

4 个答案:

答案 0 :(得分:44)

如果通过集群计算你的意思是分布式内存系统(多个节点而不是SMP),那么Python的多处理可能不是一个合适的选择。它可以产生多个进程,但它们仍将绑定在一个节点中。

您需要的是一个框架,用于处理跨多个节点的流程,并提供处理器之间通信的机制。 (几乎是MPI所做的)。

请参阅Parallel Processing on the Python wiki上的页面,获取有助于群集计算的框架列表。

从列表中,ppjugpyrocelery看起来像是明智的选择,虽然我无法亲自担保,因为我没有任何经验他们(我主要使用MPI)。

如果安装/使用的简便性很重要,我首先要探索jug。它是easy to installsupports common batch cluster systems,看起来well documented

答案 1 :(得分:13)

在过去,我使用Pyro非常成功地完成了这项工作。如果您打开移动代码,它将自动通过线路发送节点尚未拥有的所需模块。非常漂亮。

答案 2 :(得分:1)

我很幸运使用SCOOP作为单处理器或多计算机使用的多处理的替代方案,并获得了集群作业提交的好处以及许多其他功能,例如嵌套映射和最少的代码更改以便与之合作地图()。

Github上提供sourcequick example显示了实现的简单程度!

答案 3 :(得分:0)

如果您愿意通过pip安装一个开源软件包,则应考虑Ray,它是Python群集框架中最接近单线程Python体验的选项。它允许您并行化函数(作为任务)和有状态类(作为参与者),并自动进行所有数据传送和序列化以及异常消息的传播。它还提供了与普通Python类似的灵活性(可以传递角色,任务可以调用其他任务,可以存在任意数据依赖关系等)。在documentation中有更多相关内容。

作为示例,这是在Ray中进行多处理地图示例的方式:

import ray
ray.init()

@ray.remote
def mapping_function(input):
    return input + 1

results = ray.get([mapping_function.remote(i) for i in range(100)])

API与Python的多处理API略有不同,但应更易于使用。有一个逐步介绍的tutorial,介绍了如何处理数据依赖关系和参与者等。

您可以使用“ pip install ray”安装Ray,然后在单个节点上执行上述代码,或者也很容易设置集群,请参见Cloud supportCluster support

免责声明:我是Ray开发人员之一。

相关问题