追溯罕见错误

时间:2014-04-15 11:47:08

标签: r cluster-computing multicore

我正在运行一段需要很长时间才能计算的代码。我使用foreach()%dopar%使我的代码并行并在集群上运行。

它运行一般很好,但有时会崩溃,我收到以下错误: Error in { : task 4 failed - "missing value where TRUE/FALSE needed" Calls: %dopar% -> <Anonymous> Execution halted

现在它说执行停止但只针对这个特定的核心,所以其他人继续运行,最后它输出失败,但没有事先告诉我。 我想这是一个if语句的问题。我尝试在我的计算机上模拟代码但是很少见,我无法模拟它。

代码可以轻松运行100个小时,执行多达10万个循环,其中只有一个会失败。

我的问题是:我可以追溯错误的位置吗? (我在集群上运行代码,所以我没有所有漂亮的Rstudio东西) 此外,即使其中一个任务崩溃,仍然可以从foreach()循环输出吗? 或者也许是人们使用的任何方法,以便我可以在我的计算机上发生崩溃?

如果需要,我可以编写代码,请询问是否有帮助。

1 个答案:

答案 0 :(得分:3)

foreach&#34; .errorhandling&#34;论证旨在帮助解决这种情况。如果您希望foreach通过错误,请使用.errorhandling="pass"。如果您希望它过滤掉错误(这会减少结果的长度),请使用.errorhandling="remove"。默认值为&#34;停止&#34;这会抛出一个错误,指出哪个任务失败。

不幸的是,大多数并行后端不支持回溯,但doMPI确实支持回溯。你只需调用&#34; startMPIcluster&#34;使用verbose=TRUE,并将回溯写入具有错误的worker的日志文件中。这是在任务42上生成错误的示例:

suppressMessages(library(doMPI))
cl <- startMPIcluster(4, verbose=TRUE)
registerDoMPI(cl)
g <- function(i) {
  if (i == 42) {
    if (NULL) cat('hello, world\n')
  }
  7
}
f <- function(i) g(i)
r <- foreach(i=1:50, .errorhandling='pass') %dopar% f(i)
print(r)
closeCluster(cl)
mpi.quit()

由于它使用.errorhandling="pass",脚本将运行完成,并在结果列表的元素42中返回错误对象。此外,其中一个日志文件包含错误的回溯(以及许多其他消息):

waiting for a taskchunk...
executing taskchunk 42 containing 1 tasks
error executing task: argument is of length zero
traceback (most recent call first):
> g(i)
> f(i)
> eval(expr, envir, enclos)
> eval(expr, envir)
> executeTask(taskchunk$argslist[[1]])
> executeTaskChunk(cl$workerid, taskchunk, envir, err, cores)
returning error results for taskchunk 42

不幸的是,doMPI主要用于Linux系统,所以这对大多数Mac和Windows用户都没有帮助。