【发布时间】:2016-03-30 01:00:13
【问题描述】:
我已经成功地使用降雪在具有 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 上的 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 = ":"), "\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 工作节点没有明确答案的相关问题:
【问题讨论】:
-
我将尝试给你一个真正的答案,但我还要提到,有一个基于 Debian 的 Linux 发行版,用于分布式/集群 HPC 建模,由一位非常优秀的计量经济学家创建,之前来自加州大学戴维斯分校,它被称为 PelicanHPC。几年前他不再支持它,但它仍然很好用,并且可以在 DistroWatch.org 上找到。在多台计算机上进行设置很简单。 DistroWatch 上也有 Rocks Cluster,但我并没有在那个发行版上走得太远,因为他们启动时一堆蛇的标志让我很困扰。
-
为了与 R 进行集群,最新的 Ubuntu 发行版和 PelicanHPC 发行版有什么区别?如果 Windows 没有前进的道路,这可能是唯一的路线。
-
@jclouse 作为在 Windows 上使用 R 完成多线程、分布式计算的人,我首先想说的是,我很抱歉。我发现 Windows 上对此的支持和文档非常差。我的下一个问题是,您真的需要从同一台计算机生成所有任务,还是您可以对数据进行子集化并让每台计算机处理它们自己的数据子集?我不得不在生产中做这种事情,调试和维护非常痛苦。我知道这不能回答你的问题,但我想警告你,R、Windows 和分布式计算会很痛苦
-
@jclouse
doRedis的解决方案能满足您的要求吗? 我问doRedis可以在本地工作以利用多核系统,也可以将任务分配给远程 R 实例(“工人”)。在运行时(即使在工作中)添加或删除工作人员也很简单,以适应不断变化的工作条件或加快工作处理。它适用于 Windows、Linux 和 MacOSX。 bigcomputing.com/doRedis.html 您只是想要一份在 Windows 上设置降雪集群的具体分步指南吗? - 只需在详细回复之前检查一下即可。 -
我知道这(也)与降雪无关,但我在这方面(设置工人和利用工人等)的期货 (cran.r-project.org/web/packages/future/future.pdf) 包方面有很好的经验。
标签: r windows parallel-processing cluster-computing snowfall