Параллельная обработка R с проблемами вычисления Caret - PullRequest
0 голосов
/ 07 июня 2018

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

Когда алгоритм RFE SVM успешно работает параллельно, это занимает около 250 секунд.Тем не менее, в большинстве случаев он никогда не завершает вычисления и должен быть отключен вручную через 30 минут.Когда это происходит, проверка монитора активности показывает, что ядра все еще работают, несмотря на то, что Rstudio выключил его.Эти ядра должны быть завершены с помощью killall R от терминала.

Фрагмент кода, указанный в пакете AppliedPredictiveModeling ниже, с удаленным избыточным кодом.

library(AppliedPredictiveModeling)
data(AlzheimerDisease)

## The baseline set of predictors
bl <- c("Genotype", "age", "tau", "p_tau", "Ab_42", "male")

## The set of new assays
newAssays <- colnames(predictors)
newAssays <- newAssays[!(newAssays %in% c("Class", bl))]

## Decompose the genotype factor into binary dummy variables

predictors$E2 <- predictors$E3 <- predictors$E4 <- 0
predictors$E2[grepl("2", predictors$Genotype)] <- 1
predictors$E3[grepl("3", predictors$Genotype)] <- 1
predictors$E4[grepl("4", predictors$Genotype)] <- 1
genotype <-  predictors$Genotype

## Partition the data
library(caret)
set.seed(730)
split <- createDataPartition(diagnosis, p = .8, list = FALSE)

adData <- predictors
adData$Class <- diagnosis

training <- adData[ split, ]
testing  <- adData[-split, ]

predVars <- names(adData)[!(names(adData) %in% c("Class",  "Genotype"))]

## This summary function is used to evaluate the models.
fiveStats <- function(...) c(twoClassSummary(...), defaultSummary(...))

## We create the cross-validation files as a list to use with different 
## functions

set.seed(104)
index <- createMultiFolds(training$Class, times = 5)

## The candidate set of the number of predictors to evaluate
varSeq <- seq(1, length(predVars)-1, by = 2)

# Beginning parallelization 
library(doParallel)
cl <- makeCluster(7)
registerDoParallel(cl) 
getDoParWorkers() 

# Rfe and train control objects created
ctrl <- rfeControl(method = "repeatedcv", repeats = 5,
                   saveDetails = TRUE,
                   index = index,
                   returnResamp = "final")

fullCtrl <- trainControl(method = "repeatedcv",
                         repeats = 5,
                         summaryFunction = fiveStats,
                         classProbs = TRUE,
                         index = index)


## Here, the caretFuncs list allows for a model to be tuned at each iteration 
## of feature seleciton.

ctrl$functions <- caretFuncs
ctrl$functions$summary <- fiveStats

## This options tells train() to run it's model tuning
## sequentially. Otherwise, there would be parallel processing at two
## levels, which is possible but requires W^2 workers. On our machine,
## it was more efficient to only run the RFE process in parallel. 

cvCtrl <- trainControl(method = "cv",
                       verboseIter = FALSE,
                       classProbs = TRUE,
                       allowParallel = FALSE)

set.seed(721)
svmRFE <- rfe(training[, predVars],
              training$Class,
              sizes = varSeq,
              rfeControl = ctrl,
              metric = "ROC",
              ## Now arguments to train() are used.
              method = "svmRadial",
              tuneLength = 12,
              preProc = c("center", "scale"),
              trControl = cvCtrl)

Это не единственная модель, которая вызывает у меня проблемы.Иногда случайный лес с RFE также вызывает ту же проблему.В исходном коде используется пакет doMQ, однако проверка монитора активности показывает несколько rsession, которые служат в качестве распараллеливания, и я предполагаю, что запуск с использованием графического интерфейса пользователя приводит к отключению, когда вычисления не прекращаются, требует отменыВся R-связь и перезапуск сеанса, а не просто отказ от вычислений.У первого, конечно, есть печальное следствие того, что я вытираю окружающую среду.

Я использую MacBook Pro середины 2013 года с 8 ядрами.

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

Редактировать: Кажется, что после выхода из неудачного выполнения R завершается неудачно на всех последующих задачах, которые распараллеливаются через Caret, даже на тех, которые выполнялись раньше.Это означает, что кластеры больше не работают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...