8

以下(简化的)脚本在 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 的作者的这个小插曲:

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

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

4

2 回答 2

9

parallel包是multicoresnow包的合并,但如果要在多个节点上运行,则必须使用中的“雪功能” parallel(即,其中的一部分parallel源自snow)。实际上,这意味着您需要在调用makeCluster时将“type”参数设置为“PSOCK”、“SOCK”、“MPI”或“NWS”,因为这些是当前版本parallel支持执行的唯一集群类型多个节点。如果您使用的是由知识渊博的 HPC 系统管理员管理的集群,则应使用“MPI”,否则使用“PSOCK”(或“SOCK”,如果您有特定理由使用“snow”包)可能更容易)。

如果您选择创建“MPI”集群,则应通过 R 使用mpirun带有“-n 1”选项的命令执行脚本,并将第一个参数makeCluster设置为应生成的工人数量。(如果您不知道这意味着什么,您可能不想使用这种方法。)

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

我在其他地方写了更多关于这个主题的文章,但希望这会帮助你开始。

于 2016-04-25T02:30:16.410 回答
1

这是一个部分答案,可能会让您朝着正确的方向前进

基于这个相当古老的(2013年)帖子 http://www.r-bloggers.com/the-wonders-of-foreach/似乎我应该更改默认类型(fork to MPI,但为什么?这适用于unix ?)

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

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

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

snow是一个单独的包。MPI要制作一个有雪的 16 节点集群,cl <- makeCluster(16, type = "MPI")但您需要在正确的环境中运行 R,正如 Steve Weston 的回答和他在此处对类似问题的回答中所描述的那样。(一旦运行起来,您可能还需要修改循环以在每个节点上使用 4 个内核。)

于 2016-04-22T21:29:56.037 回答