CatBoost on GPU のひみつ

CatBoost on GPU の ひみつ
2023/09/23 第1回関東Kaggler会
@tawatawara
自己紹介
SaaS企業の某某 R&D所属
◦ 社会人からMLを始める
◦ 元 JTC Kaggler
Kaggle * Master
◦ GMになりたい. . .
おことわり
知っている人にはごく当たり前の話かもしれません
◦ CatBoost ガチ勢はどうかご容赦を🙏
調査結果は網羅的でない可能性があります
◦ この先は君の眼で確かめてくれ
今からあなたはテーブルコンペに参加します
???「ここに3匹の GBMon がおるじゃろ?」
今からあなたはテーブルコンペに参加します
???「初手はどれを選ぶんじゃ?」
今からあなたはテーブルコンペに参加します
???「なるほど、LightGBMか」
👆
初手 は定番
CPUでお手軽かつ高速に学習できる
性能が他のGBMonに勝る傾向がある
◦ ただしこれはデータやタスクによる
欠点は木(森)が増えすぎたときに推論が遅いこと
参考:「初手LightGBM」をする7つの理由 by u++ さん
今からあなたはテーブルコンペに参加します
???「ではGPUが使える状況ならどうじゃ?」
今からあなたはテーブルコンペに参加します
???「ふむ、XGBoostか」
👆
GPUが使えるなら は実用に耐えうる
学習の遅さという欠点が解消される
◦ というか GPU で学習させる以外の選択肢が無い
データ次第だが性能が劣ることも(そんなに)ない
推論速度は LightGBM よりは速い(はず)
◦ 木(森)の大きさ次第だと思います
今からあなたはテーブルコンペに参加します
???「CatBoost は... CatBoost はどうなんじゃ?」
GPUを使うと は学習がかなり速い
「最高じゃん!」と思いきや...
CPUとGPUで学習の挙動が結構変化する
◦ ときには CPUでの学習より性能がかなり悪化する場合も...
◦ このせいで CatBoost を大きなデータで使うのを躊躇う人も居ると思われる
推論速度は3匹の GBMon の中で一番速い
今回のお題
CatBoost をGPUで学習するときの
性能悪化の原因を突き止めたい
結論
異なるハイパラが
暗黙的に設定される
ハイパラのページを頑張って探索すると…
ここ!
https://catboost.ai/en/docs/references/training-parameters/
勝手に異なるハイパラが設定される(!!)
Name Default Value
border_count
a.k.a. max_bin
CPU: 254
GPU in PairLogitPairwise and YetiRankPairwise modes: 32
GPU in all other modes: 128
ctr_target_border_count
Number_of_classes - 1 for Multiclassification problems when training on CPU, 1
otherwise
max_ctr_complexity
GPU for categorical features in MultiClass and MultiClassOneVsAll modes: 1
In all other cases: 4
bootstrap_type
When the objective parameter is QueryCrossEntropy, YetiRankPairwise,
and the bagging_temperature parameter is not set: Bernoulli with the subsample
set to 0.5.
Neither MultiClass nor MultiClassOneVsAll, task_type = CPU and sampling_unit =
Object: MVS with the subsample parameter set to 0.8.
Otherwise: Bayesian.
勝手に異なるハイパラが設定される(!!)
特に回帰・二値分類ではこのふたつが悪さをする
Name Default Value
border_count
a.k.a. max_bin
CPU: 254
GPU in PairLogitPairwise and YetiRankPairwise modes: 32
GPU in all other modes: 128
bootstrap_type
When the objective parameter is QueryCrossEntropy, YetiRankPairwise,
PairLogitPairwise and the bagging_temperature parameter is not set:
the subsample parameter set to 0.5.
Neither MultiClass nor MultiClassOneVsAll, task_type = CPU and
= Object: MVS with the subsample parameter set to 0.8.
Otherwise: Bayesian.
勝手に異なるハイパラが設定される(!!)
device(task_type)以外は揃えたつもりでも…
※豆知識:allow_writing_files=False にすると catboost_info が出力されなくなります
勝手に異なるハイパラが設定される(!!)
device(task_type)以外は揃えたつもりでも…実際はこうなる
※補足:これ以外にも暗黙的に設定されるハイパラが存在しますが割愛
実験 – 設定
以下の4つを比較 (5-fold CV で学習)
1. CPU使用時のデフォルトパラメータ
2. GPU使用時のデフォルトパラメータ
3. CPU使用時に bootstrap_type=Bernoulli、subsample=0.8 に
4. GPU使用時に bootstrap_type=Bernoulli、subsample=0.8、max_bin=254
に
◦ 補足
◦ bootstrap_type=Bernoulli は CPU でも GPU でも選択でき、subsample を使用できる
◦ max_depth は 6、learning_rate は 0.1 で統一する
◦ GPUでの学習は seed を固定してもぶれるため、10回行って平均を取る
◦ 関連 Issue: Random seed issue on classifier when run on GPU
実験 – データ
American Express - Default Prediction†(二値分類) のデータで検証
◦ データがログデータなので特徴量エンジニアリングが必要
◦ 今回は以下の公開 Notebook のものを拝借した
◦ Amex LGBM Dart CV 0.7963
◦ 特徴量エンジニアリング後のデータの規模
◦ Train: 458,913行、Test: 924,621行、特徴量: 1095個
†:https://www.kaggle.com/competitions/amex-default-prediction
実験 – 結果
◦ GPUのデフォルトはCPUのデフォルトに全ての数値で下回る(2 < 1)
◦ GPUのハイパラを変更したものはCPUのデフォルトに全ての数値で上回る(4 > 1)
◦ CPUのハイパラを変更したものが Public/Private が最も高い (黒太字)
ID Device ハイパラ 学習時間(sec) CV Public LB Private LB
1 CPU デフォルト 1616 0.79056 0.79361 0.80124
2 GPU デフォルト 313 0.79042 0.79327 0.80103
3 CPU 変更 1818 0.79097 0.79388 0.80172
4 GPU 変更 305 0.79114 0.79366 0.80164
暗黙的に設定されていたハイパラを変更することにより
CPU(デフォルト)と同等かそれ以上の性能をGPUで出せた
まとめ
CatBoost はGPUで超高速に学習できるが性能面に問題があった
◦ なぜか CPU と GPU で性能に差がある
◦ 一番活用できるはずの大規模データでの使用が躊躇われる
CPU と GPU で暗黙的に異なるハイパラが設定されていた
◦ 特に回帰と二値分類では max_bin と bootstrap_type が影響している
暗黙的に設定されていたハイパラを変更し過去コンペデータで検証
◦ GPU(ハイパラ変更)がCPU(デフォルト)と同等の性能になった
◦ CPU(ハイパラ変更)の性能が上がったのは予想外だったが、CPU(デフォルト)と
GPU(デフォルト)の性能差の原因を一部解明できたとは思われる
良かったね!
🎉 🎉
🎊
おまけ: 他の GBMon との比較
こいつらと比較するとどうなの?
追加実験 – 設定
以下の6つを比較 (5-fold CV で学習)
1. CatBoost(CPU), bootstrap_type=Bernoulli、subsample=0.8
2. CatBoost(GPU), bootstrap_type=Bernoulli、subsample=0.8、max_bin=254
3. XGBoost(CPU), subsample=0.8
4. XGBoost(GPU), subsample=0.8
5. LightGBM(CPU), subsample=0.8
6. LightGBM(GPU(CUDA)), subsample=0.8
◦ 補足:max_depth は 6、learning_rate は 0.1、CPUスレッド数は 8、で統一する
追加実験 – 性能比較
◦ 今回の設定では CatBoost が一番性能が良い(ハイパラ tuning で変わるかも…)
◦ Amex が制約の強いモデルの方が有効なコンペだったのかもしれない
◦ XGBoost は CPU と GPU であまり性能が変わらないように見える
◦ LightGBM(CUDA) の性能が妙に低いが原因は不明
ID Model Device CV Public LB Private LB
1 CB CPU 0.79097 0.79388 0.80172
2 CB GPU 0.79114 0.79366 0.80164
3 XGB CPU 0.78799 0.79143 0.79944
4 XGB GPU 0.78807 0.79097 0.79974
5 LGB CPU 0.78822 0.79061 0.79948
6 LGB GPU(CUDA) 0.77396 0.77596 0.78441
追加実験 – 学習・推論速度比較
◦ 今まで比較したことが無かったが、学習速度(CPU)は LGB > CB >> XGB
◦ 学習速度(GPU)は CB > XGB > LGB
◦ 推論速度(CPU)は CB > XGB > LGB
ID Model Device 合計
iteration
学習時間
(sec)
学習時間/iter
(ms/it)
推論時間
(sec)
推論時間/iter
(ms/it)
1 CB CPU 5309 1818.29 342.50 10.70 2.02
2 CB GPU 5038 305.06 60.55 11.10 2.20
3 XGB CPU 1870 21738.02 11624.61 14.29 7.64
4 XGB GPU 1714 139.88 81.61 17.45 10.18
5 LGB CPU 1867 401.55 215.08 40.50 21.69
6 LGB GPU(CUDA) 755 155.16 205.52 34.00 45.03
※特に推論速度についてはそのときのCPUの調子にもよるかも
追加実験 – まとめ
性能についてはデータにも tuning にもよるので一概には言えない
◦ ただ LightGBM(CUDA) についてだけは何かおかしい気がする
◦ CPU に比べてやたらと早く early stopping がかかっていた
◦ Build をミスったのか、それとも CatBoost 同様に”ひみつ”があるのか...
学習速度について
◦ CatBoost(CPU)が遅いと言われがちだが実はXGBoost(CPU)の方がめちゃくちゃ遅い
◦ ただし Categorical Feature が沢山あったりすると話は変わるかも
◦ GPUについては CatBoost > XGBoost、LightGBM は CPU とほぼ一緒
推論速度について
◦ CatBoost が圧倒的に速い
◦ Iteration 数が少ないので目立っていないが LightGBM はやはり遅い
おしまい
???「みんなも GBMon、ゲットじゃぞ!」
1 de 30

