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, делая скрипт более гибким.