【问题标题】:error: object '.doSnowGlobals' not found?错误:找不到对象“.doSnowGlobals”?
【发布时间】:2024-01-01 22:42:02
【问题描述】:

我正在尝试在 4 个节点上并行化代码(type = "SOCK")。这是我的代码。

library(itertools)
library(foreach)
library(doParallel)
library(parallel)

workers <- ip address of 4 nodes
cl = makePSOCKcluster(workers, master="ip address of master")
registerDoParallel(cl)

z <- read.csv("ProcessedData.csv", header=TRUE, as.is=TRUE)
z <- as.matrix(z)


system.time({
  chunks <- getDoParWorkers()
  b <- foreach (these = isplitIndices(nrow(z),
                                      chunks=chunks),
                .combine = c) %dopar% {
                  a <- rep(0, length(these))
                  for (i in 1:length(these)) {
                    a[i] <- mean(z[these[i],])
                  }
                  a
                }
})

我收到此错误:

4 个节点产生错误;第一个错误:对象 '.doSnowGlobals' 不是 找到了。

如果我使用 doMC(即使用同一台机器的内核),此代码运行良好。但是当我尝试使用其他计算机进行并行计算时,我得到了上述错误。当我将其更改为 registerDoSNOW 时,错误仍然存​​在。

snow 和 DoSNOW 是否在集群中工作?我可以使用雪在本地主机上创建节点,但不能在集群上创建节点。有人在用雪吗?

【问题讨论】:

    标签: r foreach parallel-processing snow


    【解决方案1】:

    如果任何工作人员无法加载 doParallel 包,您可能会收到此错误。您可以通过将 doParallel 安装到某个目录并通过“.libPaths”将 master 指向它来实现这一点:

    > .libPaths('~/R/lib.test')
    > library(doParallel)
    > cl <- makePSOCKcluster(3, outfile='')
    starting worker pid=26240 on localhost:11566 at 13:47:59.470
    starting worker pid=26248 on localhost:11566 at 13:47:59.667
    starting worker pid=26256 on localhost:11566 at 13:47:59.864
    > registerDoParallel(cl)
    > foreach(i=1:10) %dopar% i
    Warning: namespace ‘doParallel’ is not available and has been replaced
    by .GlobalEnv when processing object ‘’
    Warning: namespace ‘doParallel’ is not available and has been replaced
    by .GlobalEnv when processing object ‘’
    Warning: namespace ‘doParallel’ is not available and has been replaced
    by .GlobalEnv when processing object ‘’
    Error in checkForRemoteErrors(lapply(cl, recvResult)) : 
      3 nodes produced errors; first error: object '.doSnowGlobals' not found
    

    当 doParallel 中的函数在 worker 上反序列化时会出现警告。执行该函数并尝试访问定义在 doParallel 命名空间中的 .doSnowGlobal 时发生错误,而不是在 .GlobalEnv 中。

    您还可以通过执行以下命令来验证 doParallel 在工作人员上是否可用:

    > clusterEvalQ(cl, library(doParallel))
    Error in checkForRemoteErrors(lapply(cl, recvResult)) : 
      3 nodes produced errors; first error: there is no package called ‘doParallel’
    

    【讨论】:

      【解决方案2】:

      要在您可以运行的每个工作人员上设置库路径:

      clusterEvalQ(cl, .libPaths("Your library path"))
      

      【讨论】:

      • 完美。为什么在某些系统上这是必要的,而在某些系统上却不是?
      【解决方案3】:

      @Steve Weston 回答的一个具体情况是当您的工作人员无法加载给定的包(例如 doParallel)时,因为该包位于 Packrat 项目中。将软件包安装到系统库,或工作人员能够找到它们的其他地方。

      【讨论】:

      • 我从thread 发现我需要在 foreach 包中重新指定 libpath。然后它能够​​找到所需的包以及 .doSnowGlobals。对我的问题进行了更多研究后,packrat 本身不是问题,而是我用 packrat 加载 R 然后使用 setwd() 到子文件夹的事实。当工作人员启动时,它在项目目录中找不到 .Rprofile 并且不加载 packrat 库。
      【解决方案4】:

      我今天遇到了同样的问题,我尝试了上面所有的答案,但没有一个对我有用。然后我简单地重新安装了doSNOW包,神奇地解决了问题。

      【讨论】: