Используйте несколько многоядерных 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)
вместо. Больше ничего в вашем коде не нужно менять.