LightGBMでGPUを使用するための環境構築

Python

はじめに

GPUを使用してLightGBMのモデルを作成するための環境構築手順を整理しました。

競馬の順位予測モデルを作成しています。XGBoost、LightGBM、CatBoostでアンサンブル学習し、予測精度を向上させたいと考えています。Windowsの環境でのLightGBM環境の構築手順が「これだ」と言える手順を見つけることができなかったので、自分で構築手順を整理してみました。

構築した環境

GPUを用いてLigthGBMのモデルをビルドしたときの環境は下記となります。

項目 バージョン
OS Windows10、11
GPU NVIDIA GeForce RTX3060
Python 3.10、3.12 
※3.8では動作しませんでした
CMake 3.30.2
CUDA Toolkit CUDA Toolkit 12.6
C++ Visual Studio Community 2022
※C++のライブラリをインストールする
boost C++ 1.85.0
LightGBM 4.5.0

環境の手順

Python のインストール

Pythonの3.10、3.12で動作を確認しました。3.10と3.12をインストールしていない場合は、下記からダウンロードし、インストールてください。

Download Python | Python.org

CMake のインストール

GPUサポートを有効にしたLightGBMをビルドする場合、CMakeはCUDAや他のライブラリを適切に検出し、設定するために必要なツールです。

下記から「cmake-3.30.2-windows-x86_64.msi」をダウンロードしてください。

Download CMake

ダウンロードするmsiファイルは「Binary distributions」にあります。

ダウンロードした「cmake-3.30.2-windows-x86_64.msi」を実行すると、インストールが始まります。インストール時の設定変更はなく、Nextを選択し続け、最後にInstallをクリックしてください。

Visual Studio Community 2022 のインストール

LightGBMをソースコードからビルドし、GPUサポートを有効にするために必要なC++コンパイラやビルドツールを提供します。

下記から「VisualStudioSetup.exe」をダウンロードしてください。

Visual Studio 2022 コミュニティ エディション – 最新の無料バージョンをダウンロードする (microsoft.com)

「ダウンロード」をクリックします。

ダウンロードした「VisualStudioSetup.exe」を実行すると、インストールが始まります。
「C++によるデスクトップ開発」を選択して「インストール」をクリックします。

インストールが終わると「Visual Studio サインイン」を求められますが、この後の作業にサインインは不要なので「今はスキップ」を選択し、Visual Studioは使用しないので、閉じてください。

boost C++ のインストール

LightGBMのコードが依存している多くのユーティリティ関数、データ構造、スレッド管理、ファイルシステム操作などをBoostライブラリが提供しています。GPUを使用するLightGBMでも、Boostの機能は重要な役割を担っています。

下記のURLから「boost_1_85_0-msvc-14.3-64.exe」をダウンロードしてください。

Boost C++ Libraries - Browse /boost-binaries/1.85.0 at SourceForge.net
Free peer-reviewed portable C++ source libraries

赤枠の「boost_1_85_0-msvc-14.3-64.exe」をダウンロードします。

ダウンロードした「boost_1_85_0-msvc-14.3-64.exe」を実行するとインストールが始まります。

インストールするフォルダのパスをメモしておいてください。
LightGBMをインストールするときに使用します。
デフォルトだと「C:\local\boost_1_85_0」となります。こだわりが無ければ、そのままでインストールを進めてください。

CUDA Toolkit 12.6 のインストール

CUDA Toolkit 12.6 12.6は、GPUを制御するためのAPIを提供し、LightGBMがGPUの計算能力を最大限に引き出せるようにします。

下記のURLから「cuda_12.6.0_windows_network.exe」をダウンロードしてください。

CUDA Toolkit 12.6 Downloads | NVIDIA Developer

最初にユーザ登録を求められるので、ユーザ登録を行います。

 

ユーザ登録を終えたらダウンロードするCUDA Toolkit 12.6を実行する環境を選択します。
構築する環境を選択してください。

「cuda_12.6.0_windows_network.exe」をダウンロードして実行します。
インストール時の設定で変更はありません。「次へ」をクリックし続けてください。

