Параллельное выполнение поезда в карете завершается неудачно, функция не найдена

Вчера я обновил свои R-пакеты, и с тех пор параллельное выполнение функции train терпит неудачу.

Кажется, что некоторые функции, которые вызываются из рабочих, недоступны. Эти функции, по крайней мере, flatTable и probFunction.

Я столкнулся с этой проблемой на своем рабочем компьютере и смог воспроизвести ее на чистой виртуальной машине Windows 7 x64.

Я добавил минимальный рабочий пример ниже. Уважаемые пользователи stackru: Любая помощь приветствуется!

# R 3.0.2 x64, RStudio Version 0.98.490, Windows 7 x64

data(iris)
library(caret) # 6.0-21
library(doParallel) # 1.0.6

model <- "rf"

# Fail
?probFunction
?flatTable

fitControl <- trainControl(
  method = "repeatedcv"
  , number = 5  ## 5-fold CV
  , repeats = 1   ## repeated one times
  , verboseIter =TRUE
)

#### Sequential Version ####

# Runs
train(Species ~ ., data = iris, method = model, trControl = fitControl)

#### Parallelized version ####

# Fails with 
# Error in e$fun(obj, substitute(ex), parent.frame(), e$data) : 
#  worker initialization failed: Error in eval(expr, envir, enclos): could not find function "flatTable"
cl <- makeCluster(3)
registerDoParallel(cl)

train(Species ~ ., data = iris, method = model, trControl = fitControl)

stopCluster(cl)

# Fails with 
# Error in { : task 1 failed - "could not find function "probFunction""
fitControl <- trainControl(
  method = "repeatedcv"
  , number = 5  ## 5-fold CV
  , repeats = 1   ## repeated one times
  , verboseIter =TRUE
  , classProbs = TRUE
)

cl <- makeCluster(3)
registerDoParallel(cl)

train(Species ~ ., data = iris, method = model, trControl = fitControl)

stopCluster(cl)

#### Again sequential version ####

# Fails with
# Error in summary.connection(connection) : invalid connection
train(Species ~ ., data = iris, method = model, trControl = fitControl)

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

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] foreach_1.4.1      caret_6.0-21       ggplot2_0.9.3.1    lattice_0.20-23  

loaded via a namespace (and not attached):
[1] car_2.0-19         codetools_0.2-8    colorspace_1.2-4   compiler_3.0.2     dichromat_2.0-0  
 [6] digest_0.6.4       grid_3.0.2         gtable_0.1.2       labeling_0.2       MASS_7.3-29      
[11] munsell_0.4.2      nnet_7.3-7         plyr_1.8           proto_0.3-10       RColorBrewer_1.0-5
[16] reshape2_1.2.2     scales_0.2.3       stringr_0.6.2      tools_3.0.2      

2 ответа

Решение

Полученная ошибка вызвана ошибкой в ​​карете 6.0-21 при использовании doParallel, doSNOW и doMPI. Это исправлено в версии 6.0-22 в R-forge, но еще не выпущено в CRAN. Если вы не хотите ждать выхода новой версии, вы можете:

  1. Понижение до каретного 5.x
  2. Установить каретку 6.0-22 от R-forge
  3. Установите и используйте doSNOW 1.0.10 из R-forge, а не doParallel

Проблема была вызвана изменением политики CRAN, которая запрещает использование ::: оператор, даже при обращении к неэкспортированным функциям из одного пакета.


Обновить

Карет 6.0-22 был выпущен в CRAN 2014-01-18. Это должно решить проблему, о которой сообщают, используя каретку с doSNOW и подобные параллельные бэкэнды.

Первая ошибка( could not find function...) исчезает с более новыми версиями, как предложил @Steve Weston, но вторая ошибка ( Error in summary.connection(connection) : invalid connection) сохраняется.

С версией каретки 6.0.84 я мог бы исправить это, добавив allowParallel = Fк аргументам trainControl для последнего последовательного запуска.

Последняя часть кода в вопросе меняется на:

      #### Again sequential version (new) ####

fitControl_new <- trainControl(
  method = "repeatedcv"
  , number = 5  
  , repeats = 1   
  , verboseIter =TRUE
  , classProbs = TRUE
  , allowParallel = F     ## add this argument to overwrite the default TRUE
)

train(Species ~ ., data = iris, method = model, trControl = fitControl_new)

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