optimParallel в одноименном пакете не может найти функцию C_dnorm - PullRequest
0 голосов
/ 29 сентября 2018

Я хочу оптимизировать функцию из пакета в R, используя optimParallel.До сих пор я оптимизировал только те функции, которые написал в своей среде, и это работало.Но функции из любого пакета не работают, и я получаю сообщение об ошибке.Я проверил с помощью .libPaths (), являются ли пути одинаковыми на каждом узле, и я использовал Sys.info (), чтобы проверить наличие различий.Вот пример (который не имеет смысла, но он должен показать мою проблему)

library(optimParallel)

.libPaths()
[1] "C:/Users/Name/Documents/R/win-library/3.5" "C:/Program Files/R/R-3.5.1/library"       

cl <- makeCluster(2) #also tried to set "master" to my IP
clusterEvalQ(cl, .libPaths())
[[1]]
[1] "C:/Users/Name/Documents/R/win-library/3.5" "C:/Program Files/R/R-3.5.1/library"       

[[2]]
[1] "C:/Users/Name/Documents/R/win-library/3.5" "C:/Program Files/R/R-3.5.1/library" 

setDefaultCluster(cl)
optimParallel(par=0, dnorm, mean=1, method = "L-BFGS-B")$par
Error in checkForRemoteErrors(val) : 
   2 nodes produced errors; first error: object 'C_dnorm' not found

#for comparison 
optim(par=0, dnorm, mean=1, method = "L-BFGS-B")$par
[1] -5.263924

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Редактировать: проблема решена в optimParallel версии 0.7-4

Версия доступна на CRAN: https://CRAN.R -project.org / package = optimParallel


Для более старых версий:

Обходной путь - обернуть dnorm() в функцию, определенную в .GlobalEnv.

library("optimParallel")
cl <- makeCluster(2) 
setDefaultCluster(cl)
f <- function(x, mean) dnorm(x, mean=mean)
optimParallel(par=0, f, mean=1, method="L-BFGS-B")$par
[1] -5.263924

Более сложная задача - объяснить, почемувозникает проблема:

  • optimParallel() использует parallel::parLapply() для оценки f.
  • parLapply() имеет аргументы cl, X, fun.
  • Если бы мы использовали parLapply() без предварительной обработки аргументов, переданных через ... из optimParallel(), f не могли бы иметь аргументы с именами cl, X, funпотому что это может привести к ошибкам вроде:

    Error in lapply(X = x, FUN = f, ...) (from #2) : 
    formal argument "X" matched by multiple actual arguments
    
  • Проще говоря, optimParallel() позволяет избежать этой ошибки, удалив все аргументы из f, поместив их в среду и оценив f в этомсреда.
  • Одна из проблем этого подхода возникает, когда f определен в другом пакете R и ссылается на скомпилированный код.Этот случай иллюстрируется в приведенном выше вопросе.

Приветствуются предложения по улучшению подхода к решению проблемы.Я открыл соответствующий вопрос здесь .Пока нет лучшего решения, можно использовать обходной путь, показанный выше.

0 голосов
/ 29 сентября 2018

Исходя из того, что в вашем сообщении об ошибке указано, что параллельные процессы не получают адекватной информации, я посмотрел примеры в документации к пакету optimParallel.Первая определяет вспомогательную функцию, которая будет нести с собой среду, но в остальном она в некоторых отношениях напоминает вашу.

library(optimParallel)
 set.seed(123); x <- rnorm(n=1000, mean=1, sd=2)
 negll <- function(par, x) -sum(dnorm(x=x, mean=par[1], sd=par[2], log=TRUE))
 o1 <- optimParallel(par=c(0, 1), fn=negll, x=x, method="L-BFGS-B", lower=c(-Inf, 0.0001))
 o1$par
#[1] 1.032256 1.982398

Этот пример также отличается от вашего тем, что он использует данные для оценки параметров.Я не уверен, что означает ваш результат, в то время как я понимаю, что значения, возвращенные модификацией того примера, который я опубликовал здесь.Минимальное логарифмическое правдоподобие для этих конкретных данных (не полностью воспроизводимых, поскольку я забыл установить начальное число) составляет в среднем 1.126 и sd 2.007.

Например, как создать ситуацию, когдасреда неосновного пакета передается рабочим, см. этот предыдущий ответ: parallel :: clusterExport, как передать вложенные функции из глобальной среды?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...