Más contenido relacionado

La actualidad más candente(20)

Transformer メタサーベイTransformer メタサーベイ
Transformer メタサーベイ
cvpaper. challenge27.3K vistas
自己教師学習(Self-Supervised Learning)自己教師学習(Self-Supervised Learning)
自己教師学習(Self-Supervised Learning)
cvpaper. challenge12.7K vistas
[DL輪読会]ICLR2020の分布外検知速報[DL輪読会]ICLR2020の分布外検知速報
[DL輪読会]ICLR2020の分布外検知速報
Deep Learning JP5.4K vistas
backbone としての timm 入門backbone としての timm 入門
backbone としての timm 入門
Takuji Tahara7.3K vistas

Similar a CatBoost on GPU のひみつ(20)

Isca13 studyIsca13 study
Isca13 study
Toshiya Komoda1.6K vistas
[DL Hacks]FPGA入門[DL Hacks]FPGA入門
[DL Hacks]FPGA入門
Deep Learning JP3K vistas
20221116_DBTS_PGStrom_History20221116_DBTS_PGStrom_History
20221116_DBTS_PGStrom_History
Kohei KaiGai125 vistas
20130126 sc12-reading20130126 sc12-reading
20130126 sc12-reading
Toshiya Komoda649 vistas
Routerboard勉強会 tipsRouterboard勉強会 tips
Routerboard勉強会 tips
kometch H4.7K vistas
AWSとGPUインスタンスのご紹介AWSとGPUインスタンスのご紹介
AWSとGPUインスタンスのご紹介
Yasuhiro Matsuo2.8K vistas
20170310_InDatabaseAnalytics_#120170310_InDatabaseAnalytics_#1
20170310_InDatabaseAnalytics_#1
Kohei KaiGai6.7K vistas
1070: CUDA プログラミング入門1070: CUDA プログラミング入門
1070: CUDA プログラミング入門
NVIDIA Japan7.6K vistas

CatBoost on GPU のひみつ