🐡

RTX 3090とRTX 4090と違いをXGBoostとLightGBMで比べた記録

2023/08/11に公開

やったこと

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