我已成功使用降雪在具有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))
Run Code Online (Sandbox Code Playgroud)
现在,我正在寻找有关如何迁移到分布式模型的完整说明.我有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)
Run Code Online (Sandbox Code Playgroud)
它产生以下结果:
Manually start worker on …Run Code Online (Sandbox Code Playgroud) 我无法从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
注意,因为赏金真的是针对链接中的问题....我不介意你提出哪个问题的答案...但只要在这个问题上写了一些东西就把它与正确的答案联系起来关于相关问题,那么我将相应地奖励积分......
我正在使用Windows 7上的降雪软件包进行模拟研究.
我喜欢每10次运行打印一条消息到主R控制台来监控进度,但它没有这样做.即.没有打印
任何帮助都感激不尽.
runsim = function(nsim,n,mean,var){
cov = 0
for(i in 1:nsim){
if ( i %% 10==0)
cat("\n Running simulation",i)
dat = function1(n,mean,var)
cov = ...
}
cov / nsim
}
sfExport("function1","runsim")
sfLibrary(library1)
wrapper = function(n){
runsim(100,n,0.5,0.25)
}
Out<-sfLapply(1:100,wrapper)
Run Code Online (Sandbox Code Playgroud) 我正在开发一个R包,需要使用snowfall包装提供的并行化.snowfall似乎没有导入同为其他包一样ggplot2,data.table等我已经包括snowfall,rlecuyer以及snow在描述文件,命名空间的文件,并在函数本身的进口参数.当我尝试访问此功能时,我收到以下错误:
Error in sfInit() : could not find function "setDefaultClusterOptions"
该sfInit函数似乎有一个nostart/ nostop参数,它表示与嵌套用法有关,sfInit但这对我来说似乎也没有.
实际的代码本身使用一个sfInit(我得到错误的地方),一些sfExports和sfLibrarys,以及一个sfLapply.
可能的解决方案:如果我snow从导入部分移动到Desciption文件中的depends部分,它似乎有效.我不知道为什么.
关于我之前的类似SO问题,我尝试在AWS上使用雪/降雪进行并行计算.
我做的是:
sfInit()函数中,我提供了公共DNS到这样的socketHosts参数
sfInit(parallel=TRUE,socketHosts =list("ec2-00-00-00-000.compute-1.amazonaws.com"))Permission denied (publickey)我有什么遗漏的吗?如果用户可以分享他们在AWS上使用雪的经验,我将非常感激.
非常感谢你的建议.
更新:我只是想更新我发现的具体问题的解决方案:
snowfall在群集的所有节点上安装的包hostslist <- list("ec2-xxx-xx-xxx-xxx.compute-1.amazonaws.com","ec2-xx-xx-xxx-xxx.compute-1.amazonaws.com")sfInit(parallel=TRUE, cpus=2, type="SOCK",socketHosts=hostslist)l <- sfLapply(1:2,function(x)system("ifconfig",intern=T))lapply(l,function(x)x[2])sfStop()parallel-processing r amazon-web-services snowfall starcluster
我在R中使用无效记录器进行记录.我有一个在R中使用降雪实现的并行算法.并行过程的每个核心都在记录器中记录一个中间输出.但是这个输出没有出现在记录器中?
我们可以使用无效记录器从并行作业中使用降雪进行记录吗?
我的具体情况有点不同.我使用我创建的共享对象从R调用C函数.该函数是一个迭代算法,我需要每隔几次迭代记录输出.我有兴趣从C函数记录到无效记录器.为什么徒劳的记录器?因为这是Web应用程序的一部分,所以用户会话的所有输出都以一致的格式出现是有意义的.
这是我根据接受的答案遵循的一般方法.
# init script
# iter logger namespace global variable
assign("MCMC_LOGGER_NAMESPACE", "iter.logger", envir = .GlobalEnv)
loginit <- function(logfile) {
require('futile.logger')
flog.layout(layout.simple, name = ITER_LOGGER_NAMESPACE)
flog.threshold(TRACE, name = ITER_LOGGER_NAMESPACE)
flog.appender(appender.file(logfile), name = ITER_LOGGER_NAMESPACE)
NULL
}
parallel_funct_call_in_R <- function(required args) {
require('snowfall')
sfSetMaxCPUs()
sfInit(parallel = TRUE, cpus = NUM_CPU)
sfLibrary(required libs)
sfExport(required vars including logger namespace variable ITER_LOGGER_NAMESPACE)
iterLoggers = sprintf(file.path(myloggingdir, 'iterativeLogger_%02d.log', fsep = .Platform$file.sep), seq_len(NUM_CPU))
sfClusterApply(iterLoggers, loginit)
sfSource(required files)
estimates <- sfLapply(list_to_apply_over, func_callling_C_from_R, required args)
sfStop()
return(estimates) …Run Code Online (Sandbox Code Playgroud) 我有一个data.frame的单元格,值和坐标.它驻留在全球环境中.
> head(cont.values)
cell value x y
1 11117 NA -34 322
2 11118 NA -30 322
3 11119 NA -26 322
4 11120 NA -22 322
5 11121 NA -18 322
6 11122 NA -14 322
Run Code Online (Sandbox Code Playgroud)
因为我的自定义函数花了将近一秒来计算单个单元格(我需要计算数万个单元格),我不想复制已经有值的单元格的计算.以下解决方案试图避免这种情况.每个单元格可以独立计算,尖叫为并行执行.
我的函数实际上做的是检查是否有指定单元格编号的值,如果它是NA,则计算它并将其插入代替NA.
我可以使用apply函数系列来运行我的魔术函数(结果是value相应的cell),从内部apply,我可以读写cont.values没有问题(它在全局环境中).
现在,我想并行运行(使用snowfall),我无法从单个核心读取或写入此变量.
问题:在并行执行函数时,从工作者(核心)内部驻留在全局环境中的动态变量可以读取/写入什么解决方案.这样做有更好的方法吗?
我一直试图在我的大学集群上运行Rmpi,snowfall但出于某种原因,无论我分配了多少计算节点,我的snowfall初始化仍然只在一个节点上运行.
这是我如何初始化它:
sfInit(parallel=TRUE, cpus=10, type="MPI")
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?我会根据需要提供澄清.
我有一个500k约会的数据集,持续时间在5到60分钟之间.
tdata <- structure(list(Start = structure(c(1325493000, 1325493600, 1325494200, 1325494800, 1325494800, 1325495400, 1325495400, 1325496000, 1325496000, 1325496600, 1325496600, 1325497500, 1325497500, 1325498100, 1325498100, 1325498400, 1325498700, 1325498700, 1325499000, 1325499300), class = c("POSIXct", "POSIXt"), tzone = "GMT"), End = structure(c(1325493600, 1325494200, 1325494500, 1325495400, 1325495400, 1325496000, 1325496000, 1325496600, 1325496600, 1325496900, 1325496900, 1325498100, 1325498100, 1325498400, 1325498700, 1325498700, 1325499000, 1325499300, 1325499600, 1325499600), class = c("POSIXct", "POSIXt"), tzone = "GMT"), Location = c("LocationA", "LocationA", "LocationA", "LocationA", "LocationA", "LocationA", "LocationA", "LocationA", "LocationA", "LocationB", "LocationB", "LocationB", "LocationB", "LocationB", "LocationB", "LocationB", "LocationB", …Run Code Online (Sandbox Code Playgroud) 我今天的项目是使用我拥有的基本技能在R中编写一个快速关联例程.我必须找到几乎400个变量之间的相关性,每个变量有近百万个观测值(即大小为p = 1MM行且n = 400个cols的矩阵).
R的原生相关函数对于1MM行需要近2分钟,每个变量需要200个观察值.我没有每列运行400次观察,但我的猜测是需要将近8分钟.我完成它的时间不到30秒.
因此,我想做的事情.
1 - 在C中编写一个简单的相关函数,并将其平行应用于块中(见下文).
2 - 块 - 将相关矩阵分成三个块(大小为K*K的左上方,大小的右下方(pK)(pK)和大小为K(pK)的右上方矩阵).这涵盖了相关矩阵中的所有单元,corr因为我只需要上三角形.
3 - 使用降雪并行地通过.C调用运行C功能.
n = 100
p = 10
X = matrix(rnorm(n*p), nrow=n, ncol=p)
corr = matrix(0, nrow=p, ncol=p)
# calculation of column-wise mean and sd to pass to corr function
mu = colMeans(X)
sd = sapply(1:dim(X)[2], function(x) sd(X[,x]))
# setting up submatrix row and column ranges
K = as.integer(p/2)
RowRange = list()
ColRange = list()
RowRange[[1]] = c(0, …Run Code Online (Sandbox Code Playgroud) r ×10
snowfall ×10
amazon-ec2 ×1
c ×1
correlation ×1
data.table ×1
foreach ×1
logging ×1
openmpi ×1
sqldf ×1
starcluster ×1
time ×1
windows ×1