makePSOCKcluster зависает на win x64 после вызова системы

У меня возникла проблема с отладкой makePSOCKcluster из пакета parallel на R x64 в Windows. Этого не происходит ни на R i386 в Windows, ни на OSX или Linux. К сожалению, это тоже происходит не постоянно, а только изредка и совершенно случайно.

Что происходит, так это то, что функция makePSOCKcluster истекает и замораживает сеанс R, но только если ранее в сеансе были выполнены некоторые (произвольные) вызовы system(). Видео и сценарий ниже иллюстрируют проблему более наглядно.

Некоторые вещи, которые я пробовал без успеха:

  • Отключите антивирус/брандмауэр.
  • Ожидание в течение нескольких секунд между вызовами system и makePSOCKcluser.
  • Использование различных системных вызовов.

Как бы я еще сузил это? Вот видео и сценарий, использованный в видео:

cmd_exists <- function(command){
  iswin <- identical(.Platform$OS.type, "windows"); 
  if(iswin){
    test <- suppressWarnings(try(system(command, intern=TRUE, ignore.stdout=TRUE, ignore.stderr=TRUE, show.output.on.console=FALSE), silent=TRUE));
  } else {
    test <- suppressWarnings(try(system(command, intern=TRUE, ignore.stdout=TRUE, ignore.stderr=TRUE), silent=TRUE));    
  }
  !is(test, "try-error")
}

options(hasgit = cmd_exists("git --version")); 
options(haspandoc = cmd_exists("pandoc --version"));  
options(hastex = cmd_exists("texi2dvi --version"));
cluster <- parallel::makePSOCKcluster(1);

person Jeroen    schedule 26.06.2013    source источник
comment
+1 за нестандартную идею видео...   -  person agstudy    schedule 26.06.2013
comment
так что если вы удалите вызовы options(), проблем не будет? вы можете попробовать протестировать, если он есть в частности... Вы также можете посмотреть на реализацию makePSOCKcluster и посмотреть, где она зависает.   -  person Karl Forner    schedule 19.02.2014


Ответы (1)


makePSOCKCluster или, в более общем случае, makeCluster, может зависнуть по ряду причин при создании так называемых worker процессов, которые включают в себя запуск новых сеансов R с помощью команды Rscript, которая выполнит функцию .slaveRSOCK, которая создаст обратное сокетное соединение с master, а затем выполните функцию slaveLoop, где она в конечном итоге выполнит задачи, отправленные ему мастером. Когда что-то пойдет не так при запуске любого из рабочих процессов, мастер зависнет во время выполнения socketConnection, ожидая, пока рабочий процесс подключится к нему, даже если этот рабочий процесс умер или даже никогда не был успешно создан.

Использование аргумента outfile прекрасно, потому что оно часто выявляет ошибку, из-за которой рабочий процесс умирает и, следовательно, зависает мастер. Но если это ничего не выявит, то перейдите в ручной режим. В ручном режиме мастер печатает команду для запуска каждого рабочего вместо выполнения самой команды. Это больше работы, но дает вам полный контроль, и вы даже можете отлаживать рабочие процессы, если вам это нужно.

Вот пример:

> library(parallel)

> cl <- makePSOCKcluster(1, manual=TRUE, outfile='log.txt')
Manually start worker on localhost with
   '/usr/lib/R/bin/Rscript' -e 'parallel:::.slaveRSOCK()' MASTER=localhost
PORT=10187 OUT=log.txt TIMEOUT=2592000 METHODS=TRUE XDR=TRUE 

Затем откройте новое окно терминала (командную строку или что-то еще) и вставьте эту команду Rscript. Как только вы его запустите, makePSOCKcluster должен вернуться, так как мы запросили только один рабочий процесс. Конечно, если что-то пойдет не так, он не вернется, но если вам повезет, вы получите сообщение об ошибке в окне терминала, и у вас будет важная подсказка, которая, надеюсь, приведет к решению вашей проблемы. . Если вам не так повезло, команда Rscript также зависнет, и вам придется погрузиться еще глубже.

Чтобы отладить работника, вы не выполняете отображаемую команду Rscript, потому что вам нужен интерактивный сеанс. Вместо этого вы начинаете сеанс R с помощью такой команды, как:

$ R --vanilla --args MASTER=localhost PORT=10187 OUT=log.txt TIMEOUT=2592000 METHODS=TRUE XDR=TRUE

В этом сеансе R вы можете поставить точку останова на функцию .slaveRSOCK, а затем выполнить ее:

> debug(parallel:::.slaveRSOCK)
> parallel:::.slaveRSOCK()

Теперь вы можете начать выполнять код, возможно, устанавливая точки останова в функциях slaveLoop и makeSOCKmaster.

person Hack-R    schedule 27.06.2014
comment
У меня была та же проблема, и подсказка, которая включает в себя запуск новых сеансов R с помощью команды Rscript, была очень полезной. Когда у R возникают проблемы с запуском (например, недоступный сетевой диск, ошибка в файле .Rsite), makePSOCKcluster зависает при создании кластеров. В моем случае R зависал почти незаметно из-за проблемы с сетью; после удаления неправильного сетевого пути я мог без проблем использовать makePSOCKcluster. - person tomka; 22.09.2017