многокомпьютерный makePSOCKcluster в Windows: пошаговое руководство по сборке

Я пытался построить кластер с использованием нескольких компьютеров в течение трех дней и потерпел неудачу. Итак, теперь я собираюсь попытаться втянуть вас в решение моей проблемы за меня. Если все пойдет хорошо, я надеюсь, что мы сможем создать пошаговое руководство, чтобы использовать его в качестве справочного материала, чтобы сделать это в будущем, потому что пока мне не удалось найти подходящую ссылку для настройки этого ( может это слишком специфичная задача?)

В моем случае предположим, что Windows 7 с PuTTY в качестве SSH-клиента, а «localhost» будет выступать в качестве мастера.

Кроме того, давайте предположим, что только два компьютера находятся в одной сети. Я полагаю, что процесс будет достаточно легко обобщаться, так что если я смогу заставить его работать на двух компьютерах, я смогу заставить его работать и на трех. Итак, мы будем работать над localhost и remote-computer.

Вот что я собрал до сих пор (со ссылками внизу)

  1. Установите PuTTY на localhost.
  2. Установите PuTTY на remote-computer
  3. Установите SSH-сервер на remote-computer
  4. Назначить ему порт для прослушивания? (Я не уверен в этом шаге)
  5. Установите R на localhost
  6. Установите ту же версию R на remote-computer
  7. Добавьте R в переменную среды PATH как для localhost, так и для remote-computer.
  8. Запустите приведенный ниже код R из localhost

код:

library(parallel)
cl <- makePSOCKcluster(c(rep("localhost", 2),
                         rep("remote-computer", 2)))

До сих пор я сделал шаги 1-3, не уверен, нужно ли мне делать 4, сделал 5-7, и код для шага 8 просто висит на неопределенный срок.

Когда я проверяю журналы своего SSH-сервера, не видно, что я захожу на SSH-сервер с localhost. Итак, похоже, что моя первая проблема заключается в правильной настройке SSH. Кому-нибудь это удалось, и не могли бы вы поделиться своим опытом?

РЕДАКТИРОВАТЬ К сожалению: ссылки http://www.milanor.net/blog/wp-content/uploads/2013/10/03.FirstStepinParallelComputing.pdf

R Parallel — подключение к удаленным ядрам

https://stat.ethz.ch/pipermail/r-sig-hpc/2010-October/000780.html


person Benjamin    schedule 14.09.2015    source источник
comment
Обратите внимание, что makePSOCKcluster не использует ssh для запуска рабочих процессов на локальном хосте, поэтому вы не ожидаете увидеть что-либо в журналах SSH-сервера на вашем локальном компьютере.   -  person Steve Weston    schedule 23.09.2015
comment
Однако я ожидал увидеть что-то на удаленной машине. И я ничего не видел, когда писал этот вопрос. Я опубликую обновление, прежде чем я уйду с работы сегодня. Думаю, я стал ближе.   -  person Benjamin    schedule 23.09.2015


Ответы (3)


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

КОНФИГУРАЦИИ:

  1. Установите PuTTY на «удаленный компьютер»
  2. Установите SSH-сервер на «удаленный компьютер»
  3. Установите R на «удаленном компьютере» (используйте ту же версию R, что и на «локальном хосте»)
  4. Добавьте R в ПУТЬ

  5. Установите PuTTY на «localhost»

  6. Установите R на «localhost»
  7. Добавьте R в ПУТЬ

ПРОВЕРКА СОЕДИНЕНИЯ: ФАЗА I

  1. Из командной строки запустите

C:\PuTTYPath\plink.exe -pw [password] [username]@[remote_ip_address] Rscript -e rnorm(100)

