[英]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.