R连接到EC2实例以进行并行处理

h.l*_*l.m 14 parallel-processing foreach r amazon-ec2 snowfall

我无法从R初始化与AWS EC2实例的连接,因为我似乎一直在收到错误:Permission denied (publickey)我目前正在使用Mac OS X 10.6.8作为我的操作系统

我尝试在终端($)和R(>)中运行的代码如下:

$ R --vanilla
> require(snowfall)
> sfInit(parallel=TRUE,socketHosts =list("ec2-xx-xxx-xx-xx.zone.compute.amazonaws.com"))
Permission denied (publickey)
Run Code Online (Sandbox Code Playgroud)

但奇怪的是,当我尝试ssh到实例时,我不需要密码,因为我已经在初始化时将公钥导入实例,(我认为)

所以从我的正常终端...跑步时

$ ssh ubuntu@ec2-xx-xxx-xx-xx.zone.compute.amazonaws.com
Run Code Online (Sandbox Code Playgroud)

它会自动连接...(所以我不是100%确定它是否是无密码问题,例如在AWS使用雪(和降雪)在R中进行并行处理)

我试过在键等上查看相当数量的材料,但似乎没有任何差别.我~/.ssh/authorized_keys也是一个文件夹而不是文件由于某种原因,我甚至在尝试时都无法访问它sudo cd .ssh/authorized_keys...在权限方面drw-------

最终的目标是连接到很多ec2实例并foreach用来执行一些并行处理...但是现在连接到一个也很好...我也想使用我自己的ami所以starcluster不是我真正想要的......(除非我能够使用私有amis并私下运行所有​​命令......)

另外如果doRedis比有人能告诉我如何从本地机器连接到ec2实例那样好,那也是好的...

编辑

我已经设法使用parallel包来处理ssh无密码登录makePSOCKcluster,如R和makePSOCKcluter EC2 socketConnection所示 ......但现在遇到的socketConnection问题如链接中的问题所示...

任何想法如何连接到它?

还证明一切正常,我想这意味着以下命令/函数可以用于获取所有不同的IP地址

d <- parLapply(cl1, 1:length(cl1),function(x)system("ifconfig",intern=T)[2])
Run Code Online (Sandbox Code Playgroud)

函数cl1的输出在哪里make*cluster

注意,因为赏金真的是针对链接中的问题....我不介意你提出哪个问题的答案...但只要在这个问题上写了一些东西就把它与正确的答案联系起来关于相关问题,那么我将相应地奖励积分......

The*_*ell 8

在尝试将主节点保持在本地时,我也遇到了很多关于并行EC2设置的问题.使用StarCluster来设置池有很大帮助,但真正的改进来自于使用StarCluster 在EC2私有IP池中拥有主节点.

StarCluster为所有节点以及所使用的任何安装设置所有密钥处理.动态节点分配不可行,但除非现场实例将长期使用且您的出价策略不"保留"您的实例,否则动态分配应该是一个问题.

其他一些经验教训:

  • 创建一个包含要传递给createCluster并将其导出的私有IP的变量,因此当您需要使用相同的节点重新启动时,它更容易.
  • 让主节点运行byobu并将其设置为R会话日志记录.
  • 在主服务器上运行RStudio服务器有时可能非常有用,但应该是与从属节点不同的AMI.:)
  • 让控制脚本将数据rda文件卸载到远程监视新文件的路径并自动下载它们.
  • 使用htop监视从属设备,以便您可以轻松查看实例并确定脚本要求(内存/ CPU /可伸缩性).
  • 利用处理器超线程启用/禁用脚本.

我对slave连接和serialize/unserialize有一个很大的问题,发现其中一个是连接限制,并且连接限制需要减少节点数量; 当控制脚本停止时,最简单的清理方法是重新启动主R会话,并使用脚本终止从属进程而不是等待超时.

设置确实需要一些工作,但希望这些想法有助于......


