r-未来的解决方案



我使用的是一个大型数据集,用于进行某些计算。由于这是一个巨大的数据集,我正在工作的机器做这项工作的时间过长,因此我决定使用未来的软件包,以便在多台机器之间分配工作并加快计算速度。因此,我的问题是,在未来(使用putty&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对象应该是并行完成的,但主机完成了所有的工作,所以我有点困惑是否可以对此做点什么。

附言:我试过plan()remote, multiprocess, multisession, cluster,但什么都没有。

PS2:我的本地机器是Windows,并尝试连接到Kubuntu和Debian(所有这些都关闭了防火墙(。

Thnx。

这里是未来的作者。首先,确保您可以设置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-07-31:继续回答关于在未来使用source()的问题。

相关内容

最新更新