104

我已经成功地使用降雪在具有 16 个处理器的单个服务器上设置了一个集群。

require(snowfall)
if (sfIsRunning() == TRUE) sfStop()

number.of.cpus <- 15
sfInit(parallel = TRUE, cpus = number.of.cpus)
stopifnot( sfCpus() == number.of.cpus )
stopifnot( sfParallel() == TRUE )

# Print the hostname for each cluster member
sayhello <- function()
{
    info <- Sys.info()[c("nodename", "machine")]
    paste("Hello from", info[1], "with CPU type", info[2])
}
names <- sfClusterCall(sayhello)
print(unlist(names))

现在,我正在寻找有关如何迁移到分布式模型的完整说明。我有 4 台不同的 Windows 机器,总共有 16 个内核,我想将它们用于 16 节点集群。到目前为止,我知道我可以手动设置 SOCK 连接或利用 MPI。虽然看起来有可能,但我还没有找到关于如何做的明确和完整的指示。

SOCK 路由似乎依赖于 snowlib 脚本中的代码。我可以使用以下代码从主端生成存根:

winOptions <-
    list(host="172.01.01.03",
         rscript="C:/Program Files/R/R-2.7.1/bin/Rscript.exe",
         snowlib="C:/Rlibs")

cl <- makeCluster(c(rep(list(winOptions), 2)), type = "SOCK", manual = T)

它产生以下结果:

Manually start worker on 172.01.01.03 with
     "C:/Program Files/R/R-2.7.1/bin/Rscript.exe"
      C:/Rlibs/snow/RSOCKnode.R
      MASTER=Worker02 PORT=11204 OUT=/dev/null SNOWLIB=C:/Rlibs

感觉是一个合理的开始。我RSOCKnode.R在 GitHub 上的 snow 包下找到了代码:

local({
    master <- "localhost"
    port <- ""
    snowlib <- Sys.getenv("R_SNOW_LIB")
    outfile <- Sys.getenv("R_SNOW_OUTFILE") ##**** defaults to ""; document

    args <- commandArgs()
    pos <- match("--args", args)
    args <- args[-(1 : pos)]
    for (a in args) {
        pos <- regexpr("=", a)
        name <- substr(a, 1, pos - 1)
        value <- substr(a,pos + 1, nchar(a))
        switch(name,
               MASTER = master <- value,
               PORT = port <- value,
               SNOWLIB = snowlib <- value,
               OUT = outfile <- value)
    }

    if (! (snowlib %in% .libPaths()))
        .libPaths(c(snowlib, .libPaths()))
    library(methods) ## because Rscript as of R 2.7.0 doesn't load methods
    library(snow)

    if (port == "") port <- getClusterOption("port")

    sinkWorkerOutput(outfile)
    cat("starting worker for", paste(master, port, sep = ":"), "\n")
    slaveLoop(makeSOCKmaster(master, port))
})

目前尚不清楚如何在工作人员上实际启动 SOCK 侦听器,除非它被埋在snow::recvData.

调查MPI 路线,据我所知,Microsoft MPI 版本 7 是一个起点。但是,我找不到 sfCluster 的 Windows 替代方案。我能够启动 MPI 服务,但它似乎没有在端口 22 上进行侦听,并且对它的任何抨击都没有snowfall::makeCluster产生结果。我已禁用防火墙并尝试使用 makeCluster 进行测试,并使用 PuTTY 直接从 master 连接到 worker。


是否有我错过的在 Windows 工作人员上设置降雪集群的全面分步指南?我喜欢snowfall::sfClusterApplyLB并希望继续使用它,但如果有更简单的解决方案,我愿意改变方向。研究 Rmpi​​ 和并行,我找到了工作的主要方面的替代解决方案,但仍然很少或没有关于如何设置运行 Windows 的工作人员的具体细节。

由于工作环境的性质,既不能迁移到 AWS,也不能迁移到 Linux。

对于 Windows 工作节点没有明确答案的相关问题:

4

1 回答 1

0

考虑了 HPC 基础架构的几个选项:MPICH、Open MPI 和 MS MPI。最初尝试使用MPICH2,但放弃了作为 2013 年最新的 Windows 稳定版本 1.4.1 并且从那时起不再支持。Windows 不支持 Open MPI。然后只剩下 MS MPI 选项。

不幸snowfall的是不支持 MS MPI,所以我决定使用 pbdMPI默认支持 MS MPI 的包。与使用管理器/工作器并行性的 相比,pbdMPI实现了SPMD范式。Rmpi

MS MPI 安装、配置和执行

  1. 在未来的 Windows HPC 集群中的所有机器上安装MS MPI v.10.1.2 。
  2. 创建一个所有节点都可以访问的目录,其中 R-scripts / 资源将驻留,例如\HeadMachine\SharedDir
  3. 检查 MS MPI 启动服务 ( MsMpiLaunchSvc ) 是否在所有节点上运行。
  4. 检查,MS MPI 有权代表同一用户在所有节点上运行 R 应用程序,即SharedUser。所有机器的用户名和密码必须相同。
  5. 检查是否应该代表SharedUser用户启动 R。
  6. 最后,使用步骤 7-10 中提到的以下选项执行mpiexec :

mpiexec.exe -n %1 -machinefile "C:\MachineFileDir\hosts.txt" -pwd SharedUserPassword –wdir "\HeadMachine\SharedDir" Rscript hello.R

在哪里

  • -wdir是具有共享资源的目录的网络路径。
  • –pwdSharedUser用户的密码,例如SharedUserPassword
  • –machinefilehosts.txt文本文件的路径,例如С:\MachineFileDir\hosts.txthosts.txt文件必须可以从指定路径的头节点读取,并且它包含要运行 R 脚本的节点的 IP 地址列表。
  1. 作为第 7 步的结果,MPI 将以SharedUser的身份使用密码SharedUserPassword登录,并在hosts.txt文件中列出的每台计算机上执行 R 进程的副本。

细节

你好.R

library(pbdMPI, quiet = TRUE)
init()
cat("Hello World from
process",comm.rank(),"of",comm.size(),"!\n")
finalize()

主机.txt

hosts.txt - MPI 机器文件 - 是一个文本文件,其中的行包含将启动 R 脚本的计算机的网络名称。在每一行中,计算机名称后用空格分隔(对于 MS MPI),要启动的 MPI 进程的数量。通常,它等于每个节点中的处理器数量。

hosts.txt示例,其中三个节点各有 2 个处理器:

192.168.0.1 2
192.168.0.2 2
192.168.0.3 2
于 2022-01-31T13:52:50.543 回答