gpt4 book ai didi

R doParallel foreach工作超时错误并且永远不会返回

转载 作者:行者123 更新时间:2023-12-03 05:39:30 27 4
gpt4 key购买 nike

以下问题是与此处描述的问题相关的非常详细的问题。 Previous Question

使用在 R 版本 3.2.3 的 c4.8xlarge(36 核)上启动的 Ubuntu Server 14.04 LTS 64 位 Amazon 系统镜像。

考虑以下代码

library(doParallel)
cl=makeCluster(35)
registerDoParallel(cl)

tryCatch({
evalWithTimeout({
foreach(i=1:10) %:%
foreach(j=1:50) %dopar% {
tryCatch({
evalWithTimeout({
set.seed(j)
source(paste("file",i,".R", sep = "")) # File that takes a long time to run
save.image(file=paste("file", i, "-run",j,".RData",sep=""))
},
timeout=300); ### Timeout for individual processes
}, TimeoutException=function(ex) {
return(paste0("Timeout 1 Fail ", i, "-run", j))

})
}
},
timeout=3600); ### Cumulative Timeout for entire process
}, TimeoutException=function(ex) {

return("Timeout 2 Fail")

})

stopCluster(cl)

请注意,这两个超时异常都有效。我们注意到各个进程超时,如果有必要,还会注意到累积进程超时。

但是,我们发现单个进程可能会启动,并且由于未知原因在 300 秒后不会超时。请注意,各个进程超时可确保该进程不会“只是花费很长时间”。结果,核心被该单个进程占用并以 100% 运行,直到达到累计超时 3600 秒。请注意,如果累积超时未到位,进程及其核心将无限期地被占用,并且 foreach 循环将无限期地继续。一旦达到累积时间,就会返回“Timeout 2 Fail”并且脚本继续执行。

问题:如果某个单独的工作进程“挂起”,导致单独的超时机制也不起作用,如何重新启动该工作进程,使其可以继续在进程中使用?并行处理?如果无法重新启动工作程序,是否可以通过达到累积超时以外的其他方式停止工作程序?这样做将确保进程不会在仅运行单个“错误”进程的情况下继续长时间“等待”达到累积超时。

其他信息“逃跑”的进程或“挂起”的 worker 被当场抓获。使用 htop 查看进程,它的 CPU 利用率为 100%。以下链接是该进程的gdb回溯调用的屏幕截图

backtrace screenshot

问题:回溯中是否确定了“失控”进程的原因?

最佳答案

我多次尝试让 evalWithTimeout 在非常相似的上下文中工作。我发现这是一个非常有问题的问题,特别是如果您使用数据库连接或全局变量。然而,对我来说非常有效的是创建一个使用 setTimeLimit 的表达式。要正确使用它,您必须将它和您的函数一起包装在 {} 中。这是一个例子:

foreach(...) %dopar% {
withCallingHandlers({
setTimeLimit(360)
# your function goes here, runs for 360 seconds, or fails
},
error = function(e) {
# do stuff to capture error messages here
}
)
}

我使用 withCallingHandlers 是因为堆栈跟踪非常有用并且可以深入了解正在发生的事情。在我的错误函数中,我通常会适本地捕获详细的错误消息,以便我可以查看出现问题的内容和位置。

总结一下:

  1. setTimeLimit 一般来说比 evalWithTimeout 更可靠
  2. 使用 withCallingsHandlers 为您提供了出色的错误处理选项和比 tryCatch 更详细的输出
  3. 请记住将错误消息保存在有用的地方并对其进行格式化,以便您可以了解到底发生了什么。

关于R doParallel foreach工作超时错误并且永远不会返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35734787/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com