インストールが終わると「NVIDIA」へのログインを求められますが、ログインは不要です。
「GEFORCE EXPERECE」は閉じてください。

LightGBM のインストール

LightGBMをソースコードからビルドし、GPUサポートを有効にしてインストールします。
Pythonの仮想環境を起動し、下記のコマンドを実行してください。

(.venv)> pip install --no-binary lightgbm lightgbm --config-settings=cmake.define.USE_GPU=ON --config-settings=cmake.define.BOOST_ROOT="C:/local/boost_1_85_0" --config-settings=cmake.define.BOOST_LIBRARYDIR="C:/local/boost_1_85_0/lib64-msvc-14.3"

<オプションの補足>

オプション 補足
–no-binary lightgbm lightgbmをソースコードからビルドするように指示
–config-settings=cmake.define.USE_GPU=ON CMakeを使用してLightGBMをビルドする際に、USE_GPU=ONを定義し、CUDAを使用してGPUをサポートするようにビルド
–config-settings=cmake.define.BOOST_ROOT=”C:/local/boost_1_85_0″ CMakeに対して、Boostライブラリのルートディレクトリを指定
–config-settings=cmake.define.BOOST_LIBRARYDIR=”C:/local/boost_1_85_0/lib64-msvc-14.3″ CMakeに対して、Boostライブラリのバイナリファイル(.libや.dll)のディレクトリを指定

GPUを用いて動作しているかの確認

搭載しているGPUを使用してモデルのトレーニングを実施しているかを確認する方法を整理しました。サンプルコードを実行することで、GPUを使用しているかを確認することができます。
モデルのトレーニングで使用するデータセットは、Scikit-learnライブラリが提供するサンプルデータセットの乳がん(Breast Cancer)を使用しています。

<サンプルコード実行の準備>

Pythonの仮想環境を起動して実行に必要なパッケージを追加します。

(.venv)> pip install scikit-learn

<サンプルコード>

下記のコードを任意のPythonファイル名で保存してください。ここでは、check_gpu.pyで保存します。

import lightgbm as lgb
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# データの読み込み
data = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=42)

# データセットの作成
train_data = lgb.Dataset(X_train, label=y_train)
test_data = lgb.Dataset(X_test, label=y_test, reference=train_data)

# パラメータ設定
params = {
    'boosting_type': 'gbdt',
    'objective': 'binary',
    'metric': 'binary_error',
    #'device': 'cpu',
    'device': 'gpu',
    'gpu_platform_id': 0,
    'gpu_device_id': 0,
}

# モデルのトレーニング
print("Training started...")
bst = lgb.train(params, train_data, valid_sets=[test_data], num_boost_round=100, callbacks=[lgb.early_stopping(10)])

# 予測
y_pred = bst.predict(X_test, num_iteration=bst.best_iteration)
y_pred = (y_pred > 0.5).astype(int)

# 精度の評価
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy * 100:.2f}%")

<サンプルコード:check_gpu.pyの実行>

Pythonの仮想環境を起動して下記のようにcheck_gpu.pyを実行してください。

