2016-09-16 5 views
7

キャレットを使ってxgboostのモデルフィッティングプロセスを並列化したいと思っています。 xgboostのdocumentationで見たことから、nthreadパラメータは、モデルをフィッティングする際に使用するスレッドの数を制御し、並列にツリーを構築します。キャレットのtrain関数は、例えばk倍CVで反復ごとにプロセスを実行するという意味で並列化を実行します。それがそのパラメータを渡すように、コアの数は、(例えば、doMCパッケージとregisterDoMC機能付き)、キャレットの列車の機能を経由してnthread=1を設定登録xgboostとキャレットを使った並列処理

  1. :はい、それはに優れている場合は、この理解は正しいですxgboostに設定し、allowParallel=TRUEtrainControlに設定し、caretが相互検証のための並列化を処理するようにします。または
  2. キャレット並列化(allowParallel=FALSEおよびパラレルバックエンド登録なし)を無効にし、nthreadを物理コアの数に設定すると、並列化は排他的にxgboost内に含まれます。

また、並列化を実行する「良い」方法はありませんか?

編集:私はtuneLength = 10search="random"で、@topepoによって提案されたコードを実行し、(そうでなければ、私はxgboostは、マルチスレッドを使用することを理解して)最後の行にnthread=1を指定します。私が得た結果があります。

xgb_par[3] 
elapsed 
283.691 
just_seq[3] 
elapsed 
276.704 
mc_par[3] 
elapsed 
89.074 
just_seq[3]/mc_par[3] 
elapsed 
3.106451 
just_seq[3]/xgb_par[3] 
elapsed 
0.9753711 
xgb_par[3]/mc_par[3] 
elapsed 
3.184891 

終わりに、それは私のデータのためにと、このテストケースの両方に対して、キャレットが並列化を処理させることは、ランタイムの点では良い選択だったことが判明しました。

+1

、これらのオプションは相互に排他的でなければならない理由はありません。それにもかかわらず、問題は意見に基づいており、私は閉じることに投票しています。あなたは「より良い」を定義していません。しかし、私はあなたが少ない実行時間を意味すると仮定します...あなたはいつもあなたのコードをプロファイルすることができます。私は 'ライブラリ(マイクロベンチマーク)'を提案します。 –

+0

多分、用語の誤解があります。もちろん、クロスバリデーションの最終目標はモデルの検証ですが、「モデルフィッティング」の意味は、各繰り返しでモデルを(k-1)の折り目に合わせなければならないということです。この質問の理由は、構築上、並列化を行う理論的に優れた方法があるかどうかわかりません(リサンプリングループを並列化するよりも、反復ごとにスレッドを多く生成するオーバーヘッドが増えるなど)経験豊富な人がこれに助言することができます。しかし、これは大文字と小文字に依存する可能性があります。 – drgxfs

答えて

6

ベスト戦略がどのようなものかを予測するのは簡単ではありません。私の(偏った)考え方は、あなたが最も長くかかるプロセスを並列化しなければならないということです。オープンスレッド/ワーカーがモデルを何回も呼び出すので、これはリサンプリングループになります。モデルフィッティングを並列化する反対のアプローチは、繰り返し作業を開始して停止させ、理論的に物事を遅らせる。あなたのマイレージは異なる場合があります。

私は、OpenMPがインストールされていませんが、テストするために、次のコードは、(あなたの結果を報告することができれば、それが参考になる)があります。相互検証は、「モデルフィッティング」ではないという事実を回避

library(caret) 
library(plyr) 
library(xgboost) 
library(doMC) 

foo <- function(...) { 
    set.seed(2) 
    mod <- train(Class ~ ., data = dat, 
       method = "xgbTree", tuneLength = 50, 
       ..., trControl = trainControl(search = "random")) 
    invisible(mod) 
} 

set.seed(1) 
dat <- twoClassSim(1000) 

just_seq <- system.time(foo()) 


## I don't have OpenMP installed 
xgb_par <- system.time(foo(nthread = 5)) 

registerDoMC(cores=5) 
mc_par <- system.time(foo()) 

(OpenMPのなし)マイ結果

> just_seq[3] 
elapsed 
326.422 
> xgb_par[3] 
elapsed 
319.862 
> mc_par[3] 
elapsed 
102.329 
> 
> ## Speedups 
> xgb_par[3]/mc_par[3] 
elapsed 
3.12582 
> just_seq[3]/mc_par[3] 
elapsed 
3.189927 
> just_seq[3]/xgb_par[3] 
elapsed 
1.020509