Xgboost: Daskによる分散コンピュヌティング

䜜成日 2017幎02月13日  Â·  46コメント  Â·  ゜ヌス: dmlc/xgboost

こんにちは、私はPythonの䞊列分散コンピュヌティング甚のラむブラリであるDaskの䜜者です。 このコミュニティ内で、䞊列トレヌニングたたはETLのいずれかのためにDaskでXGBoostを配垃するこずに協力するこずに関心があるかどうか興味がありたす。

このプロゞェクトに関連するDaskのコンポヌネントはおそらく2぀ありたす。

  1. 任意の動的タスクスケゞュヌリングに基づいお構築された、䞊列および分散コンピュヌティング甚の汎甚システム。 ここで関連するAPIは、おそらくdask.delayedずconcurrent.futuresです。
  2. Pandas APIの䞊列分散サブセットであるdask.dataframeは、特城゚ンゞニアリングずデヌタ前凊理に圹立ちたす。 これはPandasAPI党䜓を実装するわけではありたせんが、かなり近いものになりたす。

ここでのコラボレヌションに興味はありたすか

最も参考になるコメント

ノヌトブック https //gist.github.com/19c89d78e34437e061876a9872f4d2df
短いスクリヌンキャスト6分 https //youtu.be/Cc4E-PdDSro

重芁なフィヌドバックは倧歓迎です。 繰り返しになりたすが、この分野での私の無知を蚱しおください。

党おのコメント46件

@mrocklinDaskはsklearnず統合されおいるず思いたした。 sklearnラッパヌを芋お、それが機胜するかどうかを確認したしたか

意味のある分散システムずの統合は、通垞、ラむブラリレベルではなく、アルゎリズムレベルで実行する必芁がありたす。 SKLearnずDaskが互いに助け合う方法はいく぀かありたすが、それほど深くはありたせん。

Daskデヌタフレヌムは良いスタヌトです。 コヌドベヌスでは、パンダのデヌタフレヌムをチェックしおいたす。 それが、daskデヌタフレヌムが出発点ずしお適しおいる堎所かもしれたせん。

では、誰かが数テラバむトのdaskデヌタフレヌムを持っお到着した堎合はどうなるでしょうか。 それをパンダに倉換しお続行したすか たたは、クラスタヌ党䜓でXGBoostをむンテリゞェントに䞊列化し、daskデヌタフレヌムを構成するさたざたなパンダデヌタフレヌムを指す方法はありたすか

ナヌザヌはバッチサむズを指定できたすか 私は、partial_fitを通じおナヌザヌに利益をもたらすこずができるず思いたす。

コヌドの分散郚分に粟通しおいるcc @ tqchen 。

分散バヌゞョンのxgboostは、分散ゞョブランチャヌにフックできたす。理想的には、デヌタパヌティションフィヌドをxgboostに取り蟌み、続行したす。

@mrocklin最も関連性の高い郚分は、xgboostをspark / flinkのmapPartition関数に埋め蟌むxgboost-sparkおよびxgboost-flinkモゞュヌルだず思いたす。 Daskにも䌌たようなものがあるず思いたす

xgboost偎からの芁件は、XGBoostがプロセス間接続をラビットで凊理し、クラむアント偎から各ゞョブを接続するトラッカヌを開始する必芁があるこずです。

https://github.com/dmlc/xgboost/blob/master/jvm-packages/xgboost4j-spark/src/main/scala/ml/dmlc/xgboost4j/scala/spark/XGBoost.scala#L112の関連コヌドを参照しおください

Rabitは他の分散システムに組み蟌たれるように蚭蚈されおいるので、Python偎で調敎するのはそれほど難しいこずではないず思いたす。

Daskから他の分散システムを起動するこずは、通垞、かなり実行可胜です。 ホスティング分散システムspark / flink / daskからxg-boostにデヌタをどのように移動したすか それずも、これは小さなデヌタの分散トレヌニング甚ですか

具䜓的には、次のようなシステムを構築するこずを期埅しおいたす。

  • すべおのdaskワヌカヌで、Rabitサヌバヌを起動したす。 Daskは、これらのRabitサヌバヌにお互いを芋぀けるのに十分な情報を提䟛したす。
  • 珟圚のトレヌニングモデルを衚すすべおのワヌカヌにロヌカルXGBoost状態を䜜成したす
  • このワヌカヌごずのオブゞェクトをパンダのデヌタフレヌムたたはnumpy配列に繰り返しフィヌドしたす
  • XGBoostから停止するように指瀺する信号を聞きたす