(Подтвердите возврат 100 нормальных случайных переменных

  1. Из командной строки запустите

C:\PuTTYPath\plink.exe -pw [password] [username]@[remoate_ip_address] RScript -e parallel:::.slaveRSOCK() MASTER=[local_ip_address] PORT=100501 OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE

(Подтвердите, что сеанс запущен на сервере SSH, регистрируется на «удаленном компьютере»)

ПРОВЕРКА СОЕДИНЕНИЯ: ЭТАП II

  1. Из сеанса R запустите

    system(paste0("C:/PuTTYPath/plink.exe -pw [password] ", "[username]@[remote_ip_address] ", "RScript -e rnorm(100)"))

    (Подтвердите возврат 100 нормальных случайных переменных)

  2. Из сеанса R запустите

    system(paste0("C:/PuTTY/plink.exe ", "-pw [password] ", "[username]@[remote_ip_address] ", "RScript -e parallel:::.slaveRSOCK() ", "MASTER=[local_ip_address] ", "PORT=100501 ", "OUT=/dev/null ", "TIMEOUT=2592000 ", "METHODS=TRUE ", "XDR=TRUE"))

(Подтвердите, что сеанс запущен и поддерживается в журналах сервера SSH на «удаленном компьютере»

СОЗДАНИЕ КЛАСТЕРА

  1. Из сеанса R запустите

    library(snow) cl <- makeCluster(spec = c("localhost", "[remote_ip_address]"), rshcmd = "C:/PuTTY/plink.exe -pw [password]", host = "[local_ip_address]")

(Сеанс должен быть запущен и поддерживаться в журналах сервера SSH на «удаленном компьютере». В идеале функция завершается при назначении «cl»)

Создание кластера — это та точка, в которой я терплю неудачу. Я запускаю makeCluster и смотрю журналы своего SSH-сервера. Он показывает, что соединение установлено, а затем немедленно закрыто. makeCluster никогда не заканчивает работу, cl не назначается, и я застрял в том, как продолжить. Я даже не уверен, является ли это проблемой R или проблемой конфигурации на данный момент.

РЕДАКТИРОВАТЬ И РАЗРЕШЕНИЕ:

Без веской причины я попытался запустить это с пакетом snow, как показано в разделе «Создание кластера» выше. Когда я использовал пакет snow, кластер строится и стабильно работает. Не знаю, почему я не смог заставить это работать с пакетом parallel, но, по крайней мере, у меня есть что-то функциональное.

person Benjamin    schedule 23.09.2015
comment
По умолчанию R должен быть установлен с одним и тем же путем на всех машинах, потому что по умолчанию makeCluster использует полный путь к Rscript на главной машине при запуске рабочих процессов. Если он не установлен в том же месте, вы можете попробовать использовать параметр makeCluster homogeneous=FALSE, который заставит его использовать просто Rscript, как вы делаете в своих тестах. Если вы не установите homogeneous=FALSE, я не думаю, что R должен быть в PATH на удаленных машинах. - person Steve Weston; 23.09.2015
comment
Я позаботился о том, чтобы установка R была идентична. Однако я обнаружил, что мне все еще нужно добавить R в PATH, потому что когда я запускаю makeCluster на R3.2.2, он настаивает на использовании пути для R3.1.1 (и я проверил, R3.2.2 находится в моем PATH). Добавление R к PATH на обоих компьютерах позволило мне просто указать rscript = "RScript". Но благодаря тщательному проектированию машины однородны. Использование homogenous = TRUE и homogenous = FALSE не меняет текущие результаты. Я все еще вижу, как моя локальная машина подключается к удаленной, а затем немедленно разрывает соединение. - person Benjamin; 23.09.2015
comment
Только что добавил правку — мне удалось заставить кластер работать, используя пакет snow вместо пакета parallel. Я не уверен, что достаточно образован, чтобы понять, почему это работает в snow, а не в parallel. - person Benjamin; 24.09.2015

Для тех, кто ищет создание кластеров на нескольких компьютерах в Windows, ответ @Benjamin почти правильный, вам нужно следовать его инструкциям до последнего шага, который называется УСТАНОВКА КЛАСТЕРА, и убедитесь, что все предыдущие шаги работают на вашем компьютере. . Мое решение основано на пакете «Параллельный», а не на «снежном», который по сути одинаков.

Решение

Шаблон кода:

machineAddresses <-list(list(host='[Server address]',user='[user name]',rscript="[The Rscript file in the server]",rshcmd="plink -pw [Your password]"))
cl <- makePSOCKcluster(machineAddresses,manual = F)

Вы должны заполнить все [] в своем коде. На моем компьютере это:

machineAddresses <-list(list(host='192.168.1.220',user='jeff',rscript="C:/Program Files/R/R-3.3.2/bin/Rscript",rshcmd="plink -pw qwer"))
cl <- makePSOCKcluster(machineAddresses,manual = F)

Причина

Запустить кластер в Windows очень сложно, функция makePSOCKcluster обычно не работает должным образом. Самый простой способ заставить его работать — изменить manual=F на manual=T и вручную создать воркеров. Вот связанный пост, в котором говорится о том, почему функция makePSOCKcluster зависнет навсегда, и я думаю, что эти два поста в основном застряли в одном месте. Я также публикую свой ответ на этот вопрос, чтобы обсудить, как заставить его работать.

R Parallel — подключение к удаленным ядрам

person Jeff    schedule 08.06.2018

Поскольку у меня нет репутации, чтобы публиковать комментарий к ответу Джеффа, я опубликую это как ответ:

Причина, по которой я обнаружил, что автоматический запуск узлов кластера с помощью makePSOCKcluster не работает в Windows, заключается в том, что аргументы arg и outfile во внутренней parallel функции newPSOCKnode заключены в функцию shQuotes. Это приводит к тому, что комбинация cmd.exe и Rscript.exe возвращает ошибку, что приводит к вечному зависанию makePSOCKcluster.

Следующие два определения функций позволяют автоматически запускать узлы кластера с помощью makePSOCKcluter, предполагая правильную конфигурацию ssh или putty/plink для входа без пароля на основе ключа:

makePSOCKcluster <- function (names, ...) 
{
  if (is.numeric(names)) {
    names <- as.integer(names[1L])
    if (is.na(names) || names < 1L) 
      stop("numeric 'names' must be >= 1")
    names <- rep("localhost", names)
  }
  parallel:::.check_ncores(length(names))
  options <- parallel:::addClusterOptions(parallel:::defaultClusterOptions, list(...))
  cl <- vector("list", length(names))
  for (i in seq_along(cl)) cl[[i]] <- newPSOCKnode(names[[i]], 
                                                   options = options, rank = i)
  class(cl) <- c("SOCKcluster", "cluster")
  cl
}

newPSOCKnode <- function (machine = "localhost", ..., options = parallel:::defaultClusterOptions, 
                          rank) 
{
  options <- parallel:::addClusterOptions(options, list(...))
  if (is.list(machine)) {
    options <- parallel:::addClusterOptions(options, machine)
    machine <- machine$host
  }
  outfile <- parallel:::getClusterOption("outfile", options)
  master <- if (machine == "localhost") 
    "localhost"
  else parallel:::getClusterOption("master", options)
  port <- parallel:::getClusterOption("port", options)
  setup_timeout <- parallel:::getClusterOption("setup_timeout", options)
  manual <- parallel:::getClusterOption("manual", options)
  timeout <- parallel:::getClusterOption("timeout", options)
  methods <- parallel:::getClusterOption("methods", options)
  useXDR <- parallel:::getClusterOption("useXDR", options)
  env <- paste0("MASTER=", master, " PORT=", port, " OUT=", 
                #shQuote(outfile), " SETUPTIMEOUT=", setup_timeout, " TIMEOUT=", 
                (outfile), " SETUPTIMEOUT=", setup_timeout, " TIMEOUT=", 
                timeout, " XDR=", useXDR)
  arg <- "parallel:::.slaveRSOCK()"
  rscript <- if (parallel:::getClusterOption("homogeneous", options)) {
    shQuote(parallel:::getClusterOption("rscript", options))
  }
  else "Rscript"
  rscript_args <- parallel:::getClusterOption("rscript_args", options)
  if (methods) 
    rscript_args <- c("--default-packages=datasets,utils,grDevices,graphics,stats,methods", 
                      rscript_args)
  cmd <- if (length(rscript_args)) 
    paste(rscript, paste(rscript_args, collapse = " "), "-e", 
          #shQuote(arg), env)
          arg, env)
  #else paste(rscript, "-e", shQuote(arg), env)
  else paste(rscript, "-e", arg, env)
  renice <- parallel:::getClusterOption("renice", options)
  if (!is.na(renice) && renice) 
    cmd <- sprintf("nice +%d %s", as.integer(renice), cmd)
  if (manual) {
    cat("Manually start worker on", machine, "with\n    ", 
        cmd, "\n")
    utils::flush.console()
  }
  else {
    if (machine != "localhost") {
      rshcmd <- parallel:::getClusterOption("rshcmd", options)
      user <- parallel:::getClusterOption("user", options)
      cmd <- shQuote(cmd)
      cmd <- paste(rshcmd, "-l", user, machine, cmd)
    }
    if (.Platform$OS.type == "windows") {
      system(cmd, wait = FALSE, input = "")
    }
    else system(cmd, wait = FALSE)
  }
  con <- socketConnection("localhost", port = port, server = TRUE, 
                          blocking = TRUE, open = "a+b", timeout = timeout)
  structure(list(con = con, host = machine, rank = rank), class = if (useXDR) 
    "SOCKnode"
    else "SOCK0node")
}

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

person amash    schedule 26.06.2018