R并行 - 连接到远程核心

时间:2014-08-26 14:30:25

标签: r parallel-processing

在Windows 7上的R 2.14.1中工作

使用R中的并行程序包,我正在尝试利用我的网络上可用的本地计算机以外的核心,我连接的所有远程主机都是相同的Windows计算机。

这些命令的基本形式就是建立连接。

library(parallel)
#assume 8 cores per machine
cl<-makePSOCKcluster(c(rep("localhost", 8), rep("otherhost", 8)))

当然,尝试调试这些东西可能相当棘手,但这就是我所处的位置。

如果我指定手动= TRUE标志如下

cl<-makePSOCKcluster(c(rep("localhost", 8), rep("otherhost", 8)), manual=TRUE)

连接到远程主机并运行并行进程没有问题。计算机与我正在使用的计算机具有相同的设置。但是,如果未设置此手动标志,则连接命令将挂起。

这似乎向我表明,由于手动标志绕过ssh以建立与主机的连接,因此当手动= FALSE时,该ssh是问题。

目前无法保证远程计算机上有ssh。问题是,鉴于我拥有远程主机的所有相关Windows登录信息,并且我无法更改远程计算机上的设置,如何在R 中将程序包并行连接到远程计算机上的核心指定manual = true?

或者,如果必须安装ssh才能实现此目的,让我们假设所有计算机都有ssh。如何在没有绕过ssh的情况下连接远程计算机上的核心?

如果您需要更多信息,请告诉我,我很感激时间。

更新1

14年8月26日

感谢Steve Weston的见解。我将提供一个更新,其中包含我使用的确切工具和设置,以便在系统启动并运行时使其正常工作。

如果您还有其他任何内容需要添加,可以通过makePSOCKcluster从Windows机器远程连接到Windows机器的最佳路径,其中手动标志设置为FALSE,请随意发表评论或发布。< / p>

2 个答案:

答案 0 :(得分:3)

使用manual=FALSE创建PSOCK群集时,在远程计算机上启动工作人员的唯一方法是使用&#34; ssh&#34;,&#34; rsh&#34;或其他命令 - 行兼容,例如&#34; plink&#34;来自PuTTY。原因是makePSOCKcluster使用&#34;系统&#34;启动远程工作者。函数执行以下形式的命令:

ssh -l user otherhost '/usr/lib/R/bin/Rscript' -e 'parallel:::.slaveRSOCK()' MASTER=myhost PORT=10187 OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE

您可以通过查看并行程序包中snowSOCK.R文件中newPSOCKnode函数的源代码来确认这一点。

为此,ssh-compatible命令必须在本地计算机上可用,并且必须在每台远程计算机上运行相应的ssh守护程序,否则makePSOCKcluster将挂起。我发现在Windows上安装一个好的,工作正常的ssh守护进程是困难的部分。

不幸的是,manual=TRUE通常是在多台Windows机器上创建PSOCK群集的最简单方法。

答案 1 :(得分:0)

帮助大家,我遇到了同样的问题,我设法解决了这个问题。 2018年6月,当我写这个答案时,我的操作系统是Windows 10,R版本是3.2.2。令人惊讶的是,这个问题在4年后仍然存在。我希望它可以在以下版本中修复。

在继续之前,请确保您可以使用ssh访问cmd中的服务器。我没有在我的代码中输入任何密码,因为我有私钥,你不需要这样做,你会在以后看到原因。

解决问题

  1. 文件目录
  2. 由于函数makePSOCKcluster在手动启动worker时起作用,我的第一个尝试是让manual = TRUE,看看输出是什么。这是我的结果:

    machineAddresses <-list(list(host='192.168.1.220',user='jeff'))
    cl <- makePSOCKcluster(spec,manual = F)
    > Manually start worker on 192.168.1.220 with
         "C:/PROGRA~1/R/R-32~1.2/bin/x64/Rscript" -e 
    "parallel:::.slaveRSOCK()" MASTER=DESKTOP-U5JA32O PORT=11756 
    OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE 
    

    好的,这是第一个问题。 Rscript位置不正确(服务器中Rscript的位置)。通常,它位于C:\ Program Files中。在我的服务器是C:\ Program Files \ R \ R-3.2.2 \ bin。所以我们需要通过添加更多选项来纠正它们,以告诉这个愚蠢的代码,其中Rscript是:

    machineAddresses <-list(list(host='192.168.1.220',
    user='jeff',rscript="C:/Program Files/R/R-3.3.2/bin/Rscript"))
    
    1. CMD问题
    2. 修复目录问题后,您会发现代码仍然永远挂起。然后我们需要检查是否可以手动访问R中的服务器,我的代码是:

      system("ssh jeff@192.168.1.220")
      > GetConsoleMode on STD_INPUT_HANDLE failed with 6
      

      老实说,我不知道这个错误意味着什么,但我们只需要解决这个问题。在@Steve Weston的启发下,我决定使用PuTTY,所以我安装它,并将我的代码更改为:

      machineAddresses <-list(list(host='192.168.1.220',user='jeff',rscript="C:/Program Files/R/R-3.3.2/bin/Rscript",rshcmd="plink -pw qwer"))
      

      选项-pw表示密码。因为我是PuTTY的新手,所以我不知道如何让私钥在PuTTY中自动运行。因此,我用最简单的方法来处理:输入你的密码!上面的代码等同于cmd中的以下内容:

      plink -pw qwer jeff@192.168.1.220 Rscript -e parallel:::.slaveRSOCK() MASTER=DESKTOP-U5JA32O PORT=11063 OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE
      

      如果我们手动创建工作人员,这正是我们要做的。对于像我这样的新手,你需要在环境变量的PATH中添加PuTTY目录来运行plink。以下是我的最终代码:

      machineAddresses <-list(list(host='192.168.1.220',user='jeff',rscript="C:/Program Files/R/R-3.3.2/bin/Rscript",rshcmd="plink -pw qwer"))
      cl <- makePSOCKcluster(machineAddresses,manual = F)
      

      我毫无问题地运行它。总之,函数makePSOCKcluster犯了两个错误:

      1. 假设服务器中有一个错误的R目录(至少它应该与我的本地计算机假设相同的目录,但它没有!我不知道那个奇怪的目录来自哪里)

      2. 使用ssh命令启动连接,这在R中不起作用。它适用于cmd,但不适用于R.我不知道原因。

      3. 如果仍然无法使用makePSOCKcluster,这里有一个技巧:尝试首先使用系统函数连接到R中的服务器。它可以为您提供一些错误代码,可以指示您问题所在。这是我的调试代码:

        system("plink -pw qwer jeff@192.168.1.220 Rscript -e parallel:::.slaveRSOCK() MASTER=DESKTOP-U5JA32O PORT=11063 OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE")