2017-03-24 7 views
1

のみ6コアを取ることを確認して、それがすべての8つのコア(6労働者のそれぞれが130%の使用率を取っている)かかりする方法MLRは、私は8コアのLinux上で次のコードを使用してい

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) 

どのようにmlrが6コアのみを使用するようにしてください

+0

あなたは並列化したいmlrの機能と使用している学習者を投稿できますか? –

+0

どの学習者ですか? –

+0

@Shivあなたが使用しているコードを含む小さな再現可能な例を作ることができますか? Larsが指摘するように、mlrはあなたがそれを与えるのと同じくらい多くのコアを使います。これは学習者が複数のコアにアクセスして学習者のパラメータで変更できることが原因と考えられます –

答えて

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

この行はすぐに実行され、常に8コアマシンで6を返します。この行は、xgboostモデルとチューニングの両方で使用します。 6つのチューニングスレッドはそれぞれ、6つのスレッドを必要とするxgboostモデルを作成しようとします。したがって、8コアマシンに36スレッドを作成しています。

私はmlr(または何か)が「未使用」コアの数を尊重する方法を知らないです。あなたが6コアのマシンを持っていることを知っているなら、私は手動でこれを壊すことをお勧めします。たとえば、tuneParams 2スレッドを与え、各xgboostモデルに2スレッドを与えます。 tuneparamsプロセスはアイドル状態になり、xgboostモデルから戻ってくるのを待っているので、おそらくxgboostモデルに3つのスレッドを与えることができます。

1

mlrは、学習者が内部的に何を行うかを制御しません。並列化されていると、コアが増えます。安全な側にするには、それだけを与えます。 4つのコア。

関連する問題