R doParallel: функция не может найти функцию, даже если она появляется в среде

avatar
Riktros
8 августа 2021 в 21:19
11
0
1

Проблема TLDR: функция, работающая в нормальных условиях, не работает при параллельном выполнении с использованием пакета doParallel, поскольку не может найти функцию (хотя я экспортирую нужную функцию)

У меня возникла следующая проблема с пакетом doParallel (распараллелен для циклов) и пакетом GPArotation (алгоритм поворота матрицы)

В принципе, я могу определить матрицу и критерий, которые я хочу оптимизировать, а затем функция GPForth будет вращать эту матрицу для оптимизации критерия.

ПРИМЕР (без параллельного программирования, работает)

# load packages 
library(GPArotation) 
library(doParallel)

# Define test  matrix
B <- matrix(1:4, ncol = 2) # generate 2x2 test metrix

# specify functions to be called by GPForth
absmin.criteria <- function(L) {
  sum(abs(L))
}

vgQ.absmin <- function (L) {
  list(Gq = sign(L), 
       f = absmin.criteria(L), 
       Method = "absmin")
}

# perform optimization
GPForth(B, method = "absmin")

#WORKS!

ПРИМЕР (при параллельном программировании НЕ работает)

# Set up parallelization
cores <- detectCores()
cl <- makeCluster(cores[1]-1) #not to overload computer
registerDoParallel(cl)

results <- foreach(m=1:2, .combine = rbind, .export = c('GPForth', 'absmin.criteria', 'vgQ.absmin')) %dopar% {
           GPForth(B, method = 'absmin')
    }
stopCluster(cl)

#ERROR in {: task 1 failed - "could not find function "vgQ.absmin""

Я не понимаю, почему GPForth не может найти vgQ.absmin, поскольку я передаю его напрямую через аргумент '.export'. Примечание: простое выполнение exists('vgQ.absmin') внутри цикла возвращает TRUE. Но почему-то GPForth не может его найти.

Я недостаточно разбираюсь в распараллеливании в R, чтобы понять, как это может произойти. Есть идеи?

Источник

Ответы (0)