(.venv)> python check_gpu.py
Training started...
[LightGBM] [Info] Number of positive: 286, number of negative: 169
[LightGBM] [Info] This is the GPU trainer!!
[LightGBM] [Info] Total Bins 4548
[LightGBM] [Info] Number of data points in the train set: 455, number of used features: 30
[LightGBM] [Info] Using requested OpenCL platform 0 device 0
[LightGBM] [Info] Using GPU Device: NVIDIA GeForce RTX 3060, Vendor: NVIDIA Corporation
[LightGBM] [Info] Compiling OpenCL Kernel with 256 bins...
[LightGBM] [Info] GPU programs have been built
[LightGBM] [Info] Size of histogram bin entry: 8
[LightGBM] [Info] 30 dense feature groups (0.01 MB) transferred to GPU in 0.003200 secs. 0 sparse feature groups
[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.628571 -> initscore=0.526093
[LightGBM] [Info] Start training from score 0.526093
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
Training until validation scores don't improve for 10 rounds
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
[LightGBM] [Warning] No further splits with positive gain, best gain: -inf
Early stopping, best iteration is:
[9]     valid_0's binary_error: 0.0350877
Accuracy: 96.49%

下記のメッセージが出ていれば、GPUを使用してモデルのトレーニングおよび予測を実施しています。

[LightGBM] [Info] Using requested OpenCL platform 0 device 0
[LightGBM] [Info] Using GPU Device: NVIDIA GeForce RTX 3060, Vendor: NVIDIA Corporation
[LightGBM] [Info] Compiling OpenCL Kernel with 256 bins...
[LightGBM] [Info] GPU programs have been built

<サンプルコードの補足>

GPU使用の有無は、パラメータ設定で実施しています。
ここではパラメータ設定について補足します。GPUを使用する際に設定が必要はパラメータは下記の3つです。

  1. ‘device’: ‘gpu’
  2. ‘gpu_platform_id’: 0,
  3. ‘gpu_device_id’: 0,

<パラメータ設定のコード>

# パラメータ設定
params = {
    'boosting_type': 'gbdt',
    'objective': 'binary',
    'metric': 'binary_error',
    # 'device': 'cpu',
    'device': 'gpu',
    'gpu_platform_id': 0,
    'gpu_device_id': 0,
}

<パラメータ設定の補足>

パラメータ 意味 補足
‘boosting_type’: ‘gbdt’ ブースティングのアルゴリズムタイプを指定 ‘gbdt’は「Gradient Boosting Decision Tree」。決定木を用いた勾配ブースティングアルゴリズムで、LightGBMのデフォルトのブースティング手法です。連続的に決定木を作成し、それらを組み合わせて予測精度を向上させます
‘objective’: ‘binary’ 学習の目的関数を指定 ‘binary’は二値分類を行うための目的関数を指定。ラベルが0または1の2つのクラスに分類されるタスクに適しています。LightGBMは二項クロスエントロピー損失関数を最適化します
‘metric’: ‘binary_error’ モデルの評価指標を指定 ‘binary_error’は、二値分類における誤分類率を評価指標。誤分類率は、正しく分類できなかったサンプルの割合を表します。この指標に基づいて、モデルの性能が評価されます
‘device’: ‘gpu’ 学習時に使用するデバイスを指定 ‘gpu’と指定することで、LightGBMがGPUを使用してモデルのトレーニングを行うように設定しています。GPUを使用することで、大規模データセットのトレーニングが高速化されます
‘gpu_platform_id’: 0 使用するOpenCLプラットフォームのIDを指定 GPUを使用する際に、複数のOpenCLプラットフォームが存在する場合、どのプラットフォームを使用するかを指定するためのパラメータです。`0`は最初のプラットフォームを意味します。
‘gpu_device_id’: 0 使用するGPUデバイスのIDを指定 1つのプラットフォームに複数のGPUが接続されている場合、どのGPUデバイスを使用するかを指定します。`0`は最初のデバイスを意味し、通常はメインのGPUが選択されます。これにより、どのGPUを使って計算するかを制御できます

<gpu_platform_idとgpu_device_idの確認方法>

Pythonのpyopenclライブラリを使って、利用可能なOpenCLプラットフォームとデバイスの一覧を取得することができます。pipでpyopencleをインストールします。

(.venv)> pip install pyopencl

下記のコードを実行することで、gpu_platform_idとgpu_device_idを標準出力できます。

import pyopencl as cl

# 全てのプラットフォームを取得
platforms = cl.get_platforms()

# 各プラットフォームの詳細を表示
for platform_id, platform in enumerate(platforms):
    print(f"Platform ID: {platform_id}, Name: {platform.name}")
    # 各プラットフォーム内のデバイスを取得
    devices = platform.get_devices()
    for device_id, device in enumerate(devices):
        print(f"  Device ID: {device_id}, Name: {device.name}, Type: {cl.device_type.to_string(device.type)}")

上記のコードを実行すると、下記のような結果を得ることができます。

Platform ID: 0, Name: NVIDIA CUDA
  Device ID: 0, Name: NVIDIA GeForce RTX 3060, Type: ALL | GPU

以上です。

コメント

タイトルとURLをコピーしました