R foreach:从单机到集群

时间:2016-04-22 12:38:03

标签: r parallel-processing cluster-computing snow parallel-foreach

以下(简化)脚本在unix集群的主节点(4个虚拟核心)上正常工作。

library(foreach)
library(doParallel)

nc = detectCores()
cl = makeCluster(nc)
registerDoParallel(cl)

foreach(i = 1:nrow(data_frame_1), .packages = c("package_1","package_2"), .export = c("variable_1","variable_2"))  %dopar% {     

    row_temp = data_frame_1[i,]
    function(argument_1 = row_temp, argument_2 = variable_1, argument_3 = variable_2)

}

stopCluster(cl)

我想利用群集中的16个节点(总共16 * 4个虚拟核心)。

我想我需要做的就是更改makeCluster指定的并行后端。但是我应该怎么做呢?文档不是很清楚。

基于这篇相当古老的(2013)帖子http://www.r-bloggers.com/the-wonders-of-foreach/,似乎我应该更改默认类型(sockMPI - 哪一个可以在unix上运行?)< / p>

修改

来自foreach的作者vignette

  

默认情况下,doParallel在类Unix上使用多核功能   Windows上的系统和Snow功能。请注意多核   功能只在一台计算机上运行任务,而不是在一组计算机上运行   电脑。但是,您可以使用snow功能执行   一个集群,使用类Unix操作系统,Windows,甚至是   组合

you can use the snow functionality是什么意思?我该怎么做?

2 个答案:

答案 0 :(得分:8)

parallel包是multicoresnow包的合并,但是如果要在多个节点上运行,则必须使用&#34;雪功能&#34;在parallel中(即parallel中派生自snow的部分)。实际上,这意味着您需要使用&#34;类型&#34;来呼叫makeCluster。参数设置为&#34; PSOCK&#34;,&#34; SOCK&#34;,&#34; MPI&#34;或者&#34; NWS&#34;因为这些是当前版本的parallel支持的唯一支持在多个节点上执行的集群类型。如果您正在使用由知识渊博的HPC系统管理员管理的群集,则应使用&#34; MPI&#34;否则可能更容易使用&#34; PSOCK&#34; (或&#34; SOCK&#34;如果您有特殊原因使用&#34; snow&#34;包裹。)

如果您选择创建&#34; MPI&#34;你应该使用mpirun命令和#34; -n 1&#34;选项,makeCluster的第一个参数设置为应该生成的工作者数量。 (如果你不知道这意味着什么,你可能不想使用这种方法。)

如果您选择创建&#34; PSOCK&#34;或&#34; SOCK&#34;在集群中,makeCluster的第一个参数必须是主机名的向量,makeCluster将通过&#34; ssh&#34;在这些节点上启动工作人员。执行makeCluster时的命令。这意味着您必须在所有指定的主机上运行ssh守护程序。

我已在其他地方写过更多有关此主题的文章,但希望这有助于您开始使用。

答案 1 :(得分:2)

这是一个可以向您发送正确方向的部分答案

  

基于这篇相当古老的(2013)帖子   http://www.r-bloggers.com/the-wonders-of-foreach/似乎我   应该更改默认类型(fork到MPI,但为什么?会有效   在unix上?)

fork是一种在POSIX系统上生成后台进程的方法。在具有n核心的单个节点上,您可以并行生成n个进程并且可以正常工作。这不适用于多台机器,因为它们不共享内存。你需要一种方法来获取它们之间的数据。

MPI是一种在节点集群之间进行通信的便携方式。 MPI集群可以跨节点工作。

  

你可以使用雪功能是什么意思?我该怎么做?

snow是一个单独的包。要制作带有雪的16节点MPI群集,请执行cl <- makeCluster(16, type = "MPI"),但您需要在正确的环境中运行R,如Steve Weston的回答和in his answer to a similar question here所述。 (一旦运行它,您可能还需要修改循环以在每个节点上使用4个核心。)