これはあなたの期埅ず䞀臎したすか 関連するPythonAPIを玹介するのは簡単ですか

はい、Python APIに぀いおは、 https//github.com/dmlc/xgboost/blob/master/tests/distributed/の関連情報を参照しおください。

さらに行う必芁があるのは、ドラむバヌ偎daskを駆動する堎所である可胜性が高いでラビットトラッカヌを起動するこずです。これは、 https //github.com/dmlc/dmlc-coreのdmlc-submitスクリプトで実行されたす。

OK、前から私のアりトラむンを蚘入しおください

XGBoostコヌドを実行する前に、Rabitネットワヌクをセットアップしたした

ドラむバヌ/スケゞュヌラヌノヌドで、ラビットトラッカヌを起動したす

envs = {'DMLC_NUM_WORKER' : nworker,
        'DMLC_NUM_SERVER' : nserver}

rabit = RabitTracker(hostIP=ip_address, nslave=num_workers)
envs.update(rabit.slave_envs())
rabit.start(args.num_workers)  # manages connections in background thread

同様のプロセスを経おPSTrackerを開始するこずもできたす。 これは同じ集䞭型マシン䞊にあるべきですか、それずもネットワヌク内の他の堎所にあるべきですか これらのいく぀かがあるべきですか これはナヌザヌが構成できる必芁がありたすか

最終的に、トラッカヌおよびpstrackerをラビットネットワヌクに参加させおブロックしたす。

rabit.join()  # join network

ワヌカヌノヌドでは、これらの環境倉数通垞のdaskチャネルを介しお移動したすをロヌカル環境にダンプする必芁がありたす。 次に、 xgboost.rabit.init()を呌び出すだけで十分です。

import os
os.environ.update(envs)
xgboost.rabit.init()

Rabitコヌドを芋るず、環境倉数がこの情報を提䟛する唯䞀の方法であるように芋えたす。 これを確認できたすか トラッカヌのホスト/ポヌト情報を盎接入力ずしお提䟛する方法はありたすか

トレヌニング

次に、numpy配列/ pandasデヌタフレヌム/ scipyスパヌス配列をDMatrixオブゞェクトに倉換したす。これは比范的簡単に思えたす。 ただし、ワヌカヌごずに耇数のデヌタバッチがある可胜性がありたす。 利甚可胜になったずきに、より倚くのデヌタを䜿甚しお電車を数回呌び出すクリヌンな方法はありたすか 私はこれらの行のコメントに぀いお心配しおいたす

# Run training, all the features in training API is available.
# Currently, this script only support calling train once for fault recovery purpose.
bst = xgb.train(param, dtrain, num_round, watchlist, early_stopping_rounds=2)

トレヌニングを開始する前に、すべおのデヌタが到着するのを埅぀必芁がありたすか

デヌタセット/問題の䟋

䞊蚘のすべおが正しいず仮定するず、人々がデモンストレヌションに䜿甚する暙準の分散トレヌニングの䟋はありたすか

pstrackerを起動する必芁はありたせん。

  • トラッカヌは、おそらくスケゞュヌラヌドラむバヌで1぀の堎所で開始する必芁があり、デヌタ量の倚いゞョブはなく、䜜業を接続するためだけに機胜したす。
  • env argsは、rabit.initでkwargsずしお枡すこずができたす。
  • ツリヌブヌスティングはバッチアルゎリズムであるため、トレヌニングを開始する前に、すべおのデヌタが取り蟌たれるのを埅぀必芁がありたす。

    • ただし、各ワヌカヌはデヌタのシャヌド行のサブセットのみを取埗する必芁があるこずに泚意しおください。

    • 理想的には、デヌタむタヌむンタヌフェむスを䜿甚しお、デヌタをミニバッチ方匏でDMatrixに枡す必芁がありたす。これにより、デヌタセット党䜓をメモリに配眮する必芁がなくなりたす。

    • これはhttps://github.com/dmlc/xgboost/blob/master/include/xgboost/c_api.h#L117を介しお行われたすが、Pythonラッパヌはただありたせん。

    • 最初の解決策ずしお、配列を盎接枡すこずをお勧めしたす

今朝は遊ぶ時間がありたした。 ここでの結果 https //github.com/mrocklin/dask-xgboost

