ПарРФ на карете не работает более чем на одно ядро

ParRF из пакета caret R не работает для меня с более чем одним ядром, что довольно иронично, учитывая, что par в parRF означает параллель. Я на машине с Windows, если это важная информация. Я проверил, что я использую последнюю версию, касающуюся caret и doParallel.

Я сделал минимальный пример и приведу результаты ниже. Есть идеи?

Исходный код

library(caret)
library(doParallel)

trCtrl <- trainControl(
  method = "repeatedcv"
  , number = 2
  , repeats = 5
  , allowParallel = TRUE
)

# WORKS
registerDoParallel(1)
train(form = Species~., data=iris, trControl = trCtrl, method="parRF")
closeAllConnections()

# FAILS
registerDoParallel(2)
train(form = Species~., data=iris, trControl = trCtrl, method="parRF")
closeAllConnections()

Выход

> library(caret)
> library(doParallel)
> 
> trCtrl <- trainControl(
+   method = "repeatedcv"
+   , number = 2
+   , repeats = 5
+   , allowParallel = TRUE
+ )
> 
> 
> # WORKS
> registerDoParallel(1)
> train(form = Species~., data=iris, trControl = trCtrl, method="parRF")
Parallel Random Forest 

150 samples
  4 predictors
  3 classes: 'setosa', 'versicolor', 'virginica' 

... some more model output, works fine!
> closeAllConnections()
> 
> # FAILS
> registerDoParallel(2)
> train(form = Species~., data=iris, trControl = trCtrl, method="parRF")
Error in train.default(x, y, weights = w, ...) : 
  final tuning parameters could not be determined
In addition: Warning messages:
1: In nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo,  :
  There were missing values in resampled performance measures.
2: In train.default(x, y, weights = w, ...) :
  missing values found in aggregated results
> closeAllConnections()

Информация о сессии

> sessionInfo()
R version 3.1.0 (2014-04-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252    LC_MONETARY=German_Germany.1252 LC_NUMERIC=C                   
[5] LC_TIME=German_Germany.1252    

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

other attached packages:
[1] doParallel_1.0.8   iterators_1.0.7    foreach_1.4.2      e1071_1.6-3        randomForest_4.6-7 caret_6.0-30       ggplot2_1.0.0     
[8] lattice_0.20-29   

loaded via a namespace (and not attached):
 [1] BradleyTerry2_1.0-4 brglm_0.5-9         car_2.0-20          class_7.3-10        codetools_0.2-8     colorspace_1.2-4   
 [7] compiler_3.1.0      digest_0.6.4        gnm_1.0-7           grid_3.1.0          gtable_0.1.2        gtools_3.4.1       
[13] lme4_1.1-6          MASS_7.3-31         Matrix_1.1-3        minqa_1.2.3         munsell_0.4.2       nlme_3.1-117       
[19] nnet_7.3-8          plyr_1.8.1          proto_0.3-10        qvcalc_0.8-8        Rcpp_0.11.2         RcppEigen_0.3.2.1.2
[25] relimp_1.0-3        reshape2_1.4        scales_0.2.4        splines_3.1.0       stringr_0.6.2       tcltk_3.1.0        
[31] tools_3.1.0   

Обновить

  • Пробовал с 3.1.1 (одинаковые версии пакетов), тот же результат.
  • Пробовал это с 3.0.2 и более старой версией CarePoParallel, это работало (см. Информацию о сеансе)

Информация о сеансе 2:

R version 3.0.2 (2013-09-25)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252    LC_MONETARY=German_Germany.1252
[4] LC_NUMERIC=C                    LC_TIME=German_Germany.1252    

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

other attached packages:
 [1] e1071_1.6-1        class_7.3-9        randomForest_4.6-7 doParallel_1.0.6   iterators_1.0.6   
 [6] caret_5.17-7       reshape2_1.2.2     plyr_1.8           lattice_0.20-24    foreach_1.4.1     
[11] cluster_1.14.4    

loaded via a namespace (and not attached):
[1] codetools_0.2-8 compiler_3.0.2  grid_3.0.2      stringr_0.6.2   tools_3.0.2    

1 ответ

Решение

Это явно ошибка в версии 6.0-30, появившаяся после версии 5.17-7. Это также другая проблема, которая с большей вероятностью поражает пользователей Windows, поскольку doParallel "mclapply mode" работает, а "clusterApplyLB mode" не работает.

Я провел несколько тестов, и похоже, что проблема в том, что работники кластера не были должным образом инициализированы для выполнения вложенных параллельных вычислений, поэтому вы можете обойти ошибку, загрузив пакет foreach в работники кластера, прежде чем вызывать "train". ". Для этого вам нужно явно создать объект кластера, а не позволять функции "registerDoParallel" создавать его для вас (что он делает в Windows). Например:

cl <- makePSOCKcluster(2)
clusterEvalQ(cl, library(foreach))
registerDoParallel(cl)

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

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