doMPI и пользовательские пакеты - PullRequest
0 голосов
/ 01 октября 2018

Я начинаю использовать doMPI, и я использую пакет, который я определил сам.

Сначала у меня в файле должно быть выполнено:

library(doMPI)
cl <- startMPIcluster() 
registerDoMPI(cl)

Примечание: Я не использую cl <- startMPIcluster(count), так как считаю, что лучше указать количество ядер "вне" функции, но мне не ясно, правильно ли делать cl <- startMPIcluster() или нет.

И затем, после загрузки моего пакета через library(my_package)

myres <- foreach(t2 = 1550:1551) %dopar% {my_function(t2)}

с использованием mpirun это привело к

Ошибка оценки: не удалось найти функцию "my_function"

Но функция my_function распознается в кластере: когда я запускаю my_function без MPI, результаты верны.

Затем я изменил вызов на:

myres <- foreach(t2 = 1550:1551) %dopar% {my_package::my_function(t2)}

и затем он начал работать, поэтому добавление my_package:: позволило mpirun понять, что такое my_function.Что странно, так как я запускал перед библиотекой (my_package).

Но после начала запуска возникает другая ошибка:

"Ошибка оценки: не удалось найти функцию"my_function_2 "."

my_function_2 - это определенная функция в моем пакете.

Конечно, одной из возможностей может быть переход ко всем функциям в моем пакете, и когдаэто вызов другой функции, просто добавьте my_package::.

Но я считаю, что это не то, что должно быть, поэтому я предполагаю, что есть основная ошибка / плохо использованная инструкция, которую я не вижу.

Есть идеи, что может быть не так?Заранее спасибо.

1 Ответ

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

Вы должны инициализировать работников, используя опцию foreach .packages:

myres <-
  foreach(t2=1550:1551, .packages='my_package') %dopar% {
    my_function(t2)
  }

Это приводит к загрузке каждого из работников кластера my_package.Загрузка пакета в мастер-процесс не приводит к его загрузке работниками кластера, поэтому необходимо .packages.

Что касается startMPIcluster, я никогда не использую аргумент count, если толькоЯ выполняю сценарий R без mpirun (который ограничивает вас работой на одном узле).Если count не указано, startMPIcluster получает всю информацию из mpirun, что делает скрипт более гибким.

...