以下(简化的)脚本在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/帖子,看来我应该更改默认类型(
sock
或MPI
-哪种类型可以在Unix上使用?)编辑
从foreach的作者的此vignette中:
you can use the snow functionality
是什么意思?我该怎么办? 最佳答案
parallel
包是multicore
和snow
包的合并,但是如果要在多个节点上运行,则必须利用parallel
中的“雪功能”(即parallel
的一部分,它是从snow
派生的) 。实际上,这意味着您需要将“type”参数设置为“PSOCK”,“SOCK”,“MPI”或“NWS”来调用makeCluster
,因为这些是当前受支持的parallel
版本唯一支持的群集类型。在多个节点上执行。如果您使用的是由经验丰富的HPC sysadmins管理的群集,则应使用“MPI”,否则,如果有特殊原因要使用“snow”程序包,则使用“PSOCK”(或“SOCK”)可能会更容易。 )。
如果选择创建“MPI”集群,则应使用带有“-n 1”选项的mpirun
命令通过R执行脚本,并将makeCluster
的第一个参数设置为应产生的工作程序数。 (如果您不知道这意味着什么,则可能不想使用此方法。)
如果选择创建“PSOCK”或“SOCK”集群,则makeCluster
的第一个参数必须是主机名的向量,并且在执行makeCluster
时,makeCluster
将通过“ssh”命令在这些节点上启动工作程序。这意味着您必须在所有指定的主机上运行ssh守护程序。
我已经在其他地方写了更多有关此主题的文章,但希望这会帮助您入门。
关于R foreach : from single-machine to cluster,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36794063/