写入连接时出错 - 与 R 并行化 - Linux/Ubuntu 问题

Posted

技术标签:

【中文标题】写入连接时出错 - 与 R 并行化 - Linux/Ubuntu 问题【英文标题】:Error writing to connection - Parallelization with R - Linux/Ubuntu issue 【发布时间】:2021-08-12 14:06:25 【问题描述】:

我们正在尝试使用调用 doParallel 包的 ResistanceGA 包在 R 中运行涉及并行化的代码。我们有非常大的内存,所以这应该不是问题。

这是我们得到的错误:

Error in serialize(data, node$con, xdr = FALSE) : ignoring SIGPIPE signal
Error in serialize(data, node$con, xdr = FALSE) :
  error writing to connection

这是从教程中复制的可重现示例代码,它会触发我们特定设置的问题:

write.dir <- #please fill here
library(ResistanceGA)
data(resistance_surfaces)
data(samples)
sample.locales <-SpatialPoints(samples[,c(2,3)])
r.stack <-stack(resistance_surfaces$categorical,resistance_surfaces$continuous,resistance_surfaces$feature)
GA.inputs <-GA.prep(ASCII.dir = r.stack,Results.dir = write.dir,method = "LL",max.cat = 500,max.cont = 500,seed = 555,parallel = 4)
gdist.inputs <-gdist.prep(length(sample.locales),samples = sample.locales,method ='commuteDistance')
PARM <-c(1, 250, 75, 1, 3.5, 150, 1, 350)
Resist <-Combine_Surfaces(PARM = PARM,gdist.inputs = gdist.inputs,GA.inputs = GA.inputs,out = NULL,rescale = TRUE)
gdist.response <-Run_gdistance(gdist.inputs = gdist.inputs,r = Resist)
gdist.inputs <-gdist.prep(n.Pops =length(sample.locales),samples = sample.locales,response =as.vector(gdist.response),method ='commuteDistance')
Multi.Surface_optim <-MS_optim(gdist.inputs = gdist.inputs,GA.inputs = GA.inputs)

会话信息:

R version 4.0.5 (2021-03-31)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 20.04.2 LTS

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] ResistanceGA_4.1-0.46 raster_3.4-10         sp_1.4-5

loaded via a namespace (and not attached):
 [1] jsonlite_1.7.2        splines_4.0.5         foreach_1.5.1
 [4] gtools_3.8.2          shiny_1.6.0           expm_0.999-6
 [7] stats4_4.0.5          spatstat.geom_2.1-0   LearnBayes_2.15.1
[10] pillar_1.6.1          lattice_0.20-44       glue_1.4.2
[13] digest_0.6.27         promises_1.2.0.1      polyclip_1.10-0
[16] minqa_1.2.4           colorspace_2.0-1      MuMIn_1.43.17
[19] htmltools_0.5.1.1     httpuv_1.6.1          Matrix_1.3-3
[22] plyr_1.8.6            spatstat.sparse_2.0-0 JuliaCall_0.17.4
[25] pkgconfig_2.0.3       gmodels_2.18.1        purrr_0.3.4
[28] xtable_1.8-4          spatstat.core_2.1-2   scales_1.1.1
[31] gdata_2.18.0          tensor_1.5            XR_0.7.2
[34] later_1.2.0           spatstat.utils_2.1-0  lme4_1.1-27
[37] proxy_0.4-25          tibble_3.1.2          mgcv_1.8-35
[40] generics_0.1.0        ggplot2_3.3.3         ellipsis_0.3.2
[43] XRJulia_0.9.0         cli_2.5.0             magrittr_2.0.1
[46] crayon_1.4.1          mime_0.10             deldir_0.2-10
[49] fansi_0.4.2           doParallel_1.0.16     nlme_3.1-152
[52] MASS_7.3-54           class_7.3-19          tools_4.0.5
[55] lifecycle_1.0.0       munsell_0.5.0         e1071_1.7-6
[58] gdistance_1.3-6       akima_0.6-2.1         compiler_4.0.5
[61] rlang_0.4.11          units_0.7-1           classInt_0.4-3
[64] grid_4.0.5            nloptr_1.2.2.2        iterators_1.0.13
[67] goftest_1.2-2         igraph_1.2.6          miniUI_0.1.1.1
[70] boot_1.3-28           GA_3.2.1              gtable_0.3.0
[73] codetools_0.2-18      abind_1.4-5           DBI_1.1.1
[76] R6_2.5.0              knitr_1.33            dplyr_1.0.6
[79] fastmap_1.1.0         utf8_1.2.1            ggExtra_0.9
[82] spdep_1.1-7           KernSmooth_2.23-20    spatstat.data_2.1-0
[85] parallel_4.0.5        Rcpp_1.0.6            vctrs_0.3.8
[88] sf_0.9-8              rpart_4.1-15          coda_0.19-4
[91] spData_0.3.8          tidyselect_1.1.1      xfun_0.23