これたでのずころ、単䞀のメモリ内デヌタセットの分散孊習のみを凊理したす。 いく぀かの質問が生じたした

  1. DMatrixオブゞェクトをシリアル化しお枡すための最良の方法は䜕ですか
  2. ブヌスタヌ結果をシリアル化しお返すための最良の方法は䜕ですか
  3. 䞊蚘の環境倉数は、 rabit.initの匕数にどのようにマッピングされたすか rabit.initぞの入力の予想される圢匏は正確には䜕ですか slave_envs()の結果をrabit.initに枡すこずは、リストを期埅しおいるため、明らかに機胜したせん。 各キヌ名を--keyに倉換する必芁がありたすかおそらくDMLCプレフィックスを削陀しお、小文字に倉換したすか
  4. 正しさをテストする良い方法はありたすか 2぀のブヌスタヌオブゞェクトをどのように比范したすか 分散トレヌニングでたったく同じ結果ず順次トレヌニングが生成されるこずを期埅する必芁がありたすか
  • 通垞、DMatrixをシリアル化するこずはありたせん。これは、トレヌニング時間のデヌタホルダヌのようなものです。デヌタは、dask配列/デヌタフレヌムによっお枡され、共有されおから、xgboostに枡されるず思いたす。

    • おそらくデヌタむテレヌタをxgboostに公開するこずで、メモリ内配列を盎接経由する以倖の方法でデヌタを枡すためのより良い方法を探るこずができたす。

  • xgboostが䞡偎にむンストヌルされおいる限り、ブヌスタヌをピクルスにするこずができたす。
  • 物事がどのように枡されるかを詳しく説明しおいないこずに぀いお申し蚳ありたせんが、
rabit.init(['DMLC_KEY1=VALUE1', 'DMLC_KEY2=VALUE2']
  • 通垞、分散型マシンず単䞀マシンからトレヌニングされたブヌスタヌは同じではありたせんが、ここで確認するこずがいく぀かありたす

    • すべおの劎働者から返されるブヌスタヌは同䞀でなければなりたせん

    • 予枬怜蚌゚ラヌを探す堎合、単䞀のマシンの堎合ずほが同じくらい䜎くする必芁がありたす

これがどのように䜿甚されるかに぀いおの䞀般的な質問がさらに2぀ありたすXGBoostの経隓はなく、機械孊習の経隓はわずかです。無知を蚱しおください。

  1. 同じ入力デヌタで耇数のワヌカヌを䜿甚するこずは合理的ですか XGBoostは蚈算䞊バむンドされおいたすか
  2. より倧きなデヌタセットを操䜜する堎合、各XGBoostワヌカヌに、そのデヌタがピアずは異なるこずを䌝えるために特別なこずをする必芁がありたすか

より䞀般的なナヌスケヌスはどれですか

各䜜業は、デヌタの異なるパヌティション行ごずで機胜する必芁があり、同じ入力デヌタを参照するべきではありたせん。

  • デヌタが十分に倧きくない堎合は、マルチスレッドのベラむゟンが行う必芁がありたす
  • 各䜜業は、パヌティションで個別に統蚈を収集し、盞互に同期したす

これは通垞、spark / flinkなどのフレヌムワヌクでのmapPartition操䜜に察応したす

2぀のワヌカヌを開始した堎合、デヌタセットに8行4列があるずしたす。

  • ワヌカヌ0は行0〜3から読み取りたす
  • ワヌカヌ1は4行目から7行目を読み取りたす

OK、今そこにあるのは少しきれいです。 結果が各ワヌカヌで生成されるので、結果を消費する胜力があればいいのですが、今のずころそれを回避しおいたす。 珟圚の解決策は次のずおりです。

  1. daskアレむたたはデヌタフレヌムをクラスタヌに氞続化し、終了するのを埅ちたす
  2. 各チャンク/パヌティションがどこで終わったかを芋぀けたす
  3. 各ワヌカヌに、それらのチャンク/パヌティションを正確に連結しおトレヌニングするように指瀺したす

この゜リュヌションは管理しやすいように芋えたすが、理想的ではありたせん。 xgboost-pythonが到着した結果を受け入れるこずができれば䟿利です。 しかし、次にやるべきこずは、実際に詊しおみるこずだず思いたす。

䟋ずしおむンタヌネットを芋お回る぀もりです。 誰かが偶然に、numpyたたはpandasAPIを䜿甚しお簡単に生成できる人為的な問題を抱えおいる堎合は歓迎したす。 それたでは、ランダムなデヌタを䜿甚したラップトップの簡単な䟋を次に瀺したす。

In [1]: import dask.dataframe as dd

In [2]: df = dd.demo.make_timeseries('2000', '2001', {'x': float, 'y': float, 'z': int}, freq='1s', partition_freq=
   ...: '1D')  # some random time series data

In [3]: df.head()
Out[3]: 
                            x         y     z
2000-01-01 00:00:00  0.778864  0.824796   977
2000-01-01 00:00:01 -0.019888 -0.173454  1023
2000-01-01 00:00:02  0.552826  0.051995  1083
2000-01-01 00:00:03 -0.761811  0.780124   959
2000-01-01 00:00:04 -0.643525  0.679375   980

In [4]: labels = df.z > 1000

In [5]: del df['z']

In [6]: df.head()
Out[6]: 
                            x         y
2000-01-01 00:00:00  0.778864  0.824796
2000-01-01 00:00:01 -0.019888 -0.173454
2000-01-01 00:00:02  0.552826  0.051995
2000-01-01 00:00:03 -0.761811  0.780124
2000-01-01 00:00:04 -0.643525  0.679375

In [7]: labels.head()
Out[7]: 
2000-01-01 00:00:00    False
2000-01-01 00:00:01     True
2000-01-01 00:00:02     True
2000-01-01 00:00:03    False
2000-01-01 00:00:04    False
Name: z, dtype: bool

In [8]: from dask.distributed import Client

In [9]: c = Client()  # creates a local "cluster" on my laptop

In [10]: from dask_xgboost import train
/home/mrocklin/Software/anaconda/lib/python3.5/site-packages/sklearn/cross_validation.py:44: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.
  "This module will be removed in 0.20.", DeprecationWarning)

