doMPI и пользовательские пакеты

Я начинаю использовать 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).

Но после запуска запустить еще одну ошибку:

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

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

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

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

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

1 ответ

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

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

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

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

Другие вопросы по тегам