R с параллельным & pls - как обрабатывать не завершающиеся процессы Rscript в Windows

Я хочу запустить несколько моделей наименьших квадратов в R и пытаюсь использовать преимущества параллельного пакета. Однако после выполнения моего кода я вижу экземпляры Rscript в моем диспетчере задач, которые не завершаются, пока я не закрою RStudio. Эти Rscipts являются проблемой, потому что, если я выполняю слишком много итераций, они поглощают всю свободную память на моем компьютере и в основном останавливают ее.

Кто-нибудь знает, как бороться с этими Rscripts, которые задерживаются (или может указать на ошибку в моем коде, я новичок в R)?

Ниже приведен мой пример кода:

library(pls)       #Package for PLS regression and MSC
library(parallel)  #Allows for multi-core computations for cross-validation calculations

data(gasoline)

#Parallel Computing setup
num_cores <- 2
Made_Cluster = makeCluster(num_cores, type = "PSOCK")

num_iterations <- 10
for (i in 1:num_iterations) {
  pls.options(parallel = makeCluster(num_cores, type = "PSOCK"))
  gas1 <- plsr(octane ~ NIR, data = gasoline, validation = "LOO")
}
stopCluster(Made_Cluster)

Я подтвердил, что размещение команд makeCluster и StopCluster внутри цикла создает те же Rscripts, которые не завершаются. Это также происходит, даже когда num_cores <- 1

library(pls)       #Package for PLS regression and MSC
library(parallel)  #Allows for multi-core computations for cross-validation calculations

data(gasoline)

#Parallel Computing setup
num_cores <- 1

num_iterations <- 10
for (i in 1:num_iterations) {
Made_Cluster = makeCluster(num_cores, type = "PSOCK")
  pls.options(parallel = makeCluster(num_cores, type = "PSOCK"))
  gas1 <- plsr(octane ~ NIR, data = gasoline, validation = "LOO")
stopCluster(Made_Cluster)
}

Наконец, терминал отображает странные сообщения о неиспользуемых соединениях. Эти предупреждения имеют различный синтаксис, и я не могу их последовательно воспроизводить. Вот пара примеров:

Warning messages:
1: In if (!is.vector(X) || is.object(X)) X <- as.list(X) :
      closing unused connection 4 (<-mycomputer:port#)
2: In is.data.frame(x) :
  closing unused connection 13 (<-mycomputer:port#)
3: In crossprod(q.a) :
  closing unused connection 17 (<-mycomputer:port#)

Вот мой sessioninfo()

Rstudio 
$version
[1] ‘1.1.456’

R version 3.5.1 (2018-07-02)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] parallel  stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] pls_2.6-0

loaded via a namespace (and not attached):
[1] compiler_3.5.1 tools_3.5.1  

1 ответ

Решение

Вы хотите создать только один объект "кластер" (= один вызов makeCluster(), не несколько). Что-то вроде:

cl <- makeCluster(num_cores, type = "PSOCK")
pls.options(parallel = cl)

[...]
for (i in 1:num_iterations) {
   gas1 <- plsr(octane ~ NIR, data = gasoline, validation = "LOO")
}

stopCluster(cl)

Объяснение ваших наблюдений: если вы используете pls.options(parallel = makeCluster(...)) в результате вы создаете еще один кластер в этом вызове, который не будет явно остановлен, поскольку у вас нет дескриптора к нему. Его базовые соединения в конечном итоге будут закрыты, когда сборщик мусора R обнаружит такой "заблудший" кластер - вот почему / когда вы получаете эти предупреждения. Если вы положите pls.options(parallel = makeCluster(...)) внутри цикла вы создадите один паразитный кластер на каждую итерацию и получите еще больше предупреждений. Сборщик мусора работает в "случайное" время, поэтому обратная связь этих предупреждений выглядит случайной / невоспроизводимой.

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