【问题标题】:R crash accessing object created in parallel, foreach()R崩溃访问并行创建的对象,foreach()
【发布时间】:2021-08-15 17:42:47
【问题描述】:

我正在迁移到一个新的 Azure 虚拟机,突然在我以前从未遇到过的疯狂地方出现崩溃和错误。 (新的虚拟机是从 Windows Server 2016 切换到 2019 的,但这可能是一个完全的红鲱鱼。)我已经找到了一个可以使用以下代码重现问题的地方

# load packages
library(foreach)
library(randomForest)
library(iterators)
library(parallel)
library(doParallel)

numCores <- detectCores() - 1
ntrees <- 8000
treeSubs <- ntrees/numCores
# initialize
cl <- makeCluster(numCores)
registerDoParallel(cl)
# dummy datasets
x <- as.data.frame(matrix(runif(100000), 20000))
y <- gl(2, 10000)

parRf <- foreach(ntree = rep(treeSubs,numCores), .combine = randomForest::combine,
                        .packages = 'randomForest', .multicombine = TRUE) %dopar%
                                randomForest(x=x, y=y,
                        importance=TRUE,mtry=2,ntree = ntree,
                        replace = TRUE
  )

z <- matrix(runif(1000), 200)

pred <- predict(parRf, z, type = "prob")

请注意,导致失败的是预测步骤,但是当我不并行调用 randomForest 时,预测步骤工作正常。或者,如果我使数据集更小,它也可以工作。在 RStudio 中,我得到了灰色的“炸弹”,而在 RGui 中,它就消失了。

以下是来自 Windows 事件日志的崩溃报告的一些详细信息:

Faulting application name: rsession.exe, version: 1.1.463.0, time stamp: 0x5bd11fb5
Faulting module name: randomForest.dll, version: 0.0.0.0, time stamp: 0x609f54bd
Exception code: 0xc0000005
Fault offset: 0x0000000000001b42
Faulting process id: 0x1e48
Faulting application start time: 0x01d752f21b6d7a79
Faulting application path: C:\Program Files\RStudio\bin\x64\rsession.exe

我想知道这是否与这个问题有关: R Crashes when training using caret and method = gamLoess 但我没有看到任何解决方案...

这是会议信息:

> sessionInfo()
R version 4.0.5 (2021-03-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows Server >= 2012 x64 (build 9200)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

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

other attached packages:
[1] doParallel_1.0.16   iterators_1.0.13    randomForest_4.6-14 foreach_1.5.1      

loaded via a namespace (and not attached):
[1] compiler_4.0.5   tools_4.0.5      codetools_0.2-18
> 

提前感谢您的任何提示。

【问题讨论】:

    标签: r foreach crash doparallel


    【解决方案1】:

    代码并行工作。 尝试在项目空间中运行代码......(创建一个新项目并在其中运行它)并检查。 (在项目空间之外运行时,我收到了其他以内存为中心的代码的错误。)

    头部(预测) 1 2 1 0.553750 0.446250 2 0.533750 0.466250 3 0.367750 0.632250 4 0.578625 0.421375 5 0.487125 0.512875 6 0.423375 0.576625

    【讨论】:

    • 也许你有一台非常大的机器?尝试使用 x 将输入的大小增加 100 倍
    • 还有什么版本的 R 和你使用什么操作系统?
    • 也许,但不是真的。增加 100 倍(或 1000)将导致“无法分配大小向量”错误。因此使用 sampsize=50000 (方便)和 replace = FALSE (或 TRUE)将使其运行。 (在 100* 上测试:有效!) memory.limit(10^6) 也可能有所帮助。 (R-4.05)(不过运行确实需要一些时间!)
    • 好的,谢谢。所以也许这是一个操作系统的东西或包版本的东西(尽管我可以在三台不同的机器上崩溃)。您使用的是什么操作系统?如果您在回答中谈论的是 RStudio 项目,请注意这也发生在 RGui 中,对我来说(我确实在 RStudio 项目中遇到了错误)。
    • 它确实可以在 Windows 和 Linux 机器上运行。但是,我确实收到了错误(正如您所暗示的那样)并且 R 在笔记本电脑上崩溃了(较低的规格)。虽然我认为这是由于“并行”包(或对它的调用)作为随机森林和预测在没有它的情况下运行(需要更长的时间)。
    【解决方案2】:

    这似乎是 randomForest 包中的一个错误,基于我在此处的报告中的侦查:

    https://github.com/RevolutionAnalytics/foreach/issues/30

    简而言之,不是整数的ntree 设置会导致段错误。我不认为这曾经是个问题(多年来一直在使用此代码),所以我不知道发生了什么变化才能将其放在首位。

    解决方案:确保ntree 是一个整数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      相关资源
      最近更新 更多