如何在python / pyspark中并行化for循环(以便可能在Amazon服务器上的多个节点上运行)?

时间:2019-06-02 08:47:45

标签: python amazon-web-services parallel-processing pyspark mapreduce

很抱歉,如果这是一个非常基本的问题,但是我只是无法找到查询的简单答案。

我有一些计算量大的代码,它们令人尴尬地可并行化。伪代码如下所示。

n = 500
rounds = 200

data = [d_1, ..., d_n]
values = [ 0 for _ in range(n) ]

for _ in range(rounds):
  for i in range(n): # Inner Loop
    values[i] = compute_stuff(data[i])
  data = special_function(values)

内部循环的每次迭代都需要30秒,但它们是完全独立的。因此,我想并行运行n=500迭代,方法是将计算拆分到Amazon上运行的500个独立节点上,从而将内部循环的运行时间缩短至约30秒。我该怎么做?

我假设PySpark是用于此目的的标准框架,而Amazon EMR是相关服务,可使我在多个节点上并行运行它。所以我的问题是:我应该如何使用PySpark框架扩展以上代码,使其在Amazon服务器上的500个并行节点上运行?否则,我应该使用其他框架和/或Amazon服务来完成此任务吗?

以下是有关伪代码的一些详细信息。每个数据条目d_i是一个自定义对象,但如有必要,可以将其转换为2个数字AB数组(并从中恢复)。 compute_stuff的返回值(因此,values的每个条目)也是自定义对象。尽管可以再次将此自定义对象转换为数字列表的字典(或从中还原)。另外,compute_stuff需要使用PyTorch和NumPy。最后,special_function不是像加法这样的简单事物,因此我认为它不能真正用作香草地图还原的“还原”部分。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

根据您的描述,我不会使用pyspark。要使用pyspark处理数据,必须完全重写代码(仅举几例:使用rdd,使用spark函数而不是python函数)。 我认为(使用您的情况!)使用精彩的pymp之类的内容要容易得多。您无需太多修改代码:

#still pseudocode
import pymp

n = 500
rounds = 200

data = [d_1, ..., d_n]
values = pymp.shared.list()

for _ in range(rounds):
  with pymp.Parallel(n) as p:
        for i in p.range(n):
            values.append(compute_stuff(data[i]))
  data = special_function(values)

如果values列表的顺序很重要,则可以使用p.thread_num +i计算不同的索引。 Pymp允许您使用计算机的所有核心。当您想使用几台aws机器时,应该看看slurm