R foreach:从单机到集群
R foreach: from single-machine to cluster
以下(简化的)脚本在 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) post http://www.r-bloggers.com/the-wonders-of-foreach/ 看来我应该更改默认类型(sock
或 MPI
- 哪一个 - 那会在 Unix 上工作?)
编辑
来自 foreach 作者的 vignette:
By default, doParallel uses multicore functionality on Unix-like
systems and snow functionality on Windows. Note that the multicore
functionality only runs tasks on a single computer, not a cluster of
computers. However, you can use the snow functionality to execute on
a cluster, using Unix-like operating systems, Windows, or even a
combination.
you can use the snow functionality
是什么意思?我应该怎么做?
这里有部分答案,可能会让您朝着正确的方向前进
Based on this quite old (2013) post
http://www.r-bloggers.com/the-wonders-of-foreach/ it seems that I
should change the default type (fork to MPI but why? would that work
on unix?)
fork
是在 POSIX 系统上生成后台进程的一种方式。在具有 n
个核心的单个节点上,您可以并行生成 n
个进程并进行工作。这不适用于多台机器,因为它们不共享内存。你需要一种在它们之间获取数据的方法。
MPI 是一种在节点集群之间进行通信的可移植方式。 MPI集群可以跨节点工作。
What does you can use the snow functionality mean? How should I do that?
snow
是一个单独的包。要制作一个 16 节点 MPI
的雪簇,请执行 cl <- makeCluster(16, type = "MPI")
但您需要在正确的环境中成为 运行 R,如 Steve Weston 的回答和 in his answer to a similar question here 所述。 (一旦你得到它 运行 你可能还需要修改你的循环以在每个节点上使用 4 个核心。)
parallel
包是multicore
和snow
包的合并,但是如果你想在多个节点上运行,你必须使用parallel
中的 "snow functionality"(即 parallel
中派生自 snow
的部分)。实际上,这意味着您需要调用 makeCluster
并将 "type" 参数设置为 "PSOCK"、"SOCK"、"MPI" 或 "NWS",因为那些是当前版本 parallel
支持的唯一支持在多个节点上执行的集群类型。如果您正在使用由知识渊博的 HPC 系统管理员管理的集群,您应该使用 "MPI",否则使用 "PSOCK"(或 "SOCK" 如果您有特殊原因可能会更容易使用 "snow" 包)。
如果您选择创建一个 "MPI" 集群,您应该使用带“-n 1”选项的 mpirun
命令通过 R 执行脚本,[=16 的第一个参数=] 设置为应该生成的工人数。 (如果你不知道那是什么意思,你可能不想使用这种方法。)
如果您选择创建 "PSOCK" 或 "SOCK" 集群,makeCluster
的第一个参数必须是主机名向量,并且 makeCluster
将在当执行 makeCluster
时,通过 "ssh" 命令的那些节点。这意味着您必须在所有指定的主机上安装 ssh 守护程序 运行ning。
我在其他地方写了很多关于这个主题的文章,但希望这能帮助您入门。
以下(简化的)脚本在 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) post http://www.r-bloggers.com/the-wonders-of-foreach/ 看来我应该更改默认类型(sock
或 MPI
- 哪一个 - 那会在 Unix 上工作?)
编辑
来自 foreach 作者的 vignette:
By default, doParallel uses multicore functionality on Unix-like systems and snow functionality on Windows. Note that the multicore functionality only runs tasks on a single computer, not a cluster of computers. However, you can use the snow functionality to execute on a cluster, using Unix-like operating systems, Windows, or even a combination.
you can use the snow functionality
是什么意思?我应该怎么做?
这里有部分答案,可能会让您朝着正确的方向前进
Based on this quite old (2013) post http://www.r-bloggers.com/the-wonders-of-foreach/ it seems that I should change the default type (fork to MPI but why? would that work on unix?)
fork
是在 POSIX 系统上生成后台进程的一种方式。在具有 n
个核心的单个节点上,您可以并行生成 n
个进程并进行工作。这不适用于多台机器,因为它们不共享内存。你需要一种在它们之间获取数据的方法。
MPI 是一种在节点集群之间进行通信的可移植方式。 MPI集群可以跨节点工作。
What does you can use the snow functionality mean? How should I do that?
snow
是一个单独的包。要制作一个 16 节点 MPI
的雪簇,请执行 cl <- makeCluster(16, type = "MPI")
但您需要在正确的环境中成为 运行 R,如 Steve Weston 的回答和 in his answer to a similar question here 所述。 (一旦你得到它 运行 你可能还需要修改你的循环以在每个节点上使用 4 个核心。)
parallel
包是multicore
和snow
包的合并,但是如果你想在多个节点上运行,你必须使用parallel
中的 "snow functionality"(即 parallel
中派生自 snow
的部分)。实际上,这意味着您需要调用 makeCluster
并将 "type" 参数设置为 "PSOCK"、"SOCK"、"MPI" 或 "NWS",因为那些是当前版本 parallel
支持的唯一支持在多个节点上执行的集群类型。如果您正在使用由知识渊博的 HPC 系统管理员管理的集群,您应该使用 "MPI",否则使用 "PSOCK"(或 "SOCK" 如果您有特殊原因可能会更容易使用 "snow" 包)。
如果您选择创建一个 "MPI" 集群,您应该使用带“-n 1”选项的 mpirun
命令通过 R 执行脚本,[=16 的第一个参数=] 设置为应该生成的工人数。 (如果你不知道那是什么意思,你可能不想使用这种方法。)
如果您选择创建 "PSOCK" 或 "SOCK" 集群,makeCluster
的第一个参数必须是主机名向量,并且 makeCluster
将在当执行 makeCluster
时,通过 "ssh" 命令的那些节点。这意味着您必须在所有指定的主机上安装 ssh 守护程序 运行ning。
我在其他地方写了很多关于这个主题的文章,但希望这能帮助您入门。