繁体   English   中英

同时将 r 与 foreach 和 mclapply 并行

[英]parallel r with foreach and mclapply at the same time

我正在实现一个最终将部署在集群上的并行处理系统,但我无法弄清楚并行处理的各种方法是如何交互的。

我需要使用 for 循环来运行一大段代码,其中包含几个大的矩阵操作列表。 为了加快速度,我想使用 foreach() 并行化 for 循环,并使用 mclapply 并行化列表操作。

示例伪代码:

cl<-makeCluster(2)
registerDoParallel(cl)

outputs <- foreach(k = 1:2, .packages = "various packages") {

    l_output1 <- mclapply(l_input1, function, mc.cores = 2)
    l_output2 <- mclapply(l_input2, function, mc.cores = 2)
    return = mapply(cbind, l_output1, l_output2, SIMPLIFY=FALSE)
}

这似乎有效。 我的问题是:

1)这是一种合理的方法吗? 他们似乎在我的小规模测试中一起工作,但感觉有点笨拙。

2)在任何给定时间它将使用多少个内核/处理器? 当我将它升级到一个集群时,我需要了解我可以推动多少(foreach 只循环 7 次,但 mclapply 列表最多有 70 个左右的大矩阵)。 它似乎创建了 6 个写入的“核心”(大概 2 个用于 foreach,2 个用于每个 mclapply。

我认为在集群上这是一种非常合理的方法,因为它允许您使用多个节点,同时仍然跨单个节点的核心使用更高效的mclapply 它还允许您对工作人员进行一些后处理(在这种情况下调用cbind ),这可以显着提高性能。

在一台机器上,您的示例将创建总共 10 个额外的进程:两个由makeCluster调用,每个进程调用mclapply两次 (2 + 2(2 + 2))。 但是,它们中只有四个应该同时使用任何重要的 CPU 时间。 您可以通过重组mclapply调用的函数将其减少到八个进程,这样您只需要在 foreach 循环中调用mclapply一次,这可能会更有效率。

在多台机器上,您将创建相同数量的进程,但每个节点只有两个进程会同时占用大量 CPU 时间。 由于它们分布在多台机器上,因此应该可以很好地扩展。

请注意,如果您使用 MPI 集群, mclapply可能无法正常运行。 MPI 不喜欢您像mclapply那样分叉进程。 它可能只是发出一些严厉的警告,但我也看到了其他问题,所以我建议使用 PSOCK 集群,它使用 ssh 在远程节点上启动工作程序而不是使用 MPI。


更新

从由“parallel”和“snow”包创建的集群 worker 调用mclapply似乎有问题。 有关详细信息,请参阅我对问题报告的回答

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM