R: каретка не использует главный узел PSOCKcluster при использовании параллельного бэкенда.

Я пытаюсь заставить caret обучать модели xgboost по сетке гиперпараметров с использованием параллельного бэкэнда.

Вот код, который использует данные Give Me Some Credit. чтобы продемонстрировать настройку параллельного бэкэнда для поиска по сетке гиперпараметров caret.

library(plyr)
library(dplyr)
library(pROC)
library(caret)
library(xgboost)
library(readr)
library(parallel)
library(doParallel)

if(exists("xgboost_cluster")) stopCluster(xgboost_cluster)
hosts = paste0("192.168.18.", 52:53)
xgboost_cluster = makePSOCKcluster(hosts, master="192.168.18.51")

# load the packages across the cluster
clusterEvalQ(xgboost_cluster, {
  deps = c("plyr", "Rcpp", "dplyr", "caret", "xgboost", "pROC", "foreach", "doParallel")
  for(d in deps) library(d, character.only = TRUE)
  rm(d, deps)
})

registerDoParallel(xgboost_cluster)  
# load in the training data
df_train = read_csv("04-GiveMeSomeCredit/Data/cs-training.csv") %>%
  na.omit() %>%                                                                # listwise deletion 
  select(-`[EMPTY]`) %>%
  mutate(SeriousDlqin2yrs = factor(SeriousDlqin2yrs,                           # factor variable for classification
                                   labels = c("Failure", "Success")))
# set up the cross-validated hyper-parameter search
xgb_grid_1 = expand.grid(
  nrounds = 1000,
  eta = c(0.01, 0.001, 0.0001),
  max_depth = c(2, 4, 6, 8, 10),
  gamma = 1
)

# pack the training control parameters
xgb_trcontrol_1 = trainControl(
  method = "cv",
  number = 5,
  verboseIter = TRUE,
  returnData = FALSE,
  returnResamp = "all",                                                        # save losses across all models
  classProbs = TRUE,                                                           # set to TRUE for AUC to be computed
  summaryFunction = twoClassSummary,
  allowParallel = TRUE
)

# train the model for each parameter combination in the grid, 
#   using CV to evaluate
xgb_train_1 = train(
  x = as.matrix(df_train %>%
                  select(-SeriousDlqin2yrs)),
  y = as.factor(df_train$SeriousDlqin2yrs),
  trControl = xgb_trcontrol_1,
  tuneGrid = xgb_grid_1,
  method = "xgbTree"
)

Я проверил, что все ядра на узле hosts используются для обучения, но на узле master никакие процессы не используются. Это ожидаемое поведение? Есть ли способ изменить это поведение и использовать ядра на главном узле для обработки?


person tchakravarty    schedule 15.11.2015    source источник


Ответы (1)


Чтобы использовать главный узел для обработки, вам просто нужно добавить 'localhost' к hosts, например:

hosts = c("localhost", paste0("192.168.18.", 52:53))

Это добавит одно ядро ​​​​на вашем главном узле в кластер, которое затем будет использоваться для обработки. Если вы хотите добавить несколько ядер, просто передайте больше экземпляров 'localhost'.

hosts = c(rep('localhost', detectCores()), paste0("192.168.18.", 52:53))
person mcanearm    schedule 16.11.2015
comment
Ценой отвратительного звучания, думаю, я уже знал об этом, но пытался добавить 192.168.18.51 в список хостов, и это не сработало, потому что сам мастер не был добавлен в список доверенных хостов! Указание localhost - правильный способ сделать это, большое спасибо. :-) - person tchakravarty; 16.11.2015