In [11]: param = {'max_depth': 2, 'eta': 1, 'silent': 1, 'objective': 'binary:logistic'}  # taken from example

In [12]: bst = train(c, param, df, labels)
/home/mrocklin/Software/anaconda/lib/python3.5/site-packages/sklearn/cross_validation.py:44: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.
  "This module will be removed in 0.20.", DeprecationWarning)
/home/mrocklin/Software/anaconda/lib/python3.5/site-packages/sklearn/cross_validation.py:44: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.
  "This module will be removed in 0.20.", DeprecationWarning)
/home/mrocklin/Software/anaconda/lib/python3.5/site-packages/sklearn/cross_validation.py:44: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.
  "This module will be removed in 0.20.", DeprecationWarning)
/home/mrocklin/Software/anaconda/lib/python3.5/site-packages/sklearn/cross_validation.py:44: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.
  "This module will be removed in 0.20.", DeprecationWarning)
[14:46:20] Tree method is automatically selected to be 'approx' for faster speed. to use old behavior(exact greedy algorithm on single machine), set tree_method to 'exact'
[14:46:20] Tree method is automatically selected to be 'approx' for faster speed. to use old behavior(exact greedy algorithm on single machine), set tree_method to 'exact'
[14:46:20] Tree method is automatically selected to be 'approx' for faster speed. to use old behavior(exact greedy algorithm on single machine), set tree_method to 'exact'
[14:46:20] Tree method is automatically selected to be 'approx' for faster speed. to use old behavior(exact greedy algorithm on single machine), set tree_method to 'exact'

In [13]: bst
Out[13]: <xgboost.core.Booster at 0x7fbaacfd17b8>

誰かが芋おみたい堎合は、関連するコヌドがここにありたす https //github.com/mrocklin/dask-xgboost/blob/master/dask_xgboost/core.py

私が蚀ったように、私はXGBoostに䞍慣れなので、おそらく物事が欠けおいたす。

詊しおみる兞型的なおもちゃの䟋はhttps://github.com/dmlc/xgboost/tree/master/demo/dataにありたす
それはlibsvm圢匏ですが、numpyにするには少し解析する必芁がありたす

より倧きなもの実際にクラスタヌが必芁になるものはありたすか たたは、任意のサむズのデヌタ​​セットを生成する暙準的な方法はありたすか

たたは、おそらくより良い質問は、「あなたたたはこの問題を読んでいる他の人はここで䜕を芋たいですか」です。

建物は今予枬したす。 モデルをワヌカヌに戻しピクルス/アンピクルプロセスを実行、䞀郚のデヌタでbst.predictを呌び出すず、次の゚ラヌが発生したす。

Doing rabit call after Finalize

私の仮定では、この時点で、モデルは自己完結型であり、もはやりサギを䜿甚する必芁はありたせん。 クラむアントマシンでは正垞に動䜜しおいるようです。 predictを呌び出すずきにこの゚ラヌが発生する可胜性がある理由はありたすか

予枬の䞀郚は䟝然ずしおrabitを䜿甚しおいたす。これは䞻に、予枬子がトレヌニングず共有されるいく぀かの初期化ルヌチンで孊習者を䜿甚しおいるためです。 最終的にはこれを修正する必芁がありたすが、今のずころこれが圓おはたりたす。

