LoginSignup
31
18

More than 3 years have passed since last update.

LightGBMをGPUで使うのが簡単になってた件

Posted at

LightGBM on GPU

GPUでLightGBMを使う方法を探すと、ソースコードを落としてきてコンパイルする方法が出てきますが、今では環境周りが改善されていて、もっとずっと簡単に導入することが出来ます(NVIDIAの場合)。

まず、GPUドライバーが入っていない場合、入れます。

$ sudo apt install nvidia-driver-450

ビルドツールも入っていない場合、入れます。

$ sudo apt install build-essential
$ sudo apt install cmake

OpenCLと、opencl-headers、libboostを入れます。

$ sudo apt install clinfo
$ sudo apt install opencl-headers
$ sudo apt install libboost-all-dev

システムからlibOpenCL.soを探して、--install-optionに「--gpu」と「--opencl-library」を指定して、pipでインストールします。

$ pip install lightgbm --install-option=--gpu --install-option="--opencl-library=/usr/lib/x86_64-linux-gnu/libOpenCL.so.1"

これだけでGPUで動くLightGBMがインストールされます。

Pythonから使うときは、こんな感じで、parametersに「'device':'gpu'」を追加します。

lgb_params = {
    'objective': ...,
    'boosting' : ...,
    'max_bin': 100,
    'device':'gpu'
    ...
}

lgb_train = lgb.Dataset(X, y)
lgb_eval = lgb.Dataset(X_val, y_val, reference=lgb_train)

model = lgb.train(
        params, lgb_train,
        valid_sets = [lgb_train, lgb_eval],
        categorical_feature = [...],
        verbose_eval = ...,
        num_boost_round = ...,
        early_stopping_rounds = ...
    )

なんで「'max_bin': 100」にしてるかというと、bin sizeが大きすぎると、GPUでは使えないみたいだからです(GPUメモリが余ってても駄目みたい)。

LightGBMError: bin size 800 cannot run on GPU

こんな感じでGPUを使うというメッセージが出て学習が進みます。

[LightGBM] [Info] This is the GPU trainer!!
[LightGBM] [Info] Total Bins 1104
[LightGBM] [Info] Number of data points in the train set: 5535952, number of used features: 29
[LightGBM] [Info] Using GPU Device: Quadro M6000 24GB, Vendor: NVIDIA Corporation
[LightGBM] [Info] Compiling OpenCL Kernel with 256 bins...
[LightGBM] [Info] GPU programs have been built

nvidia-smiで見ても、きちんとPythonがGPUを使っています。

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.80.02    Driver Version: 450.80.02    CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Quadro M6000 24GB   Off  | 00000000:01:00.0  On |                  Off |
| 27%   64C    P0    65W / 250W |    456MiB / 24474MiB |     12%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A       861      G   /usr/lib/xorg/Xorg                124MiB |
|    0   N/A  N/A      1476      G   cinnamon                           24MiB |
|    0   N/A  N/A     23249      C   ...conda3/envs/py/bin/python      257MiB |
+-----------------------------------------------------------------------------+

・・・ただし、GPUメモリの使用量も少なく、GPU-Utilも消費電力も少なく、GPUを飽和させる事は出来ないみたいです。
速度も、劇的に速くなった、という感じではありません。

CatBoost on GPU

一方、CatBoostの場合はさらに簡単で、GPUドライバーとcudaが入っていれば、通常通りpipでインストールして、

$ pip install catboost

Pythonからは「task_type='GPU'」を付けるだけです。max_binも大きくてもいけます。

model = CatBoostClassifier( iterations = ...,
                            custom_metric = ...,
                            max_bin=800,
                            task_type='GPU')
eval_dataset = Pool(X_val,y_val,cat_features = [...])
model.fit(X,
          y,
          cat_features=[...],
          eval_set=eval_dataset,
          early_stopping_rounds = ...,
          verbose_eval = ...)

nvidia-smiで見ると、GPUメモリもほとんど使い切っており、GPU-Utilも消費電力も大きく、GPUをガシガシ使っている感があります。

そして実際、CPUだけよりずっと速い!です。めっちゃ早!って思いました。

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.80.02    Driver Version: 450.80.02    CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Quadro M6000 24GB   Off  | 00000000:01:00.0  On |                  Off |
| 24%   53C    P0   126W / 250W |  23263MiB / 24474MiB |     97%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A       861      G   /usr/lib/xorg/Xorg                123MiB |
|    0   N/A  N/A      1476      G   cinnamon                           20MiB |
|    0   N/A  N/A     14498      C   ...conda3/envs/py/bin/python    23110MiB |
+-----------------------------------------------------------------------------+

というわけで、GPU環境でGBTアルゴリズムを使いたいときはCatBoostを使いましょう、という話でした。

31
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
18