AWS上の分散XGBoost YARN

XGBoostはGradient BoostingとRandom Forestsを組み合わせたアンサンブル学習したライブラリ。
YARNは分散クラスタを色んな種類回せるリソース管理ライブラリ

<hr>
公式ページ
http://xgboost.readthedocs.io/en/latest/tutorials/aws_yarn.html


これは、AWS EC2クラスタ上で分散XGBoostを設定して実行する方法に関するステップバイステップのチュートリアルです。 分散XGBoostは、MPI、SGE、Hadoop YARNなどのさまざまなプラットフォーム上で動作します。 このチュートリアルでは、分散コンピューティングで広く使用されているソリューションであるため、YARNを例として使用します。

#前提条件
AWSサービスにアクセスするには、AWS キーペアを取得する必要があります。キーmykeyとそれに対応するパーミッションファイルを使用していると仮定しますmypem.pem。

また、必要AWSの資格含まれ、ACCESS_KEY_IDとSECRET_ACCESS_KEY。

最後に、データとモデルをホストするS3バケットと、 s3://mybucket/

#Hadoop YARNクラスタの設定
このセクションでは、Hadoop YARNクラスタを最初から起動する方法を示します。既にこのステップがある場合は、このステップをスキップすることができます。我々はクラスターを開始するために糸ec2を使用します。

最初に、以下のコマンドでyarn-ec2スクリプトをクローンすることができます。

```
git clone https://github.com/tqchen/yarn-ec2
```

スクリプトを使用するには、環境変数AWS_ACCESS_KEY_IDを AWS_SECRET_ACCESS_KEY正しく設定する必要があります。これは、次の2行を追加して ~/.bashrc（文字列を正しいものに置き換える）


```
exportAWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE exportAWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
```

今度はEC2からクラスターのマスターマシンを起動できます

```
./yarn-ec2 -k mykey -i mypem.pem launch xgboost
```

マスターマシンが起動するまで数分待ってください。

マスターマシンが起動したら、次のコマンドを使用してマスターマシンのパブリックDNSに問い合わせることができます。

```
./yarn-ec2 -k mykey -i mypem.pem get-master xgboost
```

それは、マスターマシンのパブリックDNSを表示するようになりec2-xx-xx-xx.us-west-2.compute.amazonaws.com ました。ブラウザを開いて、（DNSをマスターDNSに置き換えて）

```
ec2-xx-xx-xx.us-west-2.compute.amazonaws.com:8088
```

これにより、YARNクラスタのジョブトラッカーが表示されます。マスターがブートストラッピングを終了してジョブトラッカーを開始するまで数分間待たなければならないことに注意してください。

マスターマシンが起動すると、スレーブマシンをクラスタに自由に追加できます。次のコマンドは、m3.xlargeインスタンスをクラスタに追加します。

```
./yarn-ec2 -k mykey -i mypem.pem -t m3.xlarge -s 2 addslave xgboost
```

2つのスポットインスタンスを追加することもできます

```
./yarn-ec2 -k mykey -i mypem.pem -t m3.xlarge -s 2 addspot xgboost
```

スレーブマシンが起動し、ブートストラップしてマスターに報告します。スレーブマシンが接続されているかどうかは、ジョブトラッカーのノードリンクをクリックして確認できます。または次のURLを入力するだけです（DNSをマスターDNSに置き換える）

```
ec2-xx-xx-xx.us-west-2.compute.amazonaws.com:8088/cluster/nodes
```

私たちが注意しなければならないことの1つは、ジョブトラッカーのすべてのリンクが機能するわけではないということです。これは、それらの多くがAWSのプライベートIPを使用しているためです。これはEC2のみがアクセスできます。これらのパッケージには、ssh proxyを使用してアクセスできます。1つのマスターと2つのスレーブを持つクラスタを設定したので、実験を実行する準備が整いました。

#S3でXGBoostを構築する
次のコマンドでマスターマシンにログインできます。

```
./yarn-ec2 -k mykey -i mypem.pem login xgboost
```

S3を使用してデータと結果モデルをホストするので、クラスタのシャットダウン後にデータが失われることはありません。そのためには、S3サポートを備えたxgboostをビルドする必要があります。USE_S3 変数をtrue に設定するだけです。これは次のコマンドで実現できます。

```
git clone --recursive https://github.com/dmlc/xgboost
cd xgboost
cp make/config.mk config.mk
echo "USE_S3=1" >> config.mk
make -j4
```

今我々はS3をサポートするXGBoostを構築しました。USE_HDFSオプションをオンにしてHDFSにデータを保存する場合は、HDFSサポートを有効にすることもできます。