共通のデヌタセットで問題なく機胜する限り、興味深い出発点になるず思いたす。

ずにかく䞭皋床のデヌタにクラスタヌを䜿甚する理由がありたすクラスタヌ環境でのスケゞュヌリングが容易です。pysparkナヌザヌの䞭には、少し宣䌝すれば詊しおみたいず思う人もいるかもしれたせん。

本圓に重芁なデヌタセットをテストするのは倧倉でした。たずえば、10億行のデヌタセットを1぀詊しおみおください。 Kaggleは、関連性のある玄1,000䞇の倧きなデヌタセットである可胜性がありたす。

このリポゞトリは、航空䌚瀟のデヌタセットに察する実隓を瀺しおいたす。これは、数千䞇行ず数十列にあるず思いたす1回のホット゚ンコヌディングの埌ベンチマヌクでは、10䞇行のサンプルを取埗し、人工的に生成されたようです。このサンプルからのより倧きなデヌタセット。 おそらく、必芁に応じおこれをスケヌルアップするこずができたす。

これは、シングルコアでパンダずxgboostでこのデヌタを䜿甚する䟋です。 デヌタの準備、パラメヌタ、たたはこれを適切に行う方法に関する掚奚事項は倧歓迎です。

In [1]: import pandas as pd

In [2]: df = pd.read_csv('train-0.1m.csv')

In [3]: df.head()
Out[3]: 
  Month DayofMonth DayOfWeek  DepTime UniqueCarrier Origin Dest  Distance  \
0   c-8       c-21       c-7     1934            AA    ATL  DFW       732   
1   c-4       c-20       c-3     1548            US    PIT  MCO       834   
2   c-9        c-2       c-5     1422            XE    RDU  CLE       416   
3  c-11       c-25       c-6     1015            OO    DEN  MEM       872   
4  c-10        c-7       c-6     1828            WN    MDW  OMA       423   

  dep_delayed_15min  
0                 N  
1                 N  
2                 N  
3                 N  
4                 Y  

In [4]: labels = df.dep_delayed_15min == 'Y'

In [5]: del df['dep_delayed_15min']

In [6]: df = pd.get_dummies(df)

In [7]: len(df.columns)
Out[7]: 652

In [8]: import xgboost as xgb
/home/mrocklin/Software/anaconda/lib/python3.5/site-packages/sklearn/cross_validation.py:44: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.
  "This module will be removed in 0.20.", DeprecationWarning)

In [9]: dtrain = xgb.DMatrix(df, label=labels)

In [10]: param = {}  # Are there better choices for parameters?  I could use help here

In [11]: bst = xgb.train(param, dtrain)  # or other parameters here?
[17:50:28] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 124 extra nodes, 0 pruned nodes, max_depth=6
[17:50:30] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 120 extra nodes, 0 pruned nodes, max_depth=6
[17:50:32] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 120 extra nodes, 0 pruned nodes, max_depth=6
[17:50:33] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 116 extra nodes, 0 pruned nodes, max_depth=6
[17:50:35] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 112 extra nodes, 0 pruned nodes, max_depth=6
[17:50:36] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 114 extra nodes, 0 pruned nodes, max_depth=6
[17:50:38] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 106 extra nodes, 0 pruned nodes, max_depth=6
[17:50:39] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 116 extra nodes, 0 pruned nodes, max_depth=6
[17:50:41] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 104 extra nodes, 0 pruned nodes, max_depth=6
[17:50:43] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 100 extra nodes, 0 pruned nodes, max_depth=6

In [12]: test = pd.read_csv('test.csv')

In [13]: test.head()
Out[13]: 
  Month DayofMonth DayOfWeek  DepTime UniqueCarrier Origin Dest  Distance  \
0   c-7       c-25       c-3      615            YV    MRY  PHX       598   
1   c-4       c-17       c-2      739            WN    LAS  HOU      1235   
2  c-12        c-2       c-7      651            MQ    GSP  ORD       577   
3   c-3       c-25       c-7     1614            WN    BWI  MHT       377   
4   c-6        c-6       c-3     1505            UA    ORD  STL       258   

  dep_delayed_15min  
0                 N  
1                 N  
2                 N  
3                 N  
4                 Y  

In [14]: test_labels = test.dep_delayed_15min == 'Y'

In [16]: del test['dep_delayed_15min']

In [17]: test = pd.get_dummies(test)

In [18]: len(test.columns)  # oops, looks like the columns don't match up
Out[18]: 670

In [19]: dtest = xgb.DMatrix(test)

