R并行中的Linux服务器崩溃 - 反序列化错误(节点$ con):从连接读取错误

时间:2015-11-14 11:15:44

标签: r linux parallel-processing crash

我在Linux集群中运行R代码 - 代码很复杂(超过两千行代码),涉及40多个R包和几百个变量。但是,它确实在Windows和Linux版本的R上运行。

我现在正在爱丁堡大学EDCF高性能计算集群上运行代码,代码是并行运行的。在DEoptim中调用并行代码,基本上,在一些初始化之后,并行运行一系列函数,结果被发送回DEoptim算法,并在我自己的空间中保存为绘图和数据表 - 重要的是代码运行并运行!

代码模拟一个地区的水文,我可以设置代码来模拟我想要的任何时间段的历史条件 - 从一天到30年。平行一个月,结果大约每70秒吐出一次,DEoptim算法只是重新运行代码,改变输入参数,试图找到最佳参数集。

代码似乎运行良好,但最终崩溃了。昨晚代码完成了100多次运行,大约2个小时没有问题,但最终崩溃了 - 它总是最终崩溃 - 错误代码:

Error in unserialize(node$con) : error reading from connection

我登录的系统是一个16核服务器(16个真核),根据:

detectCores()

我要求8个2GB内存的插槽。我试过在具有大内存请求的24核机器上运行它(4个40GB内存的插槽),但它最终仍然崩溃。这个代码在一台Windows机器上运行了好几个星期,从而分散了数千个结果,并行运行在8个逻辑核心上。

所以我相信代码没问题,但为什么会崩溃呢?这可能是记忆问题吗?每次调用序列时,它都包括:

rm(list=ls())
gc()

或者它只是一个核心崩溃?我确实认为,如果两个内核同时尝试写入同一个数据文件,可能会出现问题,但我暂时删除了它,但它仍然崩溃了。有时它会在几分钟后崩溃,其他时间会在几个小时后崩溃。我尝试使用以下方法从并行代码中删除一个内核:

cl <- parallel::makeCluster(parallel::detectCores()-1)

但它仍然崩溃。

无论如何,代码都可以修改,以便拒绝崩溃的输出,例如如果错误然后拒绝并继续!!

或者,有没有办法修改代码以捕捉错误发生的原因?

我知道还有很多其他序列化(节点$ con)和unserialize(节点$ con)错误帖子,但它们似乎无法帮助我。

我真的很感激一些帮助。

感谢。

1 个答案:

答案 0 :(得分:-1)

我遇到了类似的问题,并行代码依赖于其他几个软件包。尝试使用带有%dopar%的foreach()并使用.packages选项指定代码所依赖的包,以将包加载到每个worker上。或者,在并行代码中明智地使用require()也可以。