如何使用降雪和多个Windows节点在R中设置工作线程以进行并行处理? [英] How to setup workers for parallel processing in R using snowfall and multiple Windows nodes?

查看:25
本文介绍了如何使用降雪和多个Windows节点在R中设置工作线程以进行并行处理?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经成功地使用Snow Fall在具有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。虽然这似乎是可能的,但我还没有找到关于如何做到这一点的明确和完整的指导。

袜子路由似乎依赖于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上的Snow包下找到了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 = ":"), "
")
    slaveLoop(makeSOCKmaster(master, port))
})

不清楚如何在工作进程上实际启动SOCK侦听程序,除非它被掩埋在snow::recvData中。

查看MPI路径,据我所知,Microsoft MPI版本7是一个起点。然而,我找不到替代sfCluster的Windows。我能够启动MPI服务,但它似乎没有在端口22上侦听,并且使用snowfall::makeCluster对它进行的任何攻击都没有产生任何结果。我已经禁用了防火墙,并尝试使用Make群集进行测试,并使用PuTTY直接从主服务器连接到Worker。


有没有我错过的关于在Windows工人身上设置降雪集群的全面、循序渐进的指南?我喜欢snowfall::sfClusterApplyLB,并希望继续使用它,但如果有更简单的解决方案,我愿意改变路线。在RMPI和并行方面,我为工作的主端找到了替代的解决方案,但关于如何设置运行Windows的Worker的具体细节仍然很少或没有具体细节。

由于工作环境的性质,不能选择迁移到AWS或Linux。

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

推荐答案

考虑了几种HPC基础结构:MPICH、Open MPI和MS MPI。最初尝试使用MPICH2,但放弃了,因为Windows的最新稳定版本1.4.1可以追溯到2013年,从那时起就没有支持了。Windows不支持Open MPI。则只剩下MS MPI选项。

遗憾的是,snowfall不支持MS MPI,因此我决定使用默认支持MS MPI的pbdMPI包。pbdMPI实现SPMD范例,而Rmpi使用管理器/工作进程并行。

MS MPI安装、配置和执行

  1. 在未来Windows HPC群集中的所有计算机上安装MS MPI v.10.1.2
  2. 创建R脚本/资源将驻留的所有节点都可以访问的目录,例如HeadMachineSharedDir
  3. 检查MS MPI启动服务(MsMpiLaunchSvc)是否在所有节点上运行。
  4. 检查MS MPI是否有权代表同一用户在所有节点上运行R应用程序,即SharedUser。所有计算机的用户名和密码必须相同。
  5. 选中,R应代表SharedUser用户启动。
  6. 最后,使用步骤7-10中提到的以下选项执行mpiexec
Mpiexec.exe-n%1-machinefile";C:MachineFileDirhost s.txt";-pwd SharedUserPassword-wdir";HeadMachineSharedDir";Rscript hello.R

在哪里

  • -wdir是指向具有共享资源的目录的网络路径。
  • -pwdSharedUser用户的密码,例如SharedUserPassword
  • -machinefile是指向Hosts.txt文本文件的路径,例如С:MachineFileDirhost s.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(),"!
")
finalize()

host s.txt

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

Hosts.txt示例,三个节点各有两个处理器:

192.168.0.1 2
192.168.0.2 2
192.168.0.3 2

这篇关于如何使用降雪和多个Windows节点在R中设置工作线程以进行并行处理?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