Используйте несколько многоядерных Linux-серверов для вычислений в R

У меня есть четыре 32-ядерных сервера Linux (CentOS 7), которые я хотел бы использовать для параллельных вычислений в R

До сих пор я использовал только пакеты doMC и registerDoMC(cores=32) для использования многоядерных возможностей одного сервера. Я хотел бы расширить это на все четыре сервера (т.е. 128=32x4, если это возможно)

Я провел поиск в Интернете, кажется, есть несколько вариантов: PSOCK, MPI, SNOW, SparkR и т. Д. Тем не менее, я не мог заставить его работать с любым предложением в Интернете.

Я знаю, что есть некоторые предпосылки, вот что я сделал до сих пор: 1) Все серверы "подключены", т.е. может SSH друг к другу без входа в систему без пароля 2) NFS смонтирована, так что все серверы могут получить доступ ко всем (доступ для чтения, записи и выполнения) 3) Все серверы работают в одних и тех же двоичных файлах R (под сборкой anaconda в общих папках, в которых находятся все серверы) можно выполнить) 4) Установил openmpi, Rmpi, snow, doSNOW, Spark, SparkR (хотя я не знаю, как его использовать)

Может ли другой дать совет, что я могу делать дальше?

большое спасибо

1 ответ

Посмотрите на будущий пакет (я автор). Он обеспечивает экосистему, которая объединяет различные параллельные бэкэнды в единый API. В вашем конкретном случае с четырьмя 32-ядерными машинами, к которым у вас уже есть "пакетный" доступ по SSH, вы можете указать своих 4*32 рабочих как:

library("future")

## Set up 4 * 32 workers on four machines
machines <- c("node1", "node2", "node3", "node4")
workers <- rep(machines, each = 32L)
plan(cluster, workers = workers)

Если на ваших машинах нет имен хостов, вы можете указать их IP-номера.

Далее, если вы хотите использовать foreach, просто продолжайте:

library("doFuture")
registerDoFuture()

y <- foreach(i = 1:100) %dopar% {
  ...
  value
}

Если вы предпочитаете lapply, вы можете использовать future.apply как:

library("future.apply")

y <- future_lapply(1:100, FUN = function(i) {
  ...
  value
})

Технические детали:
Вышеуказанное устанавливает кластер PSOCK, как определено в "параллельном" пакете. Они в основном такие же, как кластеры SNOW, и того же автора, который, я думаю, также считает кластер SNOW устаревшим вместо того, что обеспечивает "параллель". Другими словами, AFAIK больше нет смысла использовать snow/doSNOW; Параллельный /doParallel заменяет те в эти дни.

Я бы поместил кластеры MPI в раздел "расширенное использование", то есть, если у вас нет уже настроенного и запущенного кластера или если вы действительно не думаете, что вам нужен MPI, я бы воздержался от них. MPI также поощряет другой дизайн алгоритма, чтобы в полной мере использовать их. Кластеры PSOCK проделывают долгий путь, и только вы думаете, что исчерпали их, вам стоит заглянуть в MPI.

Искра - совершенно другое существо. Он разработан для распределенных вычислений на распределенных данных (в оперативной памяти). Ваш анализ может потребовать этого, но, опять же, я рекомендую вам начать с кластеров PSOCK выше - они займут вас долгий путь.

Последний PS, если у вас есть планировщик HPC (не похоже на это), просто используйте, скажем, plan(future.batchtools::batchtools_sge) вместо. Больше ничего в вашем коде не нужно менять.

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