tkm2261's blog

研究員(OR屋) → データ分析官 → MLエンジニア → ニート → 米国CS PhDが諸々書いてます

LightGBMをGPUで速度検証

LightGBMとは

Microsoftが公開しているGradient Boosting Decision Tree(GBDT)の実装です。

github.com

GBDTの実装で一番有名なのはxgboostですが、LightGBMは2016年末に登場してPython対応から一気に普及し始め、 最近のKaggleコンペではxgboostよりも、Winning Solutionで多く見る気がしています。

私もQuoraコンペではお世話になりました

https://www.slideshare.net/tkm2261/quora-76995457

ニートなので金がない

在職中は会社のマシンで回してたりしたので、気軽に32コアぐらい使ってましたが、

ニートで自費で借りると破産しかねないのでGPUで高速にならないかなーと思って検証しました。

環境構築

AWSのp2.xlargeでAnaconda3系使って検証しました。

基本はここに従います。

LightGBM/GPU-Tutorial.md at master · Microsoft/LightGBM · GitHub

マニュアルに書いてないですが

python setup.py install時にgpuオプションが必須です。

これでしばらく詰んだので皆様忘れずに。

github.com

# 諸々入れて
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になる前にもっと精進せいというお告げと信じて頑張ります

手法とかはこちらにまとまっています。

コンペ後に適当な感じで社内勉強会に外部の方も招待したら、かなりの人数が集まり議論の活発な良い勉強会となりました。

個人的にはログ周りの話で盛り上がれたのが良かったです。最良パラメータや手元スコアを残しておくのは長期のコンペを戦う上で必須かと思います。

Kaggle Master達もログの残し方はそれぞれ違っていたので、最良解もそれぞれと言った感じでしょうか

あとこのコンペでKaggle Expertになり順位がつくようになりました。

f:id:tkm2261:20170621162016p:plain

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論文輪読会を主催しました。会社で参加した人が結構いたので、外部も招いちゃえということでやりました。

内容については、会社ブログを書いたのでそちらを参照してください

www.rco.recruit.co.jp

嬉しいことに多くの発表者に立候補頂き、私の枠埋める用に作ったスライドはお蔵入りしたのですが、

闇に葬り去るにはもったいない気がしたので、公開しました。

内容としては、収束性のオーダーを改善した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

最近は仕事でアウトプットばかりなので、そろそろ自分にガッツリとインプットの時間を取りたい。