未来的解决方案

时间:2018-07-25 07:24:28

标签: r windows ubuntu debian future

我正在处理一个大型数据集,该数据集用于进行某些计算。由于这是一个庞大的数据集,因此我正在研究的机器正在做的工作时间过长,因此,我决定使用将来的软件包来在多台机器之间分配工作并加快计算速度。 因此,我的问题是,在将来(使用腻子和ssh)我可以(并行)连接到这些机器,但是工作本身就是主要的机器,没有任何分配。也许您可以建议一些解决方案:

  • 如何使其在所有机器上都能正常工作;
  • 同样,如何检查过程是否正常(我的意思是某些功能或任何可以帮助验证这些功能的功能,如果存在的话)。

我的代码:

library(future)
workers <- c("000.000.0.000", "111.111.1.111")
plan(remote, envir = parent.frame(), workers= workers, myip = "222.222.2.22")
start <- proc.time()
cl <- makeClusterPSOCK(
 c("000.000.0.000", "111.111.1.111"), user = "...", 
rshcmd = c("plink", "-ssh", "-pw",  "..."),  
rshopts = c("-i", "V:\\vbulavina\\privatekey.ppk"),
homogeneous = FALSE))
setwd("V:/vbulavina/r/inversion")
a <- source("fun.r")
f <- future({source("pasos.r")})
l <- future({source("pasos2.R")})
time_elapsed_parallel <- proc.time() - start
time_elapsed_parallel
f和l对象应该并行完成,但是主计算机正在完成所有工作,因此,如果我可以做一些与之相关的事情,我会有些困惑。

PS:我尝试使用plan()remote, multiprocess, multisession, cluster,什么也没做。

PS2:我的本地计算机是Windows,请尝试连接到Kubuntu和Debian(所有防火墙均已关闭)。

事先感谢。

1 个答案:

答案 0 :(得分:0)

此处是future的作者。首先,请确保您可以设置PSOCK集群,即通过SSH连接到两个工作进程并在其上运行Rscript。您可以这样做:

library(future)
workers <- c("000.000.0.000", "111.111.1.111")
cl <- makeClusterPSOCK(workers, user = "...",
                       rshcmd = c("plink", "-ssh", "-pw",  "..."),
                       rshopts = c("-i", "V:/vbulavina/privatekey.ppk"),
                       homogeneous = FALSE)
print(cl)
### socket cluster with 2 nodes on hosts '000.000.0.000', '111.111.1.111'

(如果上述makeClusterPSOCK()停滞或不起作用,请添加参数verbose = TRUE以获取更多信息-请随时在此处报告。)

接下来,在建立PSOCK集群后,告诉将来的系统对这两个工作器进行并行化处理:

plan(cluster, workers = cl)

测试期货实际上是远程解决的,例如

f <- future(Sys.info()[["nodename"]])
print(value(f))
### [1] "000.000.0.000"

我现在剩下剩下的部分,也需要进行调整-让我们确保首先让工人启动并运行。

在并行处理中继续使用source()会使事情复杂化,尤其是在不同机器上完成并行化时。例如,在另一台计算机上调用source("my_file.R")要求文件my_file.R在该计算机上也可用。即使是这样,在自动识别需要导出到外部计算机的变量时,也会使事情变得复杂。一种更安全的方法是将所有代码合并到主脚本中。说完这些,您可以尝试替换:

f <- future({source("pasos.r")})
l <- future({source("pasos2.R")})

使用

futureSource <- function(file, envir = parent.frame(), ...) {
  expr <- parse(file)
  future(expr, substitute = FALSE, envir = envir, ...)
}

f <- futureSource("pasos.r")
l <- futureSource("pasos2.R")

只要内部没有pasos.rpasos2.R调用source(),此c /就应该起作用。

顺便说一句,您正在使用什么版本的Windows?因为在最新的Windows 10中,您具有对SSH的内置支持,所以不再需要使用PuTTY。

更新2018年7月31日:关于在未来使用source()的问题,请继续回答。