我试图在调谐的超参数级别并行化一个我正在mlr
中调整的xgboost
模型,并试图与parallelMap
并行化。我有在Windows机器(只有8个内核(上成功使用的代码,并希望使用Linux服务器(带有72个内核(。我无法成功地获得任何计算优势转移到服务器,我认为这是我对ParallelMap参数的理解的结果。
我不理解并行模式中的多核与本地与插座的差异。根据我的阅读,我认为Multicore适合我的情况,但我不确定。我在Windows机器上成功使用了套接字,并且在Linux服务器上尝试了套接字和多功能,结果不成功。
parallelStart(mode="socket", cpu=8, level="mlr.tuneParams")
但我的理解是,插座可能是不必要的,或者可能会使许多不需要彼此通信的内核并行,就像平行的超参数调谐一样。
为了详细说明我在Linux服务器上的不成功结果:我没有遇到错误,但是串行24小时的序列需要24个小时的时间才能并行2周。查看过程,我可以看到我确实在使用几个内核。
每个单独的呼叫XGBoost在几分钟内运行,我并没有试图加快速度。我只是想在几个内核上调整超级固定器。
我担心我在Linux服务器上的结果也许是由于XGBoost在模型构建中使用可用的内核的尝试,因此我通过MLR将nthread = 1
喂入XGBoost,以确保不会发生这种情况。尽管如此,我的代码在较大的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(个线程/过程(如果我的术语不正确,则表示歉意(。
非常感谢您的进一步输入。
这个问题更多是关于猜测设置中的问题,而不是实际提供"真实"答案。也许您也可以更改标题,因为您没有获得"意外结果"。
一些要点:
-
nthread = 1
已经是mlr
中xgboost
的默认值 -
multicore
是Unix Systems上的首选模式 - 如果您的本地计算机比服务器快,那么您的计算都非常快地完成,并且两者之间的CPU FREQ显然有所不同,或者您应该考虑与
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
由Reprex软件包(v0.3.0(在2019-06-14创建