また、XGBoostは環境変数に依存してS3にアクセス~/.bashrcするため、マスターマシン上で次の2行を追加して（文字列を正しいものに置き換える）必要があります。


```
export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
export BUCKET=mybucket
```

#S3上でデータをホストする
この例では、xgboostのサンプルデータセットを入力としてS3バケットにコピーします。通常の用途では、データセットは通常、既存の分散処理パイプラインから作成されます。s3cmdを使用してmybucketにデータをコピーできます（$ BUCKETを実際のバケット名に置き換えてください）。


```
cd xgboost
s3cmd put demo/data/agaricus.txt.train s3://${BUCKET}/xgb-demo/train/
s3cmd put demo/data/agaricus.txt.test s3://${BUCKET}/xgb-demo/test/

```

#ジョブを送信する
すべての準備が整ったので、xgboost分散ジョブをYARNクラスターに送信できます。我々は、使用するDMLC-提出ジョブを送信するスクリプトを。

これで、分散トレーニングフォルダで次のスクリプトを実行できます（$ {BUCKET}を実際のバケット名に置き換えてください）

```
cd xgboost/demo/distributed-training
# Use dmlc-submit to submit the job.
../../dmlc-core/tracker/dmlc-submit --cluster=yarn --num-workers=2 --worker-cores=2\
    ../../xgboost mushroom.aws.conf nthread=2\
    data=s3://${BUCKET}/xgb-demo/train\
    eval[test]=s3://${BUCKET}/xgb-demo/test\
    model_dir=s3://${BUCKET}/xgb-demo/model
```

例えば、すべての構成dataとはmodel_dir直接構成ファイルに書き込むことができます。ファイル名ではなく、ファイルへのフォルダパスのみを指定したことに注意してください。XGBoostはそのフォルダ内のすべてのファイルをトレーニングおよび評価データとして読み込みます。

このコマンドでは、2つのワーカーを使用しており、各ワーカーは2つの実行スレッドを使用しています。XGBostは、各作業者に複数のコアを使用することで利益を得ることができます。一般的な作業コアの選択肢は4〜8です。訓練されたモデルは指定されたモデルフォルダに保存されます。モデルフォルダを参照することができます。

```
s3cmd ls s3://${BUCKET}/xgb-demo/model/
```

以下は、分散トレーニングの出力例です。

```
16/02/26 05:41:59 INFO dmlc.Client: jobname=DMLC[nworker=2]:xgboost,username=ubuntu
16/02/26 05:41:59 INFO dmlc.Client: Submitting application application_1456461717456_0015
16/02/26 05:41:59 INFO impl.YarnClientImpl: Submitted application application_1456461717456_0015
2016-02-26 05:42:05,230 INFO @tracker All of 2 nodes getting started
2016-02-26 05:42:14,027 INFO [05:42:14] [0]  test-error:0.016139        train-error:0.014433
2016-02-26 05:42:14,186 INFO [05:42:14] [1]  test-error:0.000000        train-error:0.001228
2016-02-26 05:42:14,947 INFO @tracker All nodes finishes job
2016-02-26 05:42:14,948 INFO @tracker 9.71754479408 secs between node start and job finish
Application application_1456461717456_0015 finished with state FINISHED at 1456465335961
```

#モデルを分析する
モデルを訓練した後、学習したモデルを分析し、将来の予測タスクに使用することができます。XGBoostは移植可能なフレームワークなので、すべてのプラットフォームのモデルを交換できます。つまり、訓練されたモデルをpython / R / Juliaに読み込んで、これらの言語でデータ科学のパイプラインを利用してモデル分析と予測を行うことができます。

たとえば、このIPythonノートブック を使用して、フィーチャの重要性をプロットし、学習したモデルを視覚化することができます。

#トラブルシューティング
問題が発生した場合は、次のコマンドを使用してコンテナのstdoutとstderrのログを取得し、問題の原因を調べることをお勧めします。

```
yarn logs -applicationId yourAppId

```

#今後の方向性
このチュートリアルでは、分散XGBoostをYARNで使用する方法を学んだことがあります。XGBoostは、グラディエントブースティングのためのポータブルかつスケーラブルなフレームワークです。リソースページで、さらに多くの例とリソースを確認することができます。

プロジェクトの目標は、スケーラブルな機械学習ソリューションをすべてのプラットフォームで利用できるようにすることです。APIはポータブルにできるように設計されており、MPIやSGEなどの他のプラットフォームでも同じコードを実行できます。XGBoostは積極的に進化しており、私たちは分散型xgboost python / Rパッケージなど、さらにエキサイティングな機能に取り組んでいます。チェックアウトロードマップ詳細については、あなたはプロジェクトに貢献することを歓迎する以上のものです。