🐡
RTX 3090とRTX 4090と違いをXGBoostとLightGBMで比べた記録
やったこと
GPUを買い替えたこの機会にXGBoostとLightGBMのGPU性能の比較をして、共有することにしました。
最初の実験で使ったRTX4090の初期不良を引いたので、返品してCore i9 13900KFを買って追加の実験をしました。太字で追記しています。
ホスト環境
- Ubuntu 22.04
- nVidiaドライバ535.86.10
- CUDA 11.8 & CUDA 12.2
- nvidia-container-toolkit 1.13.5
- CPU : Ryzen 5 2600 あるいは Core i9 13900KF
- GPU : RTX3090 あるいは RTX4090
- Memory : DDR4 PC4-25600 64GB
コンテナ環境
- ベースイメージはnvidia/cuda:11.8.0-devel-ubuntu22.04
- LightGBM 4.0.0.99
- CUDA対応をONする設定でソースからビルド・インストールしました
- XGBoost 1.7.6
- pipからそのままバイナリをインストールしました
実験内容
- トレーニングの起点から1年間のデータ (51〜54万行 x 210列) を利用し、銘柄の日次リターンの予測器をトレーニングします
- トレーニングされた予測機を利用して、トレーニング期間終点から1ヶ月分の日次リターンを予測して、結果を記録します。これを1ループとしました。
- このループを、2014-01-01を最初のトレーニングの起点として、トレーニングの起点が2022-07-11になるまで起点を1ヶ月ずつずらしながら実行しました。
- ループ中では、トレーニングや予測に加えてファクター中立化やデータフレームのGPUへのロードなどの処理を実施しています。おおむね1ループて3秒ほどかかっていました。
- XGBoostのトレーニング時のパラメータは以下のようなものを使いました。
- max_depth=4
- learning_rate=0.01
- max_leaves=20
- n_estimators=2000
- colsample_bytree=0.1
- grow_policy="lossguide"
- tree_method="gpu_hist"
- LightGBMのトレーニング時のパラメータは以下のようなものを使いました。
- max_depth=4
- learning_rate=0.01
- num_leaves=20
- n_estimators=2000
- feature_fraction=0.1
- device="cuda" (ただし13900KF単体の性能を試す際はcpu)
結果
プロセッサ | GBDTライブラリ | 1回のトレーニング時間 | 全ループにかかった時間 |
---|---|---|---|
Ryzen 5 2600 | XGBoost | 約110秒から約120秒でばらついている | 3時間21分 |
RTX3090 + Ryzen 5 2600 | XGBoost | 約16.5秒 | 35分10秒 |
RTX3090 + Core i9 13900KF | XGBoost | 約14秒 | 29分17秒 |
RTX4090 + Ryzen 5 2600 | XGBoost | 約11.0秒 | 26分44秒 |
プロセッサ | GBDTライブラリ | 1回のトレーニング時間 | 全ループにかかった時間 |
---|---|---|---|
Ryzen 5 2600 | LightGBM | 約30秒から50秒でばらついている | 1時間21分 |
RTX3090 + Ryzen 5 2600 | LightGBM | 約23.5秒 | 44分37秒 |
RTX3090 + Core i9 13900KF | LightGBM | 約18.0秒 | 33分21秒 |
RTX4090 + Ryzen 5 2600 | LightGBM | 約19.0秒 | 38分55秒 |
Core i9 13900KF | LightGBM | 約20秒から約40秒でばらついている | 1時間01分 |
気づいたこと
- Core i9 13900KFを使ってLightGBMを使っても、古い世代のCPUから3割程度しか性能向上が見られませんでした。観察したところ、コアを使い切れていないことは原因ではなかったので、メモリ帯域が制約になっているのかもしれません。
- ということで、勾配ブースティング木を高速に使いたいなら、強力なCPUと強力なGPUを併用してXGBoostを使うのがよさそうです。一番お金のかかる結論になってしまいました。
- RTX4090とXGBoostを組み合わせた時、実験開始からおよそ2分間だけ、トレーニングに通常時の3倍、約30秒かかる謎の現象が起こっていました。
- 実験区間を2018-01-01から2023-08-10に変更すると発生しなくなりました。なぜ?
- 銘柄数を減らしてデータフレームの容量を減らして、改めて実験区間を2014年からに戻すと、また遅くなる問題が発生しました。ううむ。
- Core i9 13900KFに切り替えたあとはRTX3090でも同様の症状が発生するようになり、やはり実験区間を短くすると問題を回避できました。RTX3090でも最初の4分間だけトレーニング一回に30秒程度かかっていたので、GPUの性能差と関係のない遅延なのかもしれません。
- トレーニング時に消費したVRAMは3GB強でした。
- XGBoostをRTX3090二枚で並列化して使う方法も試しましたが、この程度のデータ量だとかえって遅くなってしまいます。
- データや結果をpickle化してワーカー間でやり取りする処理が増えていて、それぞれのワーカーにつき、1ループで5秒ほど追加でかかっていました。
- 高速なCPUを使うことで、このオーバーヘッドを軽減できるかもしれませんが、GPUを売ってしまったので検証できなくなってしまいました。
おまけ
-
実験に利用したRTX3090は、MSI GeForce RTX 3090 GAMING TRIO 24Gです。
-
実験に利用したRTX4090は、ASUS ROG Strix LC GeForce RTX 4090 O24G GAMINGです。
- 発生した初期不良は、カードを入れ替えた直後の起動時は通常起動して利用できるものの、その次の起動時はVGA認識エラーのビープ音が出て、BIOS画面さえ出ないというものでした。もしかすると初期不良ではなく、マザーボードとCPUが古すぎたのかもしれません。
-
Core i9 13900KFを使った場合、以下のスクリーンショットで見られるGPU高負荷の間の谷の時間が短くなり、さらにGPU高負荷時のGPU利用率が92%程度になりました。
XGBoostとRyzen2600 + RTX3090を使ってトレーニング中の表示
XGBoostとRyzen2600 + RTX4090を使ってトレーニング中の表示
LightGBMとRyzen2600 + RTX3090を使ってトレーニング中の表示
LightGBMとRyzen2600 + RTX4090を使ってトレーニング中の表示
XGBoostと13900KF+RTX3090を使ってトレーニング中の表示
Discussion