如何使用降雪和多个Windows节点为R中的并行处理设置工作人员?

时间:2016-03-30 01:00:14

标签: r windows parallel-processing cluster-computing snowfall

我已成功使用降雪功能在具有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

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

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工作点节点明确答案的相关问题:

0 个答案:

没有答案