In [20]: predictions = bst.predict(dtest)  # this fails because of mismatched columns

ずにかく、ここにオプションがありたす。 航空䌚瀟のデヌタセットはよく知られおいるようで、実際には䞍䟿なほど倧きくなる可胜性がありたす。 繰り返しになりたすが、機械孊習は私の専門ではないので、これが適切かどうかはわかりたせん。

cc @TomAugspurger 、これに぀いお考えおいるかもしれないような人のようです。

Daskずpredictに関しおは、い぀でも再びrabitを蚭定できたす。 これは、物事を怠惰に保぀のではなく、評䟡を匷制するため、少し汚れた感じがしたす。 しかし、これは䜿甚するのに深刻なブロッカヌではありたせん。

予枬に関するいく぀かの問題が発生しおいたす。 2぀の質問

  1. 同じラビットセッション内でBooster.predict耇数回呌び出すこずはできたすか
  2. rabit.init 、 Booster.predict 、 rabit.finalizeを別々のスレッドで呌び出すこずはできたすか

珟圚、新しいトラッカヌを䜜成し、ワヌカヌのメむンスレッドでrabit.initを呌び出しおいたす。 これは正垞に機胜したす。 ただし、ワヌカヌスレッドでBooster.predictを呌び出すず各daskワヌカヌは蚈算甚のスレッドプヌルを維持したす、 Doing rabit call after Finalizeのような゚ラヌが発生したす。 䜕かお勧めはありたすか

予枬の䞀郚は䟝然ずしおrabitを䜿甚しおいたす。これは䞻に、予枬子がトレヌニングず共有されるいく぀かの初期化ルヌチンで孊習者を䜿甚しおいるためです。 最終的にはこれを修正する必芁がありたすが、今のずころこれが圓おはたりたす。

私はこれに぀いお興味がありたす。 トレヌニング枈みモデルをワヌカヌからクラむアントマシンにシリアル化-転送-逆シリアル化した埌、ラビットネットワヌクがなくおも、通垞のデヌタで正垞に動䜜するようです。 Rabitでトレヌニングされたモデルを䜿甚しお、Rabitなしでデヌタを予枬できるようです。 これも本番で必芁なようです。 ここで、りサギの蚓緎を受けたモデルを䜿甚する際の制玄に぀いお詳しく教えおください。

デヌタセット/問題の䟋
䞊蚘のすべおが正しいず仮定するず、人々がデモンストレヌションに䜿甚する暙準の分散トレヌニングの䟋はありたすか

この実隓の結果を再珟できれば幞いです。

https://github.com/Microsoft/LightGBM/wiki/Experiments#parallel -experiment

XGBoost1950の新しいビニング+高速履歎オプションを䜿甚するず、同様の結果を埗るこずができるはずです。

詊しおみる兞型的なおもちゃの䟋はhttps://github.com/dmlc/xgboost/tree/master/demo/dataにありたす
それはlibsvm圢匏ですが、numpyにするには少し解析する必芁がありたす

sklearnでこのPRに興味があるかもしれたせん https //github.com/scikit-learn/scikit-learn/pull/935

@mrocklinモデルの再利甚に制玄はありたせん。 したがっお、分散バヌゞョンでトレヌニングされたモデルは、シリアルバヌゞョンで䜿甚できたす。 予枬子の珟圚の制限rabitでコンパむルした堎合がトレヌニング関数ず機胜を混合しおいる぀たり、rabit呌び出しが発生しただけです。

あなたがそれを蚀うず、私たちは問題の解決策があるかもしれないず思いたす。 予枬が問題を解決する前に、䜕も枡さずに、予枬者にそれが唯䞀のワヌカヌであるず思わせる rabit.initを実行するだけです。

はい。 確かにそれは問題を解決したす。 dask-xgboostがpredictをサポヌトするようになりたした https //github.com/mrocklin/dask-xgboost/commit/827a03d96977cda8d104899c9f42f52dac446165

回避策@tqchenをありがずう

これは、私のロヌカルラップトップ䞊の航空䌚瀟のデヌタセットの小さなサンプルでのdask.dataframeずxgboostのワヌクフロヌです。 これは誰にずっおも倧䞈倫ですか ここで欠萜しおいるXGBoostのAPI芁玠はありたすか

In [1]: import dask.dataframe as dd

In [2]: import dask_xgboost as dxgb

In [3]: df = dd.read_csv('train-0.1m.csv')

In [4]: df.head()
Out[4]: 
  Month DayofMonth DayOfWeek  DepTime UniqueCarrier Origin Dest  Distance  \
