Как настроить работников для параллельной обработки в R с помощью снегопада и нескольких узлов Windows?

Ive успешно использовал снегопад для настройки кластера на одном сервере с 16 процессорами.

require(snowfall)
if (sfIsRunning() == TRUE) sfStop()

number.of.cpus <- 15
sfInit(parallel = TRUE, cpus = number.of.cpus)
stopifnot( sfCpus() == number.of.cpus )
stopifnot( sfParallel() == TRUE )

# Print the hostname for each cluster member
sayhello <- function()
{
    info <- Sys.info()[c("nodename", "machine")]
    paste("Hello from", info[1], "with CPU type", info[2])
}
names <- sfClusterCall(sayhello)
print(unlist(names))

Теперь я ищу полные инструкции по , как перейти к распределенной модели. У меня есть 4 разных компьютера Windows с общим количеством 16 ядер, которые я бы хотел использовать для кластера 16 node. До сих пор я понимаю, что могу вручную настроить соединение SOCK или использовать MPI. Хотя это кажется возможным, я не нашел четких и полных указаний относительно того, как.

Трафик SOCK, по-видимому, зависит от кода в снеговике script. Я могу создать заглушку со стороны мастера со следующим кодом:

winOptions <-
    list(host="172.01.01.03",
         rscript="C:/Program Files/R/R-2.7.1/bin/Rscript.exe",
         snowlib="C:/Rlibs")

cl <- makeCluster(c(rep(list(winOptions), 2)), type = "SOCK", manual = T)

Это дает следующее:

Manually start worker on 172.01.01.03 with
     "C:/Program Files/R/R-2.7.1/bin/Rscript.exe"
      C:/Rlibs/snow/RSOCKnode.R
      MASTER=Worker02 PORT=11204 OUT=/dev/null SNOWLIB=C:/Rlibs

Это похоже на разумное начало. Я нашел код для RSOCKnode.R на GitHub под пакетом снега:

local({
    master <- "localhost"
    port <- ""
    snowlib <- Sys.getenv("R_SNOW_LIB")
    outfile <- Sys.getenv("R_SNOW_OUTFILE") ##**** defaults to ""; document

    args <- commandArgs()
    pos <- match("--args", args)
    args <- args[-(1 : pos)]
    for (a in args) {
        pos <- regexpr("=", a)
        name <- substr(a, 1, pos - 1)
        value <- substr(a,pos + 1, nchar(a))
        switch(name,
               MASTER = master <- value,
               PORT = port <- value,
               SNOWLIB = snowlib <- value,
               OUT = outfile <- value)
    }

    if (! (snowlib %in% .libPaths()))
        .libPaths(c(snowlib, .libPaths()))
    library(methods) ## because Rscript as of R 2.7.0 doesn't load methods
    library(snow)

    if (port == "") port <- getClusterOption("port")

    sinkWorkerOutput(outfile)
    cat("starting worker for", paste(master, port, sep = ":"), "\n")
    slaveLoop(makeSOCKmaster(master, port))
})

Неясно, как на самом деле запустить SOCK-прослушиватель для рабочих, если он не похоронен в snow::recvData.

Оглядываясь на маршрут MPI, насколько я могу судить, Microsoft MPI версии 7 является отправной точкой. Однако я не смог найти альтернативу Windows для sfCluster. Мне удалось запустить службу MPI, но она не кажется, что прослушивает порт 22, и никакое количество ошибок против него с snowfall::makeCluster не дало результата. Ive отключил брандмауэр и попробовал тестирование с помощью makeCluster и напрямую подключился к рабочему из мастера с помощью PuTTY.


Есть ли всеобъемлющее пошаговое руководство по созданию кластера снегопада для рабочих Windows, которые Ive пропустил? Я увлекаюсь snowfall::sfClusterApplyLB и хотел бы продолжать использовать это, но если есть более легкое решение, Id будет готов изменить курс. Изучая Rmpi ​​и параллельно, я нашел альтернативные решения для главной стороны работы, но все еще мало что не рассказал о том, как настроить рабочих, работающих под управлением Windows.

Из-за характера рабочей среды ни переход на AWS, ни Linux не является вариантом.

Связанные вопросы без окончательных ответов для рабочих узлов Windows: