2

我一直在使用这段代码:

library(parallel)
cl <- makeCluster( detectCores() - 1)
clusterCall(cl, function(){library(imager)})

然后我有一个看起来像这样的包装函数:

d <- matrix  #Loading a batch of data into a matrix
res <- parApply(cl, d, 1, FUN, ...)
# Upload `res` somewhere

我在笔记本电脑上进行了测试,有 8 个内核(4 个内核,超线程)。当我在一个 50,000 行、800 列的矩阵上运行它时,它需要 177.5 秒才能完成,并且在大部分时间里 7 个内核保持在接近 100%(根据顶部),然后它在最后 15大约几秒钟,我猜这是结合结果。据system.time(),用户时间为 14 秒,因此匹配。

现在我在 EC2 上运行,这是一个 36 核 c4.8xlarge,我看到它几乎所有时间都花在一个 100% 的核心上。更准确地说:有一个大约 10-20 秒的爆发,所有核心都在使用,然后大约 90 秒只有一个核心在 100%(被 R 使用),然后大约 45 秒的其他东西(我保存结果和加载下一批数据)。我正在批量处理 40,000 行、800 列。

根据顶部,长期平均负载徘徊在 5.00 附近。

这看起来合理吗?或者是否存在 R 并行性在通信开销上花费更多时间的点,我应该限制为例如 16 个内核。这里有什么经验法则吗?

参考:CPU 规格 我使用的是“Linux 4.4.5-15.26.amzn1.x86_64 (amd64)”。R 版本 3.2.2 (2015-08-14)

更新:我尝试了 16 个内核。对于最小的数据,运行时间从 13.9 秒增加到 18.3 秒。对于中型数据:

With 16 cores:
   user  system elapsed 
 30.424   0.580  60.034 

With 35 cores:
   user  system elapsed 
 30.220   0.604  54.395 

开销部分花费了相同的时间,但并行位的内核更少,因此花费的时间更长,因此总体上花费的时间更长。

正如评论中所建议的那样,我也尝试过使用mclapply()。它似乎确实要快一些(在我尝试过的特定测试数据上,类似于 330s 与 360s),但那是在我的笔记本电脑上,其他过程或过热可能会影响结果。所以,我还没有就此得出任何结论。

4

2 回答 2

2

没有有用的经验法则——并行任务最适合的内核数量完全由所述任务决定。有关更一般性的讨论,请参阅古斯塔夫森定律

您在代码中看到的高单核部分可能来自算法的结束阶段(“连接”阶段),其中并行结果被整理到单个数据结构中。由于这远远超过了并行计算阶段,这可能确实表明更少的内核可能是有益的。

于 2016-09-13T10:19:54.967 回答
2

我要补充一点,如果您不知道 R 语言中并行计算的这一绝妙资源,您可能会发现阅读 Norman Matloff 最近的书Parallel Computing for Data Science: With Examples in R, C++ and CUDA非常有帮助。我强烈推荐它(我学到了很多东西,而不是来自 CS 背景)。

这本书深入回答了你的问题(特别是第 2 章)。本书对导致并行程序瓶颈的开销原因进行了高级概述。

引用第 2.1 节,其中隐含地部分回答了您的问题:

并行编程有两个主要的性能问题:

通信开销:通常数据必须在进程之间来回传输。这需要时间,这可能会对性能造成很大影响。此外,如果进程都试图同时访问相同的数据,它们可能会相互妨碍。当尝试访问相同的通信通道、相同的内存模块等时,它们可能会发生冲突。这是速度上的另一个问题。粒度一词用于粗略地指计算与开销的比率。大粒度或粗粒度算法涉及足够大的计算块,因此开销不是什么大问题。在细粒度算法中,我们确实需要尽可能地避免开销。

^ 当开销很高时,解决手头问题的内核越少,总计算时间就越短。

负载平衡:如上一章所述,如果我们在为进程分配工作的方式上不小心,我们就有可能将更多的工作分配给某些进程。这会影响性能,因为它会使一些进程在运行结束时无法生产,而仍有工作要做。

何时不使用所有内核?我个人在 R 中对 RAM 中 100-200GB 数据的数据运行日常 cronjobs 的个人经验中的一个例子,其中运行多个内核来处理数据块,我确实发现运行 32 个可用内核中的 6 个比使用 20-30 个内核更快。一个主要原因是子进程的内存需求(在一定数量的子进程运行后,内存使用率变高,速度大大降低)。

于 2016-10-07T00:56:05.357 回答