R: Как использовать ParallelMap (с mlr, xgboost) на сервере Linux?Неожиданная производительность по сравнению с Windows - PullRequest
1 голос
/ 04 мая 2019

Я пытаюсь распараллелить на уровне гиперпараметра настройки модель xgboost, которую я настраиваю в mlr и пытаюсь распараллелить с parallelMap. У меня есть код, который успешно работает на моей машине с Windows (только с 8 ядрами) и хотел бы использовать сервер Linux (с 72 ядрами). Мне не удалось успешно получить какое-либо вычислительное преимущество при переходе на сервер, и я думаю, что это является результатом дыр в моем понимании параметров parallelMap.

Я не понимаю различий между многоядерными процессами и локальными и сокетными, как "режимы" в параллельной карте Основываясь на моем чтении, я думаю, что многоядерный будет работать для моей ситуации, но я не уверен. Я успешно использовал сокет на своей машине с Windows и попробовал как сокет, так и многоядерный на своем сервере Linux, но результаты оказались неудачными.

parallelStart(mode="socket", cpu=8, level="mlr.tuneParams")

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

Чтобы уточнить мои неудачные результаты на моем сервере Linux: я не получаю ошибок, но для вещей, которые занимают <24 часа в серийном режиме, параллельно> 2 недели. Глядя на процессы, я вижу, что я действительно использую несколько ядер.

Каждый отдельный вызов xgboost выполняется в течение нескольких минут, и я не пытаюсь ускорить это. Я только пытаюсь настроить гиперпараметры на несколько ядер.

Я был обеспокоен тем, что, возможно, мои очень медленные результаты на моем linux-сервере были связаны с попытками xgboost использовать доступные ядра при построении модели, поэтому я передал nthread = 1 xgboost через mlr, чтобы этого не произошло. Тем не менее, мой код, кажется, работает намного медленнее на моем большем сервере Linux, чем на моем меньшем компьютере с Windows - есть какие-нибудь мысли о том, что может происходить?

Большое спасибо.

xgb_learner_tune <- makeLearner(
  "classif.xgboost",
  predict.type = "response",
  par.vals = list(
    objective = "binary:logistic",
    eval_metric = "map",
    nthread=1))

library(parallelMap)
parallelStart(mode="multicore", cpu=8, level="mlr.tuneParams")

tuned_params_trim <- tuneParams(
  learner = xgb_learner_tune,
  task = trainTask,
  resampling = resample_desc,
  par.set = xgb_params,
  control = control,
  measures = list(ppv, tpr, tnr, mmce)
)
parallelStop()

Редактировать

Я все еще удивлен отсутствием улучшения производительности, пытаясь распараллелить на уровне настройки. Мои ожидания несправедливы? При использовании parallelMap производительность существенно ниже, чем при последовательной настройке для следующего процесса:

numeric_ps = makeParamSet(
  makeNumericParam("C", lower = 0.5, upper = 2.0),
  makeNumericParam("sigma", lower = 0.5, upper = 2.0)
)
ctrl = makeTuneControlRandom(maxit=1024L)
rdesc = makeResampleDesc("CV", iters = 3L)

#In serial
start.time.serial <- Sys.time()
res.serial = tuneParams("classif.ksvm", task = iris.task, resampling = rdesc,
                 par.set = numeric_ps, control = ctrl)
stop.time.serial <- Sys.time()
stop.time.serial - start.time.serial

#In parallel with 2 CPUs
start.time.parallel.2 <- Sys.time()
parallelStart(mode="multicore", cpu=2, level="mlr.tuneParams")
res.parallel.2 = tuneParams("classif.ksvm", task = iris.task, resampling = rdesc,
                 par.set = numeric_ps, control = ctrl)
parallelStop()
stop.time.parallel.2 <- Sys.time()
stop.time.parallel.2 - start.time.parallel.2

#In parallel with 16 CPUs
start.time.parallel.16 <- Sys.time()
parallelStart(mode="multicore", cpu=16, level="mlr.tuneParams")
res.parallel.16 = tuneParams("classif.ksvm", task = iris.task, resampling = rdesc,
                          par.set = numeric_ps, control = ctrl)
parallelStop()
stop.time.parallel.16 <- Sys.time()
stop.time.parallel.16 - start.time.parallel.16 

Мой вывод на консоль (детали настройки опущены):

> stop.time.serial - start.time.serial
Time difference of 33.0646 secs

> stop.time.parallel - start.time.parallel
Time difference of 2.49616 mins

> stop.time.parallel.16 - start.time.parallel.16
Time difference of 2.533662 mins

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

