问题标签 [rparallel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
r - 为什么 parLapplyLB 实际上并没有平衡负载?
我正在测试该parLapplyLB()
功能以了解它如何平衡负载。但我没有看到任何平衡发生。例如,
如果它真正平衡负载,则休眠 3 秒的第一个作业(作业 1)将在第一个节点上,而其他三个作业(作业 2:4)将在另一个节点上总共休眠 1.5 秒。总的来说,系统时间应该只有 3 秒。
相反,我认为作业 1 和 2 分配给节点 1,作业 3 和 4 分配给节点 2。这导致总时间为 3 + 0.5 = 3.5 秒。如果我们使用parLapply()
而不是运行上面的相同代码parLapplyLB()
,我们会得到大约 3.5 秒的相同系统时间。
我不理解或做错了什么?
r - 多次调用 parLapply 时的集群内存使用情况
如果多次调用 parLapply,是否可以只调用makeCluster
一次stopCluster
,还是应该在每次parLapply
调用之前和之后调用它们?这如何影响内存使用?
这是一个玩具示例:
现在假设我重写my_fn
以使用集群:
在stopCluster
循环之外,是否my_large_list
会多次复制,直到stopCluster
调用内存才释放?换句话说,内存使用量是否my_large_list
会在2*max_iterations
? 或者它是否会保持不变max_iterations
?
r - R并行包parSapply():无法打印消息
我一直在探索并行包中的 parSapply() 函数。
在 sapply() 函数中,我们可以这样做:
这会在每次迭代中打印“哈哈”并将 1:10 存储在“结果”中。
当我尝试使用 parSapply() 做同样的事情时:
结果中仅存储了 1:10,但未打印“哈哈”。想知道如何解决这个问题?谢谢!
r - 什么时候(如果有的话)我应该告诉 R 并行不要使用所有内核?
我一直在使用这段代码:
然后我有一个看起来像这样的包装函数:
我在笔记本电脑上进行了测试,有 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 秒。对于中型数据:
即开销部分花费了相同的时间,但并行位的内核更少,因此花费的时间更长,因此总体上花费的时间更长。
正如评论中所建议的那样,我也尝试过使用mclapply()
。它似乎确实要快一些(在我尝试过的特定测试数据上,类似于 330s 与 360s),但那是在我的笔记本电脑上,其他过程或过热可能会影响结果。所以,我还没有就此得出任何结论。
r - 并行处理出错:端口无法打开
我在 linux 集群中一次以批处理模式运行不同的 R 脚本,以估计不同数据集中的模型(当我在 Mac 中运行它时也会发生这种情况)。除了它们使用的数据集之外,这些脚本完全相同。当我这样做时,我收到以下消息。
这是一个可重现的例子。创建两个文件,tmp1.R 和 tmp2.R,以及 tmp.sh,其内容为:
文件 tmp1.R 和 tmp2.R 的内容:
tmp.sh 文件内容:
列表中的第一个文件将被执行。第二个将显示上述错误。有谁知道如何解决它并且仍然在没有任何手动干预的情况下自动运行所有脚本?
PS:我已经阅读了所有其他类似的问题,没有一个可重复的例子或上述问题的答案。
r - R parLapply 不平行
我目前正在开发一个 R 包,它将通过“并行”包使用并行计算来解决一些任务。
当使用在我的包的函数中定义的集群时,我遇到了一些非常尴尬的行为,其中 parLapply 函数将作业分配给工作人员并等待它完成将工作分配给下一个工作人员。或者至少这似乎是正在发生的事情,通过观察日志文件“cluster.log”和 unix shell 中正在运行的进程列表。
下面是我的包中声明的原始函数的模型版本:
笔记:
- 我使用 makePSOCKcluster 是因为我希望代码在 Windows 和 unix 系统上运行,尽管这个特殊问题只在 unix 系统中表现出来。
- 函数 rasterize 和 raster 在 library(raster) 中定义,导出到集群。
对我来说奇怪的部分是,如果我在全局环境中执行函数 parSolver 的完全相同的代码,每件事都会顺利进行,所有工作人员同时从事一项工作,并且任务立即完成。但是,如果我这样做:
出现描述的问题。
这似乎是一个负载平衡问题,但这并不能解释为什么它在一种情况下可以正常工作,而在另一种情况下却不行。
我在这里错过了什么吗?提前致谢。
r - 使用共享内存进行并行化 [bigmemory]
在尝试使其在并行场景 [doSNOW] 中工作时遇到了一些困难,其中涉及到共享内存 [bigmemory] 的使用。总结是我在一些 foreach 工作人员中收到以下错误“ { 中的错误:任务 1 失败 - “无法打开连接” ”。更具体地说,检查集群输出日志,它与“ '/temp/x_bigmatrix.desc': Permission denied ”有关,就像对 big.matrix 描述符文件的并发访问存在问题一样。
请原谅我,但因为代码有点复杂,我不包括一个可重现的例子,而是试图解释要点的工作流程是什么。
我有一个矩阵 X,它通过以下方式转换为 big.matrix:
然后,我使用 doSNOW [我在 Windows 10 x64 上] 初始化 sock 集群:
(showConnections() 正确显示已注册的连接)
现在我必须解释一下,我对每个工作人员都有一个主循环(foreach),然后,有一个内部循环,每个工作人员在 X 中的行上循环。主要思想是,在主语料库中,每个工作人员都被喂食通过内部循环顺序处理大量数据,然后,每个工作人员可以存储其中一些观察结果,而不是自己存储观察结果;他们存储行索引以供后验检索。为了使事情变得更加复杂,每个工作人员都修改了存储索引的关联 R6 类环境。我这样说是因为对 big.matrix 描述符文件的访问发生在两个不同的地方:主 foreach 循环和每个 R6 环境中。foreach主要语料库如下:
尝试访问文件中支持的 big.matrix 时,问题发生在内部循环中。因为如果我更改这些环境中的行为以显式存储观察结果而不是行索引(因此,无法再访问这些对象中的描述符文件),那么它可以正常工作。此外,如果我在没有并行化 [registerDoSEQ()] 的情况下运行它,但将行索引存储在对象中,也不会出现错误。因此,如果我在不同的 R6 环境中混合并行化和对共享 big.matrix 的双重访问,就会出现问题。奇怪的是,一些工人可以比其他工人运行更长的时间,甚至最后至少有一个完成它的运行......所以这让我想到了同时访问 big.matrix 描述符文件的问题.
我在这里的一些基础知识失败了吗?
r - 为什么 R 中的 mclapply 函数比 Rcpp + OpenMP 更高效?
我有一个与 OpenMP 并行的循环(EstimateUniques)函数。我建议多线程应该比多处理更高效,但是当我将此函数与“mclapply”的简单运行进行比较时,它显示出较低的性能。在 C++ 中实现与 R 相同级别的并行化的正确方法是什么?难道我做错了什么?
性能比较(以秒为单位的时间):
代码:
示例.cpp 文件:
我尝试在 OpenMP 中使用其他类型的调度,但结果更差。
r - 在多个主机上运行并行 R
您能否提供一个脚本以在 Ubuntu Linux 机器上从头开始在 2 个主机(亚马逊 ec2)上运行并行集群?
规格
- 主机通过名为 amazon_key.pem 的身份密钥从本地计算机连接
- 主机名应该通过亚马逊云提供的内部 IP 地址连接
- 在设置云时将主机名保留为 rserver1 和 rserver2
r - 在自定义 R 包中的函数中使用 mclapply
我使用 R Studio 创建了一个包,使用这两个站点作为指南:
https://support.rstudio.com/hc/en-us/articles/200486488-Developing-Packages-with-RStudio https://www.r-bloggers.com/building-a-package-in-rstudio-is -实际上非常简单/
唯一的修改是当我使用 R Studio 创建包时,我使用了使用 Rcpp 创建 R 包的选项。
包中的功能之一如下:
当mc.cores = 1
它运行良好时。当我将 mc.cores 设置为 1 以外的值时,控制台会打印出“In GenerateSims”,但会停在那里,就好像它处于无限循环中一样。
函数 GenerateData 仅使用非基础包中的一个函数gamlss.dist::rDPO
。
我的说明文件如下(不确定这是否有助于识别问题):
编辑:我在运行 Debian 的机器上运行它。