LightGBMをGPUで速度検証
LightGBMとは
Microsoftが公開しているGradient Boosting Decision Tree(GBDT)の実装です。
GBDTの実装で一番有名なのはxgboostですが、LightGBMは2016年末に登場してPython対応から一気に普及し始め、 最近のKaggleコンペではxgboostよりも、Winning Solutionで多く見る気がしています。
私もQuoraコンペではお世話になりました
ニートなので金がない
在職中は会社のマシンで回してたりしたので、気軽に32コアぐらい使ってましたが、
ニートで自費で借りると破産しかねないのでGPUで高速にならないかなーと思って検証しました。
環境構築
AWSのp2.xlargeでAnaconda3系使って検証しました。
基本はここに従います。
LightGBM/GPU-Tutorial.md at master · Microsoft/LightGBM · GitHub
マニュアルに書いてないですが
python setup.py install時に–gpuオプションが必須です。
これでしばらく詰んだので皆様忘れずに。
# 諸々入れて sudo apt-get update sudo apt-get install --no-install-recommends nvidia-375 sudo apt-get install --no-install-recommends nvidia-opencl-icd-375 nvidia-opencl-dev opencl-headers # 再起動して sudo init 6 # また諸々いれて sudo apt-get install --no-install-recommends git cmake build-essential libboost-dev libboost-system-dev libboost-filesystem-dev # 本体を入れる git clone --recursive https://github.com/Microsoft/LightGBM cd LightGBM mkdir build ; cd build cmake -DUSE_GPU=1 .. make -j$(nproc) cd .. cd python-package/ python setup.py install --gpu # ここのオプション忘れずに!
成功すると、起動時にこんなログが流れます
[LightGBM] [Info] This is the GPU trainer!! [LightGBM] [Info] Total Bins 50745 [LightGBM] [Info] Number of data: 6767336, number of used features: 283 [LightGBM] [Info] Using requested OpenCL platform 0 device 0 [LightGBM] [Info] Using GPU Device: Tesla K80, Vendor: NVIDIA Corporation [LightGBM] [Info] Compiling OpenCL Kernel with 256 bins... [LightGBM] [Info] GPU programs have been built [LightGBM] [Info] Size of histogram bin entry: 12 [LightGBM] [Info] 248 dense feature groups (1600.55 MB) transfered to GPU in 1.454054 secs. 16 sparse feature groups.
速度検証
同一タスクをCPUと検証
ここを見る限り2~3倍高速化する模様
LightGBM/GPU-Performance.md at master · Microsoft/LightGBM · GitHub
問題サイズ
項目 | 値 |
---|---|
データサイズ | 行数: 8,474,661, 列数: 269 |
パラメータ | {‘max_depth’: 5, ‘learning_rate’: 0.01, ‘min_data_in_leaf’: 10, ‘feature_fraction’: 0.7, ‘metric’: ‘binary_logloss’, ‘bagging_fraction’: 0.9, ‘lambda_l1’: 1, ‘max_bin’: 500, ‘min_split_gain’: 0, ‘device’: ‘gpu’, ‘gpu_platform_id’: 0, ‘gpu_device_id’: 0} |
100ラウンド固定の場合
環境 | 時間 | logloss |
---|---|---|
p2.xlarge (GPU K80) | 3m41s | 0.256575 |
p2.xlarge (4 CPU) | 7m29s | 0.256574 |
c4.4xlarge (16 CPU) | 1m58s | 0.256574 |
4CPUには大体2倍ぐらいの高速化。16 CPUよりは倍ぐらい遅い
max_bins=63に変更した場合
max_binsが小さいとき(推奨63)により速いと書いてるので検証
環境 | 時間 | logloss |
---|---|---|
p2.xlarge (GPU) | 3m28s | 0.256575 |
p2.xlarge (4 CPU) | 6m27s | 0.256574 |
今回のデータだと、binサイズを上げてもあんまり関係ないみたいです。
early stoppingの場合
early_stopping_rounds=30にして80%で学習、20%で精度検証
環境 | 時間 | logloss | Best Round数 |
---|---|---|---|
p2.xlarge (GPU K80) | 11m27s | 0.243065 | 808 |
p2.xlarge (4 CPU) | 26m53s | 0.243078 | 750 |
c4.4xlarge (16 CPU) | 8m16s | 0.243078 | 750 |
100ラウンドの時と異なり、c4.4xlargeとくらべてRound数考慮するとほぼ同程度の速度が出ています。
GPUなので最初のオーバーヘッドがあると思われます。
10,000ラウンドぐらいの結果が気になりますが、気が向いたらアップデートします。
結論
GPU(K80)だとc4.4xlarge(16 CPU)程度の性能が出ることがわかりました。
スポットインスタンス価格だとp2.xlargeもc4.4xlargeも$0.2ぐらいで変わりませんが、
家にGTX 1080とかある人は、CPUに投資するよりDNNとかも出来るGPUに資金を集中出来て良さそうです。
さらにGPU拡張はマージされたばかりなので、速度向上が見込めるので将来有望です
Kaggle Quoraコンペ 17位でした
お久しぶりです。最近、色々ありましてブログを再開しようと思います。
基本的に、スライド作って話す事が多いので、まずその辺りのこと書こうと思います。時系列狂うかもですがご容赦を
今月6月に終了した、Quora Question Pairs | Kaggleに参加してソロ17位でした。
あと1個上の順位だったら、ゴールドメダルだったので悔しくて仕方ないですがMasterになる前にもっと精進せいというお告げと信じて頑張ります
手法とかはこちらにまとまっています。
コンペ後に適当な感じで社内勉強会に外部の方も招待したら、かなりの人数が集まり議論の活発な良い勉強会となりました。
smly氏はFileHandlerとStreamHandlerでファイルにも吐いているとのこと
— Takami Sato (@tkm2261) 2017年6月18日
最近xgboostやLightGBMは標準出力めっちゃ出してくるからファイルに出すの大事
個人的にはログ周りの話で盛り上がれたのが良かったです。最良パラメータや手元スコアを残しておくのは長期のコンペを戦う上で必須かと思います。
Kaggle Master達もログの残し方はそれぞれ違っていたので、最良解もそれぞれと言った感じでしょうか
私の雑logクラスを置いておきます https://t.co/bUAUXPmxf8
— threecourse (@threecourse) 2017年6月18日
あとこのコンペでKaggle Expertになり順位がつくようになりました。
446位なのは直近のコンペが高く評価されるシステムらしく、BoschとQuoraで高くなってるものと思われます。
でも順位よりも、Masterに早くなりたい。。。
Data Science Bowl 2017(肺がん検知)の上位手法を調べた
お久しぶりです。最近、色々ありましてブログを再開しようと思います。
基本的に、スライド作って話す事が多いので、まずその辺りのこと書こうと思います。時系列狂うかもですがご容赦を
今年2017年の4月に1億円コンペで有名になった、Data Science Bowl 2017 | Kaggleにちょっと参加しました。
画像DNNの知見を貯めようと参加しましたが全く歯が立たたず、2ステージ制の1ステージ目で諦めてしまいました。
このままでは流石に悔しかったので上位手法を調べました。
内容は見ていただければと思いますが、印象的だったのは上位手法ほどシンプルだった点です。
やはりシンプルな手法が実務でもコンペでも最も強い気がします。
NIPS・ICDM 2016論文輪読会を主催 & RSVRGの論文を読んだ
お久しぶりです。最近、色々ありましてブログを再開しようと思います。
基本的に、スライド作って話す事が多いので、まずその辺りのこと書こうと思います。時系列狂うかもですがご容赦を
今年2017年2月にNIPS・ICDM 2016論文輪読会を主催しました。会社で参加した人が結構いたので、外部も招いちゃえということでやりました。
内容については、会社ブログを書いたのでそちらを参照してください
嬉しいことに多くの発表者に立候補頂き、私の枠埋める用に作ったスライドはお蔵入りしたのですが、
闇に葬り去るにはもったいない気がしたので、公開しました。
内容としては、収束性のオーダーを改善したSVRGをリーマン多様体上に拡張した論文です。
連続最適化の収束性の証明はいつも泣きそうになるんですが、あれがぱっとわかるぐらい頭が良くなりたい。。。
Kaggle Boschコンペ15位でした
お久しぶりです。最近、色々ありましてブログを再開しようと思います。
基本的に、スライド作って話す事が多いので、まずその辺りのこと書こうと思います。時系列狂うかもですがご容赦を
昨年2016年の末に、同僚のhskkskさんとg_votteさんとともにBoschコンペに参加してきました
Bosch Production Line Performance | Kaggle
コンペは生産ラインの各種センサー情報から不良品の検知をするものでした。
アンサンブルやモデル作成面では貢献出来たと思うのですが、hskkskさんのデータを詳細に見る力に圧倒的で、彼の貢献が大半を占めてこの結果となりました。
このコンペからKaggleガチでやり始めたのですが、出来る人の作業を間近で見るのが上達の近道なのを実感しました。
特に『Kaggle上位に行くには特別な手法は必要なく、些細なことの積み重ね』というのが感じられて、上位を狙う感覚がわかったのが収穫でした
我々のチームの手法はhskkskさんがKaggle Meetupで話したスライドがあるのでそちらを参考にしてください
決定木からxgboostまで調べてみた
お久しぶりです。最近、色々ありましてブログを再開しようと思います。
基本的に、スライド作って話す事が多いので、まずその辺りのこと書こうと思います。
会社の輪読会でElements of Statistical Learning: data mining, inference, and prediction. 2nd Edition.の10章『Boosting and Additive Trees』の担当になったのと、
Kaggle Boschコンペでxgboostの一部パラメータを意味知らずにチューニングしてたりしたので、調べました。
ネットで探しても意外と"木"って目線でまとまった資料がなかったので、参考なればと思います
あと、英語の勉強で英語資料にしたのですが、インド系や中国系の方からの反応があったりして新鮮でした。
ICML2015読み会 『Sparse Subspace Clustering with Missing Entries』
皆様、こんにちは
最近業務が忙しすぎて更新が滞っております。
分析官の仕事よりも、分析結果をお客様に使って貰うための画面・インフラ構築に忙殺されていたり。。。
私は今後何になって行くのか若干不安を抱える今日この頃です。
久しぶりの投稿ですが新ネタではなく2ヶ月前にPFN様主催のICML読み会で話したので投稿します。
感想
- 計算時間的に有用性は微妙だが、高次元空間に複数の低次元空間が埋め込まれていて、それをクラスタリングしたいという動機は好きである。
- カーネルが分かれば、元の行列に欠損値あってもいいよね!という系のアイデアはかなり好き
- 良い論文だったが、資料にまとめるのに提案手法と既存手法が一杯出てくるので伝え切れて無い気がする。
www.slideshare.net
最近は仕事でアウトプットばかりなので、そろそろ自分にガッツリとインプットの時間を取りたい。