распараллелить собственный пакет в R - PullRequest
0 голосов
/ 25 сентября 2018

Как рекомендовано в других постах, я написал свой собственный пакет в R для распараллеливания функций, написанных с помощью Rcpp.Я могу загрузить пакет, и все работает, но когда я использую optimParallel, я получаю сообщение:

Ошибка в checkForRemoteErrors (val): 3 узла вызвали ошибки;Первая ошибка: объект '_EffES_profileLLcpp' не найден

Вот что я делаю:

library(optimParallel)
library(EffES) # EffES is my own package

cl <- makeCluster(detectCores()-1)
clusterEvalQ(cl, library(EffES))
clusterEvalQ(cl, library(optimParallel))
setDefaultCluster(cl = cl)

w.es <- optimParallel(par=rep(0.001,3), profileLLcpp, y=y.test, x=x.test, lower = rep(0.001,3), method = "L-BFGS-B")$par

Error in checkForRemoteErrors(val) : 
  3 nodes produced errors; first error: object '_EffES_profileLLcpp' not found

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

Ответы [ 2 ]

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

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

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


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

Как подробно описано в , в этом посте optimParallel() нужно немного обмануть, чтобы не было ограничений на имена аргументов, которые можно передавать через ... аргумент.В настоящее время это означает, что функция, переданная в optimParallel(), должна быть определена в .GlobalEnv, чтобы правильно найти скомпилированный код.

Следовательно, можно обойти эту проблему, чтобы определить функцию в .GlobalEnv:

library(optimParallel)
library(EffES)                          # EffES is your own package
cl <- makeCluster(detectCores()-1)
clusterEvalQ(cl, library(EffES))
setDefaultCluster(cl=cl)

f <- function(par, y, x) {
    profileLLcpp(par=par, x=x, y=y)
}
optimParallel(par=rep(0.001,3), f=f, y=y.test, x=x.test, 
              lower = rep(0.001,3), method = "L-BFGS-B")$par

Предложения по улучшению кода optimParallel () приветствуются.Я открыл соответствующий вопрос здесь .

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

Вы должны распространить объект '_EffES_profileLLcpp' на каждое ядро ​​вашего кластера.Вы можете сделать это, используя clusterExport, в вашем случае:

clusterExport(cl,'_EffES_profileLLcpp')

Повторите этот шаг для каждого объекта, который должен использоваться параллельно (или просто проверьте, какой объект отображается в журнале ошибок, и распылите его, используяclusterExport).

Надеюсь, это поможет

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