R 中的并行优化和 "sinking" 中间输出
Parallel optimization and "sinking" intermediate output in R
我有一个非常丑陋的函数来最小化超过 7 个变量。
为了加快速度,我获得了 (SSH) 访问集群的权限,在那里我可以 运行 它在 24 个内核上。
问题是几天后该进程无一例外地崩溃了,我不确定为什么会这样,但我的问题是其他问题:
如何让 DEoptim 在 .Rout 文件中打印每个循环的输出(我希望它在崩溃前至少完成其中一个),我可以在进程崩溃后查看(或者我停止它) ?
对于 24 个内核中的每一个,这应该是相同类型的输出,但我希望可以让 DEoptim 输出所有这些内核。
这是我尝试过但没有成功的方法(最后是空文件)
clusterEvalQ(cl ,library(snow)) # loads lybrary on nodes
clusterEvalQ(cl ,library(DEoptim))
clusterEvalQ(cl ,library(cubature))
clusterExport(cl,ls()) # Exports all variables to all nodes
# puts all the rra values in a matrix (vector)
zz <- file("all.Rout", open = "wt")
sink(zz)
sink(zz, type = "message")
print(system.time(parOutput<-parLapply(cl,CornerList,ParFunction)))
i<-1
while(i<= 24){
print(parOutput[[i]][[1]][1])
print(parOutput[[i]][[1]][2])
i <- i+1
}
sink(type = "message")
sink()
stopCluster(cl)
拿掉水槽类型 = "message" 没有帮助。
如有任何建议,我们将不胜感激!
您的示例无效,因为您在主服务器上执行 sink
,这对工作人员没有影响。
您可以使用 makeCluster outfile=""
选项来允许工作程序输出到您的终端,但这并不适用于所有 R 环境,例如 RStudio。 makeCluster
的文档说你可以用 outfile
指定一个文件名,所有的工作人员都会记录到那个文件,但我发现很多输出都丢失了,所以我没有推荐。
如果您不介意每个工作人员使用一个文件,您可以对每个工作人员执行 sink
命令,如下所示:
library(snow)
cl <- makeSOCKcluster(4)
clusterApply(cl, seq_along(cl), function(i) {
zz <<- file(sprintf('all-%d.Rout', i), open='wt')
sink(zz)
sink(zz, type='message')
})
r <- parLapply(cl, 1:100, function(i) {
cat(sprintf('executing task %d\n', i))
sqrt(i)
})
clusterEvalQ(cl, {
sink(type='message')
sink()
close(zz)
rm(zz)
})
stopCluster(cl)
我有一个非常丑陋的函数来最小化超过 7 个变量。 为了加快速度,我获得了 (SSH) 访问集群的权限,在那里我可以 运行 它在 24 个内核上。
问题是几天后该进程无一例外地崩溃了,我不确定为什么会这样,但我的问题是其他问题:
如何让 DEoptim 在 .Rout 文件中打印每个循环的输出(我希望它在崩溃前至少完成其中一个),我可以在进程崩溃后查看(或者我停止它) ? 对于 24 个内核中的每一个,这应该是相同类型的输出,但我希望可以让 DEoptim 输出所有这些内核。
这是我尝试过但没有成功的方法(最后是空文件)
clusterEvalQ(cl ,library(snow)) # loads lybrary on nodes
clusterEvalQ(cl ,library(DEoptim))
clusterEvalQ(cl ,library(cubature))
clusterExport(cl,ls()) # Exports all variables to all nodes
# puts all the rra values in a matrix (vector)
zz <- file("all.Rout", open = "wt")
sink(zz)
sink(zz, type = "message")
print(system.time(parOutput<-parLapply(cl,CornerList,ParFunction)))
i<-1
while(i<= 24){
print(parOutput[[i]][[1]][1])
print(parOutput[[i]][[1]][2])
i <- i+1
}
sink(type = "message")
sink()
stopCluster(cl)
拿掉水槽类型 = "message" 没有帮助。
如有任何建议,我们将不胜感激!
您的示例无效,因为您在主服务器上执行 sink
,这对工作人员没有影响。
您可以使用 makeCluster outfile=""
选项来允许工作程序输出到您的终端,但这并不适用于所有 R 环境,例如 RStudio。 makeCluster
的文档说你可以用 outfile
指定一个文件名,所有的工作人员都会记录到那个文件,但我发现很多输出都丢失了,所以我没有推荐。
如果您不介意每个工作人员使用一个文件,您可以对每个工作人员执行 sink
命令,如下所示:
library(snow)
cl <- makeSOCKcluster(4)
clusterApply(cl, seq_along(cl), function(i) {
zz <<- file(sprintf('all-%d.Rout', i), open='wt')
sink(zz)
sink(zz, type='message')
})
r <- parLapply(cl, 1:100, function(i) {
cat(sprintf('executing task %d\n', i))
sqrt(i)
})
clusterEvalQ(cl, {
sink(type='message')
sink()
close(zz)
rm(zz)
})
stopCluster(cl)