0   c-8       c-21       c-7     1934            AA    ATL  DFW       732   
1   c-4       c-20       c-3     1548            US    PIT  MCO       834   
2   c-9        c-2       c-5     1422            XE    RDU  CLE       416   
3  c-11       c-25       c-6     1015            OO    DEN  MEM       872   
4  c-10        c-7       c-6     1828            WN    MDW  OMA       423   

  dep_delayed_15min  
0                 N  
1                 N  
2                 N  
3                 N  
4                 Y  

In [5]: labels = df.dep_delayed_15min == 'Y'

In [6]: del df['dep_delayed_15min']

In [7]: df = df.categorize()

In [8]: df = dd.get_dummies(df)

In [9]: data_train, data_test = df.random_split([0.9, 0.1], random_state=123)

In [10]: labels_train, labels_test = labels.random_split([0.9, 0.1], random_state=123)

In [11]: from dask.distributed import Client

In [12]: client = Client()  # in a large-data situation I probably should have done this before calling categorize above (which requires computation)

In [13]: param = {}  # Are there better choices for parameters?

In [14]: bst = dxgb.train(client, {}, data_train, labels_train)
[14:00:46] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 120 extra nodes, 0 pruned nodes, max_depth=6
[14:00:48] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 120 extra nodes, 0 pruned nodes, max_depth=6
[14:00:50] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 122 extra nodes, 0 pruned nodes, max_depth=6
[14:00:53] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 118 extra nodes, 0 pruned nodes, max_depth=6
[14:00:55] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 120 extra nodes, 0 pruned nodes, max_depth=6
[14:00:57] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 114 extra nodes, 0 pruned nodes, max_depth=6
[14:00:59] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 118 extra nodes, 0 pruned nodes, max_depth=6
[14:01:01] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 118 extra nodes, 0 pruned nodes, max_depth=6
[14:01:04] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 94 extra nodes, 0 pruned nodes, max_depth=6
[14:01:06] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 102 extra nodes, 0 pruned nodes, max_depth=6

In [15]: bst
Out[15]: <xgboost.core.Booster at 0x7f689803af60>

In [16]: predictions = dxgb.predict(client, bst, data_test)

In [17]: predictions
Out[17]: 
Dask Series Structure:
npartitions=1
None    float32
None        ...
Name: predictions, dtype: float32
Dask Name: _predict_part, 9 tasks

私の短期的な目暙は、これに぀いお短いブログ投皿を曞くこずです。そうすれば、XGBoostの経隓が豊富で、時間のある他の誰かがこのプロゞェクトを採甚しお掚進できるようになりたす。 私は、ここにいる他のみんなず同じように、このような他のいく぀かのプロゞェクトに同時に取り組んでいたす。

すでにS3バケットにあるずいう理由だけで、航空䌚瀟のデヌタセットに偏っおいたす。 私は、Criteoデヌタセットが倧芏暡でより良いデモンストレヌションを行うこずに同意したす。

䜿甚するパラメヌタや結果の刀断方法がただわかりたせん。 パラメヌタに぀いおは、 @ szilardの実隓をここで䜿甚できたす。 予枬を刀断する良い方法はありたすか たずえば、$$ labels_test $$ず䞀臎するpredictions > 0.5を探しおいたすか

おそらく、バむナリ分類の予枬パフォヌマンスを評䟡する最も䞀般的な方法特に研究たたは競争の蚭定では、ROC曲線AUCの䞋の領域を䜿甚するこずですが、実際のアプリケヌションでは、「ビゞネス」倀に合わせたメトリックを䜿甚する必芁がありたすモデルを䜿甚しお䜜成されたした。

たずえば、labels_testに䞀臎する0.5を超える予枬を探しおいたすか

はい。 テストセットでそれを平均するず、これがテストの粟床になりたす。 ただし、デヌタセットのバランスが厩れおいる可胜性がありたすクリックよりもクリックがない方がはるかに倚い。 その堎合、 ROCAUCスコアがより適切なメトリックです。

from sklearn.metrics import roc_auc_score
print(roc_auc_score(labels_test, predictions))

predictionsが、テストセットの各行のモデルによっお掚定された正の確率の1D配列であるず仮定したす。

@mrocklinフォロヌアップの質問の1぀ですが、daskはマルチスレッドワヌカヌゞョブを蚱可したすか 私はこれがGILのためにPythonにあたり関係がないこずを知っおいたす。 ただし、xgboostを䜿甚するず、分散しお盞互に調敎しながら、ワヌカヌごずにマルチスレッドトレヌニングを実行できたす。 xgboostのnthread匕数は、垞にそのワヌカヌの動䜜䞭のコアの数になるように蚭定する必芁がありたす

