Я пытаюсь распараллелить на уровне гиперпараметра настройки модель 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) потока / процесса (извиняюсь, если моя терминология неверна).
Огромное спасибо за дальнейшие комментарии.