gpt4 book ai didi

r - 如何提高并行集群处理的速度

转载 作者:行者123 更新时间:2023-12-04 07:23:31 25 4
gpt4 key购买 nike

我是集群处理的新手,可以使用一些关于如何更好地准备数据和/或从 parallel 调用函数的建议。包裹。我已阅读 parallels包装小插图,所以对发生了什么有一个模糊的想法。

我要并行化的函数调用二维插值工具akima::interp .我的输入包含 3 个矩阵(或向量——在 R 中都是相同的):一个包含 x 坐标,一个包含 y 坐标,一个包含一组样本点的“z”或数据值. interp使用它在规则网格上生成插值数据,以便我可以,例如,绘制字段。设置好这 3 个项目后,我将它们切成“块”并将它们提供给 clusterApply执行 interp一块一块地。

我使用的是 Windows7、i7 CPU(8 核)机器。这是 Rprof 的摘要输出对于具有 1e6 个点(1000x1000,如果您愿意)的输入数据集,并映射到 1000x1000 输出网格。

所以我的问题是:
1)似乎“反序列化”花费了大部分时间。这是什么操作,如何减少?
2)一般来说,由于每个worker加载默认的.Rdata文件,如果我首先将所有输入数据保存到 .Rdata 是否会提高速度?以便它不需要传递给 worker ?
3) 还有什么我根本不知道我应该做的不同的事情吗?

注:sin, atan2, cos, +, max, min函数发生在 clusterApply 之前调用我。

Rgames> summaryRprof('bigprof.txt')
$by.self
self.time self.pct total.time total.pct
"unserialize" 329.04 99.11 329.04 99.11
"socketConnection" 1.74 0.52 1.74 0.52
"serialize" 0.96 0.29 0.96 0.29
"sin" 0.06 0.02 0.06 0.02
"atan2" 0.04 0.01 0.06 0.02
"cos" 0.04 0.01 0.04 0.01
"+" 0.02 0.01 0.02 0.01
"max" 0.02 0.01 0.02 0.01
"min" 0.02 0.01 0.02 0.01
"row" 0.02 0.01 0.02 0.01
"writeLines" 0.02 0.01 0.02 0.01

$by.total
total.time total.pct self.time self.pct
"mcswirl" 331.98 100.00 0.00 0.00
"clusterApply" 330.00 99.40 0.00 0.00
"staticClusterApply" 330.00 99.40 0.00 0.00
"FUN" 329.06 99.12 0.00 0.00
"unserialize" 329.04 99.11 329.04 99.11
"lapply" 329.04 99.11 0.00 0.00
"recvData" 329.04 99.11 0.00 0.00
"recvData.SOCKnode" 329.04 99.11 0.00 0.00
"makeCluster" 1.76 0.53 0.00 0.00
"makePSOCKcluster" 1.76 0.53 0.00 0.00
"newPSOCKnode" 1.76 0.53 0.00 0.00
"socketConnection" 1.74 0.52 1.74 0.52
"serialize" 0.96 0.29 0.96 0.29
"postNode" 0.96 0.29 0.00 0.00
"sendCall" 0.96 0.29 0.00 0.00
"sendData" 0.96 0.29 0.00 0.00
"sendData.SOCKnode" 0.96 0.29 0.00 0.00
"sin" 0.06 0.02 0.06 0.02
"atan2" 0.06 0.02 0.04 0.01
"cos" 0.04 0.01 0.04 0.01
"+" 0.02 0.01 0.02 0.01
"max" 0.02 0.01 0.02 0.01
"min" 0.02 0.01 0.02 0.01
"row" 0.02 0.01 0.02 0.01
"writeLines" 0.02 0.01 0.02 0.01
"outer" 0.02 0.01 0.00 0.00
"system" 0.02 0.01 0.00 0.00

$sample.interval
[1] 0.02

$sampling.time
[1] 331.98

最佳答案

clusterApply被调用时,它首先向每个集群 worker 发送一个任务,然后等待每个人返回相应的结果。如果有更多的任务要做,它会重复这个过程,直到所有的任务都完成。

它用于等待特定工作线程的结果的函数是 recvResult最终调用 unserialize从连接到该 worker 的套接字读取数据。因此,如果主进程大部分时间都花在 unserialize ,那么它大部分时间都在等待集群 worker 返回任务结果,这就是您希望在 master 上看到的。如果它在 serialize 上花了很多时间,这意味着它花费了大量时间将任务发送给 worker ,这将是一个坏兆头。

不幸的是,你不知道多少时间 unserialize花费阻塞,等待结果数据到达,以及实际传输该数据所花费的时间。结果可能很容易被工作人员计算出来并且很大,或者它们可能需要很长时间来计算并且很小:无法从分析数据中分辨出来。

所以要制作unserialize执行得更快,你需要让工作人员更快地计算他们的结果,或者如果可能的话,让结果更小。此外,使用 makeCluster 可能会有所帮助。 useXDR=FALSE选项。不使用 XDR 对数据进行编码可能会提高您的性能,同时使 serializeunserialize快点。

我认为将所有输入数据保存到 .Rdata 没有帮助因为您没有花太多时间向工作人员发送数据,正如在 serialize 中花费的时间很短所见。功能。我怀疑这会让你慢一点。

我能想到的唯一其他建议是尝试使用 parLapplyclusterApplyLB , 而不是 clusterApply .我建议使用 parLapply除非您有特定原因使用自 parLapply 以来的其他功能之一往往是最有效的。 clusterApplyLB当您有需要很长时间但可变长度的任务来执行时,这很有用。

关于r - 如何提高并行集群处理的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19380942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com