ошибка: объект '.doSnowGlobals' не найден?

Я пытаюсь распараллелить код на 4 узлах (тип = "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 в кластере? Я мог создавать узлы на локальном хосте, используя снег, но не в кластере. Кто-нибудь пользуется снегом?


person Rajendra Kumar    schedule 01.08.2014    source источник


Ответы (4)


Вы можете получить эту ошибку, если какой-либо из рабочих процессов не может загрузить пакет doParallel. Вы можете сделать это, установив doParallel в какой-нибудь каталог и указав мастеру на него через «.libPaths»:

> .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 десериализуется в рабочем потоке. Ошибка возникает, когда функция выполняется и пытается получить доступ к .doSnowGlobal, который определен в пространстве имен doParallel, а не в .GlobalEnv.

Вы также можете убедиться, что doParallel доступен на рабочих процессах, выполнив:

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

Чтобы установить путь к библиотеке для каждого рабочего, вы можете запустить:

clusterEvalQ(cl, .libPaths("Your library path"))
person Nat    schedule 19.10.2016
comment
идеально. Почему в какой-то системе это необходимо, а в какой-то нет? - person Ahdee; 08.05.2020

Конкретный случай ответа @Steve Weston - это когда ваши рабочие не могут загрузить данный пакет (например, doParallel), потому что пакет находится внутри проекта Packrat. Установите пакеты в системную библиотеку или в другое место, где рабочий сможет их найти.

person woodvi    schedule 27.04.2016

Сегодня я столкнулся с той же проблемой, и я пробовал все ответы выше, ни один из которых не работал для меня. Затем я просто переустановил пакет doSNOW, и волшебным образом проблема была решена.

person Community    schedule 21.01.2019