我们尝试过重新安装不同版本的所有内容,但无济于事。它适用于 Windows。

【问题讨论】:

该错误强烈表明并行 R 工作者已崩溃/终止/段错误。如果它适用于 MS Windows,但不适用于 Linux 或 macOS,则强烈建议您的特定代码不能在 forked 并行处理中运行。要获得与 Windows 相同类型的工作器,请使用 cl &lt;- makeCluster(cl); registerDoParallel(cl)。然后重试。 @HenrikB 非常感谢您的帮助。我尝试了你的建议并得到了一个稍微不同的错误:Error in serialize(data, node$con, xdr = FALSE) : error writing to connection Error in serialize(data, node$con, xdr = FALSE) : error writing to connection 好的,该错误表明您的并行工作人员并不孤单。因此,您可能很幸运它可以在 MS Windows 上运行(例如,内存稍多,...,未知因素)。无论如何,并行化的代码听起来不稳定,这可能不是你的错。要进一步缩小范围,请尝试使用library(doFuture); registerDoFuture(); plan(multisession, workers=ncores); options(future.globals.onReference="error")。这将使用完全相同类型的并行后端(PSOCK 工作人员),但您应该会收到一条信息更丰富的错误消息。 @HenrikB 在分析代码之前,我尝试运行您提供的代码而不是之前的代码,但不幸的是,我收到了相同的错误消息。 Ubuntu 机器上的硬件是您的用户专用的吗?当我在共享的 Ubuntu 服务器上运行并行化代码时,我往往会遇到序列化错误。服务器提供商保证始终访问给定数量的 CPU 和 RAM。但是,我的猜测是这些 CPU 不是恒定的。如果服务器在用户之间移动 CPU,则可能会阻碍线程稳定性并破坏并行进程。不幸的是,这些序列化错误的频率在过去几年中有所增加。 parallel 和底层 snow 的更新 - 就像其他程序一样 - 早就应该更新了。 【参考方案1】:

这似乎是因为registerGA 不适用于forked 并行处理。它的实现方式,或者更确切地说GA:::startParallel() 是,如果您在 Unix 或 macOS 上,它将使用分叉并行处理。在 MS Windows 上,您将获得基于 PSOCK 的并行处理。

以下适用于带有 Linux 的 R 4.1.0。

## Not on CRAN (https://github.com/wpeterman/ResistanceGA)
library(ResistanceGA)

## Use PSOCK background workers for parallel processing
parallel <- parallel::makeCluster(4L)

write.dir <- tempdir()
data(resistance_surfaces)
data(samples)
sample.locales <- SpatialPoints(samples[,c(2,3)])

r.stack <- stack(resistance_surfaces$categorical, resistance_surfaces$continuous, resistance_surfaces$feature)

GA.inputs <- GA.prep(ASCII.dir = r.stack, Results.dir = write.dir, method = "LL",max.cat = 500, max.cont = 500, seed = 555, parallel = parallel)

gdist.inputs <- gdist.prep(length(sample.locales), samples = sample.locales,method = "commuteDistance")

PARM <- c(1, 250, 75, 1, 3.5, 150, 1, 350)

Resist <- Combine_Surfaces(PARM = PARM, gdist.inputs = gdist.inputs, GA.inputs = GA.inputs, out = NULL, rescale = TRUE)

gdist.response <- Run_gdistance(gdist.inputs = gdist.inputs, r = Resist)

gdist.inputs <- gdist.prep(n.Pops = length(sample.locales), samples = sample.locales,response = as.vector(gdist.response), method = "commuteDistance")

Multi.Surface_optim <- MS_optim(gdist.inputs = gdist.inputs, GA.inputs = GA.inputs)

【讨论】:

很遗憾,这不适用于我们的系统。

以上是关于写入连接时出错 - 与 R 并行化 - Linux/Ubuntu 问题的主要内容,如果未能解决你的问题,请参考以下文章

与 Rborist 并行化

R中的并行优化

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

使用 foreach 进行并行处理时出错:“找不到函数“%dopar%””

尝试将 DataFrame 写入羽毛时出错。羽毛是不是支持列表列?

使用降雪包并行化 R 代码