Глядя на терминал, я, похоже, использую 2 (и 16) потока / процесса (извиняюсь, если моя терминология неверна).

Огромное спасибо за дальнейшие комментарии.

1 Ответ

0 голосов
/ 05 мая 2019

Этот вопрос больше связан с угадыванием того, что не так в вашей настройке, чем с реальным ответом.Может быть, вы также можете изменить название, так как вы не получили «неожиданные результаты».

Некоторые пункты:

  • nthread = 1 уже является значением по умолчанию для xgboost в mlr
  • multicore является предпочтительным режимом в системах UNIX
  • Если ваш локальный компьютер работает быстрее вашего сервера, то ваши расчеты завершаются очень быстро и частота ЦП между ними существенно отличается, или вам следует подумать о распараллеливании уровня, отличного от mlr.tuneParams (см. здесь для получения дополнительной информации)

Редактировать

На моей машине все отлично.Выглядит как локальная проблема на вашей стороне.

library(mlr)
#> Loading required package: ParamHelpers
#> Registered S3 methods overwritten by 'ggplot2':
#>   method         from 
#>   [.quosures     rlang
#>   c.quosures     rlang
#>   print.quosures rlang
library(parallelMap)

numeric_ps = makeParamSet(
  makeNumericParam("C", lower = 0.5, upper = 2.0),
  makeNumericParam("sigma", lower = 0.5, upper = 2.0)
)
ctrl = makeTuneControlRandom(maxit=1024L)
rdesc = makeResampleDesc("CV", iters = 3L)

#In serial
start.time.serial <- Sys.time()
res.serial = tuneParams("classif.ksvm", task = iris.task, resampling = rdesc,
  par.set = numeric_ps, control = ctrl)
#> [Tune] Started tuning learner classif.ksvm for parameter set:
#>          Type len Def   Constr Req Tunable Trafo
#> C     numeric   -   - 0.5 to 2   -    TRUE     -
#> sigma numeric   -   - 0.5 to 2   -    TRUE     -
#> With control class: TuneControlRandom
#> Imputation value: 1
stop.time.serial <- Sys.time()
stop.time.serial - start.time.serial
#> Time difference of 31.28781 secs


#In parallel with 2 CPUs
start.time.parallel.2 <- Sys.time()
parallelStart(mode="multicore", cpu=2, level="mlr.tuneParams")
#> Starting parallelization in mode=multicore with cpus=2.
res.parallel.2 = tuneParams("classif.ksvm", task = iris.task, resampling = rdesc,
  par.set = numeric_ps, control = ctrl)
#> [Tune] Started tuning learner classif.ksvm for parameter set:
#>          Type len Def   Constr Req Tunable Trafo
#> C     numeric   -   - 0.5 to 2   -    TRUE     -
#> sigma numeric   -   - 0.5 to 2   -    TRUE     -
#> With control class: TuneControlRandom
#> Imputation value: 1
#> Mapping in parallel: mode = multicore; level = mlr.tuneParams; cpus = 2; elements = 1024.
#> [Tune] Result: C=1.12; sigma=0.647 : mmce.test.mean=0.0466667
parallelStop()
#> Stopped parallelization. All cleaned up.
stop.time.parallel.2 <- Sys.time()
stop.time.parallel.2 - start.time.parallel.2
#> Time difference of 16.13145 secs


#In parallel with 4 CPUs
start.time.parallel.16 <- Sys.time()
parallelStart(mode="multicore", cpu=4, level="mlr.tuneParams")
#> Starting parallelization in mode=multicore with cpus=4.
res.parallel.16 = tuneParams("classif.ksvm", task = iris.task, resampling = rdesc,
  par.set = numeric_ps, control = ctrl)
#> [Tune] Started tuning learner classif.ksvm for parameter set:
#>          Type len Def   Constr Req Tunable Trafo
#> C     numeric   -   - 0.5 to 2   -    TRUE     -
#> sigma numeric   -   - 0.5 to 2   -    TRUE     -
#> With control class: TuneControlRandom
#> Imputation value: 1
#> Mapping in parallel: mode = multicore; level = mlr.tuneParams; cpus = 4; elements = 1024.
#> [Tune] Result: C=0.564; sigma=0.5 : mmce.test.mean=0.0333333
parallelStop()
#> Stopped parallelization. All cleaned up.
stop.time.parallel.16 <- Sys.time()
stop.time.parallel.16 - start.time.parallel.16 
#> Time difference of 10.14408 secs

Создано в 2019-06-14 пакетом Представить (v0.3.0)

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