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)