Как использовать sfInit и makeCluster типа "MPI" / передача сообщений в R / распараллеливании на кластере

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

При использовании sfInit а также makecluster функции с типом "SOCK"затем сценарий запускается на кластере успешно, но без повышения скорости - в отличие от моего компьютера: когда я меняюсь detectcores() в 1Скрипты работают существенно медленнее, чем с 4 ядрами.

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

НО: если я сделаю это, скрипт остановится со следующим кодом ошибки:

Loading required package: Rmpi
Error: package or namespace load failed for ‘Rmpi’:
 .onLoad failed in loadNamespace() for 'Rmpi', details:
  call: dyn.load(file, DLLpath = DLLpath, ...)
  error: unable to load shared object '/cluster/sfw/R/3.5.1-gcc73-base/lib64/R/library/Rmpi/libs/Rmpi.so':
  libmpi.so.20: cannot open shared object file: No such file or directory
Failed to load required library: Rmpi for parallel mode MPI
Fallback to sequential execution
snowfall 1.84-6.1 initialized: sequential execution, one CPU.

Я подумал "кусок пирога, легко" и добавил следующие строки:

install.packages('Rmpi', repos = "http://cran.us.r-project.org",
dependencies = TRUE, lib = '/personalpath') install.packages('doMPI',
repos = "http://cran.us.r-project.org", dependencies = TRUE, lib = '/personalpath') library(topicmodels, lib.loc = '/personalpath')
library(Rmpi, lib.loc = '/personalpath')

Что приводит к успешной установке, но:

Error in library(Rmpi, lib.loc = "/personalpath") :
there is no package called ‘Rmpi’

1. Как мне установить эти пакеты?

2. Мне действительно нужно их устанавливать или это совершенно неправильный подход?

Любая помощь высоко ценится! Я знаю, что здесь есть пара вопросов (см. Это, это и это). Но я не знаком с вызовами в Linux и, что более важно, у меня нет никаких прав на этот кластер. Поэтому мне нужно найти решение в R...

Итак.. это мой код:

sfInit(parallel=TRUE, cpus=detectCores(), type="MPI")

cl <- makeCluster(detectCores(), type = "MPI")
registerDoSNOW(cl) 

sfExport('dtm_stripped', 'control_LDA_Gibbs')
sfLibrary(topicmodels)

clusterEvalQ(cl, library(topicmodels))
clusterExport(cl, c("dtm_stripped", "control_LDA_Gibbs"))

BASE <- system.time(best.model.BASE <<- lapply(seq, function(d){LDA(dtm_stripped, control = control_LDA_Gibbs, method ='Gibbs', d)}))
PLYR_S <- system.time(best.model.PLYR_S <<- llply(seq, function(d){LDA(dtm_stripped, control = control_LDA_Gibbs, method ='Gibbs', d)}, .progress = "text"))

wrapper <- function (d) topicmodels:::LDA(dtm_stripped, control = control_LDA_Gibbs, method ='Gibbs', d)
PARLAP <- system.time(best.model.PARLAP <<- parLapply(cl, seq, wrapper))
DOPAR <- system.time(best.model.DOPAR <<- foreach(i = seq, .export = c("dtm_stripped", "control_LDA_Gibbs"), .packages = "topicmodels", .verbose = TRUE) %dopar% (LDA(dtm_stripped, control = control_LDA_Gibbs, method ='Gibbs', k=i)))
SFLAPP <- system.time(best.model.SFLAPP <<- sfLapply(seq, function(d){topicmodels:::LDA(dtm_stripped, control = control_LDA_Gibbs, method ='Gibbs', d)})) 
SFCLU <- system.time(best.model.SFCLU <<- sfClusterApplyLB(seq, function(d){topicmodels:::LDA(dtm_stripped, control = control_LDA_Gibbs, method ='Gibbs', d)})) 
PLYRP <- system.time(best.model.PLYRP <<- llply(seq, function(d){topicmodels:::LDA(dtm_stripped, control = control_LDA_Gibbs, method ='Gibbs', d)}, .parallel = TRUE))

results_speedtest <- rbind(BASE, PLYR_S, PARLAP, DOPAR, SFLAPP, SFCLU, PLYRP)
print(results_speedtest)

0 ответов

Есть и другие способы распараллеливания в R. Может быть, эта ссылка поможет, как объясняется на второй странице, что делают эти типы кластеров, такие как socket, mpi и fork: https://stat.ethz.ch/R-manual/R-devel/library/parallel/doc/parallel.pdf

В противном случае я также могу порекомендовать посмотреть в пакет foreach, так как синтаксис больше похож на обычный цикл for. Обратите внимание, что некоторые распараллеливающие пакеты доступны не для всех операционных систем.

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