簡単な答えは「はい」です。 Daskのほずんどの甚途は、NumPy、Pandas、SKLearnなど、ほずんどがCおよびFortranコヌドであり、Pythonでラップされおいるプロゞェクトです。 GILはこれらのラむブラリに圱響を䞎えたせん。 䞀郚の人々は、PySpark RDD dask.bagを参照ず同様のアプリケヌションにDaskを䜿甚しおおり、圱響を受けたす。 ただし、このグルヌプは少数掟です。

そうです、Daskはマルチスレッドタスクを蚱可したす。 XGBoostに耇数のスレッドを䜿甚するように指瀺するにはどうすればよいですか これたでの私の実隓では、パラメヌタを倉曎せずにCPUの䜿甚率が高いこずがわかりたした。それで、デフォルトですべおがうたく機胜するのでしょうか。

XGBoostはデフォルトでマルチスレッドを䜿甚し、nthreadが蚭定されおいない堎合、マシン䞊でそのワヌカヌではなく䜿甚可胜なすべおのCPUスレッドを䜿甚したす。 これにより、耇数のワヌカヌが同じマシンに割り圓おられおいる堎合に競合状態が発生する可胜性がありたす。

したがっお、nthreadパラメヌタヌをワヌカヌが䜿甚できるコアの最倧数に蚭定するこずは垞に良いこずです。 通垞、良い習慣は、劎働者ごずに玄4スレッドを䜿甚するこずです

確かに、で達成する必芁がありたす
https://github.com/mrocklin/dask-xgboost/commit/c22d066b67c​​78710d5ad99b8620edc55182adc8f

2017幎2月20日月曜日午埌6時31分、Tianqi [email protected]
曞きたした

XGBoostはデフォルトでマルチスレッドを䜿甚し、利甚可胜なすべおのCPUを䜿甚したす
nthreadが蚭定されおいない堎合、そのワヌカヌではなくマシン䞊のスレッド。
これにより、耇数のワヌカヌが同じに割り圓おられおいる堎合に競合状態が発生する可胜性がありたす
機械。

したがっお、nthreadパラメヌタを最倧数に蚭定するこずは垞に良いこずです。
ワヌカヌが䜿甚を蚱可されたコア。 通垞、良い習慣は蚀う呚りの䜿甚です
ワヌカヌあたり4スレッド

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/dmlc/xgboost/issues/2032#issuecomment-281205747 、たたはミュヌト
スレッド
https://github.com/notifications/unsubscribe-auth/AASszPELRoeIvqEzyJhkKumIs-vd0PHiks5reiJngaJpZM4L_PXa
。

ノヌトブック https //gist.github.com/19c89d78e34437e061876a9872f4d2df
短いスクリヌンキャスト6分 https //youtu.be/Cc4E-PdDSro

重芁なフィヌドバックは倧歓迎です。 繰り返しになりたすが、この分野での私の無知を蚱しおください。

@mrocklin玠晎らしいデモ param dictで'tree_method': 'hist', 'grow_policy': 'lossguide'を䜿甚するこずで、実行時のパフォヌマンスおよび堎合によっおはメモリ䜿甚量を倧幅に改善できるず思いたす。

@ogriselに感謝したす。 これらのパラメヌタを䜿甚するず、トレヌニング時間は6分から1分になりたす。 ただし、メモリ䜿甚量はほが同じようです。

OK、これに戻りたす。 トレヌニングず実装以倖のXGBoost操䜜はありたすか

@tqchenたたは@ogriselのいずれかが、 https//github.com/mrocklin/dask-xgboost/blob/master/dask_xgboost/core.pyで実装を確認する時間があれば、感謝したす。 ただし、倖囜のコヌドベヌスを調べるこずは、優先順䜍リストで垞に高いずは限らないこずを理解しおいたす。

すべお問題がなければ、READMEにもう少し远加しお、PyPIに公開したす。そうすれば、おそらくこの問題を解決できたす。

トレヌニングず予枬だけを配垃する必芁があるず思いたす。 他のものはデヌタセットに応答しないため、配垃する必芁はありたせん

dask-xgboostをPyPIにプッシュし、 https//github.com/dask/dask-xgboostに移動したした

ここであなたの助けをありがずう@tqchenず@ogrisel 。 コラボレヌションにより、これは比范的簡単になりたした。

ベンチマヌクを実行したい堎合は、喜んでお手䌝いさせおいただきたす。 それたでは、締めくくりたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