很抱歉,如果这是一个非常基本的问题,但是我只是无法找到查询的简单答案。
我有一些计算量大的代码,它们令人尴尬地可并行化。伪代码如下所示。
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个数字A
和B
数组(并从中恢复)。 compute_stuff
的返回值(因此,values
的每个条目)也是自定义对象。尽管可以再次将此自定义对象转换为数字列表的字典(或从中还原)。另外,compute_stuff
需要使用PyTorch和NumPy。最后,special_function
不是像加法这样的简单事物,因此我认为它不能真正用作香草地图还原的“还原”部分。
感谢您的帮助!
答案 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。