Инициализация кластера MPI со снегопадом R
Я пытался бежать Rmpi
а также snowfall
в кластерах моего университета, но по какой-то причине, независимо от того, сколько вычислительных узлов я выделил, мой snowfall
инициализация продолжается только на одном узле.
Вот как я его инициализирую:
sfInit(parallel=TRUE, cpus=10, type="MPI")
Есть идеи? Я предоставлю разъяснения по мере необходимости.
1 ответ
Чтобы запустить программу на основе Rmpi в кластере, вам нужно запросить несколько узлов, используя систему пакетного обслуживания, а затем выполнить скрипт R из сценария задания с помощью утилиты, такой как mpirun/mpiexec. В идеале утилита mpirun была создана для автоматического определения того, какие узлы были выделены системой пакетной очереди, в противном случае вам нужно будет использовать аргумент mpirun, такой как --hostfile
сказать ему, какие узлы использовать.
В вашем случае это звучит так, как будто вы запросили несколько узлов, поэтому проблема, вероятно, связана с тем, как выполняется сценарий R. Некоторые люди не понимают, что им нужно использовать mpirun/mpiexec, и в результате ваш скрипт выполняется на одном узле. Если вы используете mpirun, возможно, ваша установка Open MPI не была собрана с поддержкой вашей системы пакетного обслуживания. В этом случае вам придется создать соответствующий файл хоста из информации, предоставленной вашей системой пакетной очереди, которая обычно предоставляется через переменную среды и / или файл.
Вот типичная команда mpirun, которую я использую для выполнения моих параллельных сценариев R из сценария задания:
mpirun -np 1 R --slave -f par.R
Поскольку мы собираем Open MPI с поддержкой Torque, я не использую --hostfile
опция: mpirun выясняет, какие узлы использовать из PBS_NODEFILE
переменная окружения автоматически. Использование -np 1
может показаться странным, но это необходимо, если ваша программа порождает рабочих, что обычно делается при использовании snow
пакет. Я никогда не использовал snowfall
, но после просмотра исходного кода мне кажется, что sfInit
всегда звонит makeMPIcluster
с аргументом "count", который приведет к snow
порождать рабочих, так что я думаю, что -np 1
требуется для кластеров MPI с snowfall
, В противном случае mpirun запустит ваш R-скрипт на нескольких узлах, и каждый из них создаст 10 рабочих на своем собственном узле, что не то, что вам нужно. Хитрость заключается в том, чтобы установить sfInit
Аргумент "cpus" для значения, соответствующего количеству узлов, выделенных для вашей работы системой массового обслуживания. Вы можете найти Rmpi
mpi.universe.size
функция полезна для этого.
Если вы думаете, что все это сделано правильно, проблема может быть в том, как в вашем скрипте R создается кластерный объект MPI, но я подозреваю, что это связано с использованием (или отсутствием использования) mpirun.,