Коммуникация параллельных процессов: какие у меня варианты?

Я пытаюсь немного углубиться в распараллеливание подпрограмм R.

Какие у меня варианты в отношении общения кучи "рабочих" процессов по поводу

  1. связь между соответствующими работниками?
  2. связь воркеров с процессом master?

AFAIU, не существует такой вещи, как «общая среда/общая память», к которой имеют доступ как главный, так и все рабочие процессы, верно?

На данный момент лучшая идея, которая пришла мне в голову, — это основывать общение на чтении и записи документов JSON на жесткий диск. Вероятно, это плохая идея ;-) Я выбрал .json, а не .Rdata файлов, потому что JSON, похоже, часто используется для межпрограммного взаимодействия, поэтому я решил использовать этот «стандарт».

С нетерпением ждем возможности узнать о лучших вариантах!

К вашему сведению: обычно я распараллеливаю функции базового пакета parallel и вспомогательного пакета снегопад, в основном полагаясь на функцию sfClusterApplyLB() для выполнения работы

РЕДАКТИРОВАТЬ

Я должен был указать, что я работаю в Windows, но ответы/подсказки на основе Linux также очень ценятся!


person Rappster    schedule 20.07.2012    source источник


Ответы (2)


Для связи между процессами забавным местом для начала является страница справки ?socketConnections и код в блоке с пометкой «## Not run:». Итак, запустите процесс R и запустите

 con1 <- socketConnection(port = 6011, server=TRUE)

Этот процесс действует как сервер, прослушивая определенный порт для получения некоторой информации. Теперь запустите второй процесс R и введите

 con2 <- socketConnection(Sys.info()["nodename"], port = 6011)

con2 в процессе 2 установил сокетное соединение с con1 в процессе 1. Вернувшись в con1, запишите объект R LETTERS

writeLines(LETTERS, con1)

и получить их на con2.

readLines(con2)

Итак, вы общались между процессами без записи на диск. Здесь также неявно подразумеваются некоторые важные концепции, например, о блокирующих и неблокирующих соединениях. Это не ограничивается обменом данными на одном компьютере, при условии, что порты доступны в любой сети, в которой находятся компьютеры. Это основа для makePSOCKcluster в параллельном пакете, с добавлением того, что процесс 1 фактически использует команду system и сценарий в параллельном пакете для запуска процесса 2. Объект, возвращаемый makePSOCKcluster, является подустанавливаемым, поэтому вы можете выделить часть вашего кластера для решения конкретной задачи. В принципе, вы можете настроить порожденные узлы для связи друг с другом независимо от узла, который создал порождение.

Интересное упражнение — сделать то же самое, используя форк-команды в пакете parallel (в системах, отличных от Windows). Подробная версия этого находится на странице справки ?mcparallel, например,

 p <- mcparallel(1:10)
 q <- mcparallel(1:20)
 # wait for both jobs to finish and collect all results
 res <- mccollect(list(p, q))

но это строится на более низком уровне sendMaster и друзей (пик в исходном коде mcparallel и mccollect).

В пакете Rmpi ​​используется подход, аналогичный примеру PSOCK, где менеджер использует скрипты для создания рабочих процессов, а для связи используется mpi, а не сокеты. Но другой подход, достойный проекта выходного дня, если у вас есть работающая реализация MPI, заключается в реализации сценария, который выполняет одни и те же вычисления для разных данных, а затем сопоставляет результаты на одном узле, используя такие команды, как mpi.comm.rank, mpi.barrier, mpi.send.Robj, и mpi.recv.Robj.

В забавном проекте выходного дня можно было бы использовать пакет parallel для реализации рабочего процесса, включающего параллельные вычисления, но не типа mclapply, например, когда один процесс собирает данные с веб-сайта, а затем передает их другому процессу, который рисует красивые картинки. Входными данными для первого процесса вполне может быть JSON, но связь внутри R, вероятно, гораздо более уместна в объектах данных R.

person Martin Morgan    schedule 20.07.2012

Как подробно описано в представлении задач CRAN для высокопроизводительных вычислений, < пакет href="http://cran.r-project.org/web/packages/Rdsm/index.html" rel="noreferrer">Rdsm от Norm Matloff предлагает обмен данными с общей памятью.

person Dirk Eddelbuettel    schedule 20.07.2012