虽然是8个月之前,StarCluster和R都改变了这里的一些设置......你会在StarCluster文档中找到90%.

  • 设置.starcluster/config基于AWS控制台的seurity信息的AWS和密钥对部分.
  • 定义[smallcluster]
    • 键名
    • 可用性区
  • 定义扩展[smallcluster]的集群模板.使用基于StarCluster 64位HVM AMI的AMI.我没有创建新的公共AMI实例,而是保存了一个已配置的实例(包含我需要的所有工具),并将其用作AMI.

这是一个例子......

[cluster Rnodes2]
EXTENDS=smallcluster
MASTER_INSTANCE_TYPE = cc1.4xlarge
MASTER_IMAGE_ID= ami-7621f91f
NODE_INSTANCE_TYPE = cc2.8xlarge
NODE_IMAGE_ID= ami-7621f91f
CLUSTER_SIZE= 8
VOLUMES= rdata
PLUGINS= pkginstaller
SPOT_BID= 1.00
Run Code Online (Sandbox Code Playgroud)
  • 设置共享卷,这是屏幕/ byoubu日志,主.R脚本检查点输出,共享R数据和生产包的源实时的位置.它被监视在名为export的子路径中的新文件中,因此如果群集或控制脚本死亡/被滥用,则最大数量的记录将丢失并需要重新计算.

创建共享卷后,定义只是:

[volume rdata]
VOLUME_ID = vol-1145497c
MOUNT_PATH = /rdata
Run Code Online (Sandbox Code Playgroud)

软件包安装程序确保所有节点上的最新(和相同)R版本.

[plugin pkginstaller]
setup_class = starcluster.plugins.pkginstaller.PackageInstaller
packages = r-base, r-base-dev, r-recommended
Run Code Online (Sandbox Code Playgroud)

最后,访问ssh和RStudio服务器的权限.通过代理的Https会更安全,但由于RStudio仅用于控制脚本设置...

[permission ssh]
# protocol can be: tcp, udp, or icmp
protocol = tcp
from_port = 22
to_port = 22

# [permission http]
protocol = tcp
from_port = 8787
to_port = 8787
Run Code Online (Sandbox Code Playgroud)

然后使用StarCluster接口启动集群.它处理所有访问控制,系统名称,共享等...一旦集群运行,我就从本地系统运行ssh会话,并运行脚本来停止超线程:

#!/bin/sh

# disable hyperthreading
for cpunum in $(
    cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | 
    cut -s -d, -f2- | tr ',' '\n' | sort -un); do
        echo 0 > /sys/devices/system/cpu/cpu$cpunum/online
done
Run Code Online (Sandbox Code Playgroud)

然后在每个会话上启动htop会话,以监控导出的检查点日志的可伸缩性.

然后,登录到主服务器,启动一个屏幕会话(我已经更喜欢byobu)并从StarCluster安装的卷中启动R.这样当集群由于某种原因停止时,我可以通过启动R轻松地再次设置.一旦在R中,第一件事是workers.list使用nodeXXX名称创建变量,这简直就是:

cluster.nodes <- c("localhost", paste("node00", 1:7, sep='' ) )
workers.list <- rep( cluster.nodes, 8 )
Run Code Online (Sandbox Code Playgroud)

然后我加载了控制脚本,退出并保存了工作区.控制脚本处理导出和检查点的所有表输出以及生产包的par包装调用.该脚本的主要功能还采用了一个cpus参数,该参数是放置工作者列表的位置,然后将其传递cores给集群初始化程序.

initialize.cluster <- function( cores )
{
  if( exists( 'cl' ) ) stopCluster( cl )

  print("Creating Cluster")
  cl <- makePSOCKcluster( cores )    
  print("Cluster created.")
  assign( 'cl', cl, envir=.GlobalEnv )
  print( cl )

  # All workers need to have the bounds generator functions...
  clusterEvalQ( cl, require('scoreTarget') )
  # All workers need to have the production script and package.
  clusterExport( cl, varlist=list('RScoreTarget', 'scoreTarget'))
  return ( cl )
}
Run Code Online (Sandbox Code Playgroud)

