先日新規PCを購入しまして、無事GCP課金生活が終了しました。
新規PCはGPUが搭載されいてるので早速環境設定しXGBoostを回してみました。GPU周りの設定は経験も少ないので後々のために記録しておきます。
動作環境
GPUとドライバーの種類は下記の通りです。
GPU:GeForce RTX2080Ti 11GB
Nvidia driver version:430.50
ドライバーは昔GCPで設定した時に残していた記事を参考にダウンロード。

上記の記事ではドライバーの種類を調べた後レポジトリからinstallしていましたが、今回は何故かインストールできなかったのでNvidiaのサイトから.runファイルをわかりやすい位置にダウンロードして下記の手順を実施後インストールしました。
1 2 3 4 5 6 7 8 9 10 |
# 既存のドライバーの無効化 sudo bash -c "echo blacklist nouveau > /etc/modprobe.d/blacklist-nvidia-nouveau.conf" sudo bash -c "echo options nouveau modeset=0 >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf" sudo update-initramfs -u # 再起動 sudo reboot # 何も出ないことを確認 lsmod | grep -i nouveau |
ドライバーをインストールしようとすると英語で色々聞かれるので質問文を調べていくと下記のように選択後、再起動をしたら動作が確認できました。
The distribution-provided pre-install script failed!
→Continue Installation
Would you like to register the kernel module sources with DKMS? This will allow DKMS to automatically build a new module, if you install a different kernel later.
→YES
Install NVIDIA’s 32-bit Compatibility libraries?
→YES
An incomplete installation of libglvnd was found. Do you want to install a full copy of libglvnd? This will overwrite any existing libglvnd libraries.
→install and overwrite
XGBoostでの計算速度比較
IEEEコンペのデータ・セットを使用しました。(行、列)=(590540, 241)
GPU⇔CPUの切り替えは下記のようにパラメータをいじるだけでとても簡単です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import xgboost as xgb clf = xgb.XGBClassifier( n_estimators=2000, max_depth=12, learning_rate=0.02, subsample=0.8, colsample_bytree=0.4, missing=-1, eval_metric='auc', # USE CPU # nthread=4, # tree_method='hist' # USE GPU tree_method='gpu_hist' ) start = time.time() h = clf.fit(X_train.loc[idxT,cols], y_train[idxT], eval_set=[(X_train.loc[idxV,cols],y_train[idxV])], verbose=50, early_stopping_rounds=100) elapsed_time = time.time() - start print("elapsed_time:{0}".format(elapsed_time) + "[sec]") |
GPU使用時:47.19秒

CPU使用時:532.69秒

ということでGPUを使うことで計算時間が10分の1になりました。(感動)
何故か結果も変わっていますが、kaggleのディスカッションでもCPU→GPUにすると精度が上がったぞ!という報告もあったので微妙にアルゴリズムが変わっているのかもしれません。GPUの方が結果が良いというのはたまたまだと思いますが…。
めちゃくちゃ早くなりましたが、パラメーターでtree_method=’gpu_hist’ と設定しているため特徴量の値をbinningする処理で高速化されています。
全ての分岐点を選択する場合はtree_method=”gpu_exact”で指定可能で結果は下記の通り149.47秒ということで少し遅くなってしまいました。

結果も過学習が激しくなってしまったように思われます。
いずれにしてもGPUが使える環境なら簡単にできて効果が絶大なのでやらない手はないですね。
LightGBMのGPU設定について
速度の検証はできていませんが、LightGBMの方もGPUを使用できるようでこちらのkernelを参考にして、インストール済のLightGBMを消してから再度インストールしました。
体感としてはそこまで差は感じられませんが、またの機会に速度検証もしてみようと思います。