В настоящее время пытается воспроизвести алгоритм исключения рекурсивных функций 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, даже на тех, которые выполнялись раньше.Это означает, что кластеры больше не работают.