一旦R会话重新启动(在最初创建worker.list之后),控制脚本就被获取,并且主要的func被调用.就是这样.通过这种设置,如果集群停止了,我只是退出主机上的rsession; 通过每个从站上的htop停止从站进程并再次启动.

这是一个行动的例子::

R

R version 2.15.0 (2012-03-30)
Copyright (C) 2012 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

  Natural language support but running in an English locale

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

[Previously saved workspace restored]

> source('/rdata/buildSatisfactionRangeTable.R')
Loading required package: data.table
data.table 1.7.7  For help type: help("data.table")
Loading required package: parallel
Loading required package: scoreTarget
Loading required package: Rcpp
> ls()
 [1] "build.satisfaction.range.table" "initialize.cluster"            
 [3] "initialize.table"               "parallel.choices.threshold"    
 [5] "rolled.lower"                   "rolled.upper"                  
 [7] "RScoreTarget"                   "satisfaction.range.table"      
 [9] "satisfaction.search.targets"    "search.range.bound.offsets"    
[11] "search.range.bounds"            "search.range.center"           
[13] "Search.Satisfaction.Range"      "update.bound.offset"           
[15] "workers.list"                  
> workers.list
  [1] "localhost" "localhost" "localhost" "localhost" "localhost" "localhost"
  [7] "localhost" "localhost" "node001"   "node002"   "node003"   "node004"  
 [13] "node005"   "node006"   "node007"   "node001"   "node002"   "node003"  
 [19] "node004"   "node005"   "node006"   "node007"   "node001"   "node002"  
 [25] "node003"   "node004"   "node005"   "node006"   "node007"   "node001"  
 [31] "node002"   "node003"   "node004"   "node005"   "node006"   "node007"  
 [37] "node001"   "node002"   "node003"   "node004"   "node005"   "node006"  
 [43] "node007"   "node001"   "node002"   "node003"   "node004"   "node005"  
 [49] "node006"   "node007"   "node001"   "node002"   "node003"   "node004"  
 [55] "node005"   "node006"   "node007"   "node001"   "node002"   "node003"  
 [61] "node004"   "node005"   "node006"   "node007"   "node001"   "node002"  
 [67] "node003"   "node004"   "node005"   "node006"   "node007"   "node001"  
 [73] "node002"   "node003"   "node004"   "node005"   "node006"   "node007"  
 [79] "node001"   "node002"   "node003"   "node004"   "node005"   "node006"  
 [85] "node007"   "node001"   "node002"   "node003"   "node004"   "node005"  
 [91] "node006"   "node007"   "node001"   "node002"   "node003"   "node004"  
 [97] "node005"   "node006"   "node007"   "node001"   "node002"   "node003"  
[103] "node004"   "node005"   "node006"   "node007"   "node001"   "node002"  
[109] "node003"   "node004"   "node005"   "node006"   "node007"   "node001"  
[115] "node002"   "node003"   "node004"   "node005"   "node006"   "node007"  
> build.satisfaction.range.table(500000, FALSE, workers.list )
[1] "Creating Cluster"
[1] "Cluster created."
socket cluster with 120 nodes on hosts ‘localhost’, ‘node001’, ‘node002’, ‘node003’, ‘node004’, ‘node005’, ‘node006’, ‘node007’
Parallel threshold set to: 11000 
Starting at: 2 running to: 5e+05 :: Sat Apr 14 22:21:05 2012 
Run Code Online (Sandbox Code Playgroud)

如果您已经阅读了这里,那么您可能有兴趣知道我测试了每个群集设置(包括openMPI)并发现没有速度差异,也许这是因为我的计算所在的CPU绑定,也许不是.

此外,即使与HPC合作可能会很痛苦,也不要放弃.这完全是值得的.我仍然在等待完成我运行的计算的前100,000次迭代,如果我在商品工作站上坚持使用base-R中的天真实现(好吧,不是因为我永远不会坚持使用R:D).通过集群,在一周内完成了384,000次迭代.完全值得花时间(并且需要花费很多时间)才能进行设置.