R 并行中的 Linux 服务器崩溃 - 反序列化错误(node$con):从连接读取错误
Posted
技术标签:
【中文标题】R 并行中的 Linux 服务器崩溃 - 反序列化错误(node$con):从连接读取错误【英文标题】:Linux Server crash in R parallel - Error in unserialize(node$con) : error reading from connection 【发布时间】:2016-02-15 22:09:27 【问题描述】:我在 linux 集群中的 R 中运行代码 - 代码很复杂(超过 2000 行代码),涉及 40 多个 R 包和数百个变量。但是,它确实可以在 Windows 和 linux 版本的 R 上运行。
我现在在爱丁堡大学 EDCF 高性能计算集群上运行代码,代码是并行运行的。并行代码在 DEoptim 中调用,基本上,在一些初始化之后,并行运行一系列函数,并将结果发送回 DEoptim 算法,并在我自己的空间中保存为绘图和数据表 - 重要的是代码运行正常!
代码模拟一个地区的水文,我可以设置代码来模拟我想要的任何时间段的历史条件 - 从一天到 30 年。并行一个月,结果大约每 70 秒输出一次,DEoptim 算法只是不断地重新运行代码,更改输入参数,试图找到最佳参数集。
代码运行多次后似乎运行良好,但最终崩溃。昨晚,代码在大约 2 小时内完成了 100 多次运行,没有任何问题,但最终崩溃了 - 而且它最终总是崩溃 - 并出现错误代码:
Error in unserialize(node$con) : error reading from connection
我登录的系统是一个 16 核服务器(16 个真核),根据:
detectCores()
我申请了 8 个 2GB 内存插槽。我曾尝试在具有大内存请求(4 个 40GB 内存的插槽)的 24 核机器上运行它,但它最终仍然崩溃。这段代码在一台 Windows 机器上运行了好几个星期,产生了数千个结果,在 8 个逻辑内核上并行运行。
所以我相信代码没问题,但为什么会崩溃?会不会是内存问题?每次调用该序列时都包括:
rm(list=ls())
gc()
还是只是核心崩溃?我确实认为,如果两个内核同时尝试写入同一个数据文件,这可能是个问题,但我暂时删除了它,但它仍然崩溃。有时它会在几分钟后崩溃,有时会在几个小时后崩溃。我尝试使用以下方法从并行代码中删除一个核心:
cl <- parallel::makeCluster(parallel::detectCores()-1)
但它还是崩溃了。
是否可以修改代码以拒绝崩溃的输出,例如如果错误则拒绝并继续!
或者,有没有办法修改代码来找出错误发生的原因?
我知道还有很多其他的 serialize(node$con) 和 unserialize(node$con) 错误帖子,但它们似乎对我没有帮助。
非常感谢您的帮助。
谢谢。
【问题讨论】:
您可以尝试将有问题的代码封装到tryCatch
中,然后将结果和对象输出到 text/.RData 文件。
我想知道如何使用 tryCatch - 听起来很有可能。
我创建了另一个帖子来尝试了解如何在我的代码中使用 tryCatch ***.com/questions/33733102/…
@SteveWeston 的answer 表明问题在于工人退出,因此 tryCatch() 没有帮助。它可能会因为您正在使用的包中的编程错误,或者分析中的一个节点上的资源限制(例如,内存使用)或其他一些原因而退出。也许您应该尝试通过简化问题来解决这个问题,也许正如史蒂夫回应的更新问题中所建议的那样。
我设法通过在创建集群时添加 type = "FORKS" 来解决这个问题,并且没有使用 rm() 类型的命令。
【参考方案1】:
我在依赖于其他几个包的并行代码中运行时遇到了类似的问题。尝试将 foreach() 与 %dopar% 一起使用,并使用 .packages 选项指定您的代码所依赖的包,以将包加载到每个 worker 上。或者,在并行代码中明智地使用 require() 也可能有效。
【讨论】:
查看我上面关于添加 type = "FORKS" 的评论 - 解决了问题以上是关于R 并行中的 Linux 服务器崩溃 - 反序列化错误(node$con):从连接读取错误的主要内容,如果未能解决你的问题,请参考以下文章