5

以下(简化)脚本在unix群集(4个虚拟内核)的主节点上正常工作。R foreach:从单机到群集

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上工作?)

编辑

从这vignette通过的foreach作者:

默认情况下,doParallel使用在类Unix 系统和诺孚多核功能在Windows上的功能。请注意,多核心 功能只能在单台计算机上运行任务,而不是在计算机上运行任何群集。但是,您可以使用下雪功能在群集上执行 ,使用类Unix操作系统,Windows或甚至组合。

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

+1

我没有使用for循环... – Antoine

+0

我建议下载Revolution R open,它改进了统计库和多核支持。 [检查我的答案关于这个职位RRO的更多信息](http://stackoverflow.com/questions/31900708/how-can-i-get-r-to-use-more-cpu-usage/33996564#33996564) 。这与你的问题没有直接关系,但它会加快任何可以使用多核的数学计算和封装。 – Bas

回答

6

parallel包是multicoresnow包的合并,但如果要在多个节点上运行,你必须在parallel使用的“雪的功能”(也就是parallel的一部分源自snow)。实际上,这意味着您需要拨打makeCluster,将“type”参数设置为“PSOCK”,“SOCK”,“MPI”或“NWS”,因为这些是当前版本parallel支持的唯一群集类型,在多个节点上执行。如果您使用的是由知识丰富的HPC系统管理员管理的群集,则应该使用“MPI”,否则使用“PSOCK”(或“SOCK”,如果您有特殊原因需要使用“snow”包)。

如果您选择创建“MPI”集群,你应该经由R个使用带有“-n 1”选项mpirun命令执行脚本,第一个参数makeCluster组工人应该是数量催生。 (如果您不知道这意味着什么,则可能不想使用此方法。)

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

我已经写了更多关于这个问题的其他地方,但希望这会帮助你开始。

+0

安装'Rmpi'软件包很痛苦,但我终于成功了。当我按照以下答案的建议并使用'makeCluster(16,type =“MPI”)创建并行后端时,R会话被终止,并且我得到一个seg fault错误(在linux shell上)。所以看起来,使它工作的唯一方法就是像你说的那样使用'mpirun',但这看起来很复杂 – Antoine

+0

@Antoine如果R seg出现故障,我猜Rmpi安装不正确。您是否尝试过使用带有主机名向量的PSOCK群集,或者遇到ssh问题? –

+1

@Antoine如果你想使用Rmpi使用多个节点,* *可以通过mpirun执行你的R脚本。如果您不使用mpirun从R脚本执行'makeCluster(16,type =“MPI”)',则所有16位工作人员将在本地机器上启动。我想这甚至可能是seg故障的原因。 –

2

这里是一个可以根据您发送了正确的方向

这个很老了部分答案(2013年)后 http://www.r-bloggers.com/the-wonders-of-foreach/看来我 要更改默认的类型(叉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个内核。)

+0

当我执行makeCluster(16,type =“MPI”)命令时,R会话被终止,我得到一个seg fault错误(在linux shell上)。你知道如何解决这个问题吗? – Antoine