はじめに
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をインストールしていない場合は、下記からダウンロードし、インストールてください。
CMake のインストール
GPUサポートを有効にしたLightGBMをビルドする場合、CMakeはCUDAや他のライブラリを適切に検出し、設定するために必要なツールです。
下記から「cmake-3.30.2-windows-x86_64.msi」をダウンロードしてください。
ダウンロードする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_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つです。
- ‘device’: ‘gpu’
- ‘gpu_platform_id’: 0,
- ‘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
以上です。
コメント