2017-03-24 4 views
1

ich folgenden Code auf 8-Core Linux verwenden und es nimmt alle 8 CoresWie stellen Sie sicher, dass mlr nimmt nur 6 Kern

library(mlr); library(parallel); library(parallelMap) 

# Load data 
    iris_num <- iris; iris_num$Species <- as.numeric(iris_num$Species) 

#create tasks 
    traintask <- makeRegrTask(data = iris_num, target = 'Species') 

#create learner 
    lrn = makeLearner('regr.xgboost'); nthread <- min(6, detectCores()); 
    lrn$par.vals = list(print.every.n = 500, objective = "reg:linear", eval_metric="rmse", nthread = nthread) 

#set parameter space 

    params <- makeParamSet(
     makeIntegerParam("max_depth",lower = 5L,upper = 20L), # 6 
     makeNumericParam("min_child_weight",lower = 1L,upper = 20L), # 1 
     makeNumericParam("subsample",lower = 0.5,upper = 1), 
     makeNumericParam("colsample_bytree",lower = 0.5,upper = 1), 
     makeIntegerParam("nrounds",lower=3000,upper=5000), 
     makeNumericParam("lambda",lower=0.75,upper=1), 
     makeNumericParam("lambda_bias",lower=0,upper=0.75), 
     makeNumericParam("gamma",lower=0,upper=1), 
     makeNumericParam("eta", lower = 0.01, upper = 0.05) # 0.3 
    ) 

#set resampling strategy 
    rdesc <- makeResampleDesc("CV",iters=9L) 

#search strategy 
    ctrl <- makeTuneControlRandom(maxit = 10L) 

#set parallel backend 
    if(Sys.info()['sysname'] == "Linux") { 
     parallelStartMulticore(cpus = nthread, show.info = T) 
    } else parallelStartSocket(cpus = nthread, show.info = T) 

    tune <- tuneParams(learner = lrn, task = traintask,resampling = rdesc,measures = rmse, par.set = params, control = ctrl, show.info = T) 

Wie (jede der sechs Arbeiter 130% Auslastung nehmen) Stellen Sie sicher, dass mlr nur 6 Kern

+0

Können Sie angeben, welche Funktion von mlr Sie parallelisieren möchten und welche Lerner Sie verwenden? –

+0

Und welcher Lerner? –

+0

@Shiv können Sie ein kleines reproduzierbares Beispiel erstellen, das den von Ihnen verwendeten Code enthält? Wie Lars bemerkt, wird mlr nur so viele Kerne verwenden, wie du es gibst. Dies wird höchstwahrscheinlich dadurch verursacht, dass der Lernende auch auf mehrere Kerne zugreift, die in den Lernerparametern –

Antwort

0
nthread <- min(6, detectCores()) 

Diese Zeile wird sofort ausgeführt und kehrt immer auf einer 8-Kern-Maschine zurück. Sie verwenden diese Zeile sowohl für das xgboost-Modell als auch für das Tuning. Jeder deiner 6 Tuning-Threads versucht, ein xgboost-Modell zu erstellen, das 6 Threads benötigt. Du machst also 36 Threads auf einer 8-Kern-Maschine.

Mir ist nicht bewusst, wie mlr (oder irgendetwas) die Anzahl der "unbenutzten" Kerne respektieren. Wenn Sie wissen, dass Sie eine 6-Kern-Maschine haben, würde ich empfehlen, dies manuell zu brechen. Geben Sie beispielsweise tuneParams 2 Threads ein und geben Sie jedem xgboost-Modell 2 Threads. Da der tuneparams-Prozess untätig ist und darauf wartet, von den xgboost-Modellen zurück zu hören, könnten Sie den xgboost-Modellen wahrscheinlich 3 Threads geben.

1

mlr haben keine Kontrolle über das, was die Lerner intern tun - wenn sie parallelisiert sind, werden Sie am Ende mehr Kerne verwenden. Um auf der sicheren Seite zu sein, gib es nur z.B. 4 Kerne.

Verwandte Themen