Deep NN a.k.a. 札束 で殴ることのできないstacked generalization勢にとってxgboost(またはlightgbm)はlogistic regressionと共に欠かすことのできない生命線ですが、いかんせんxgboostは遅いです。windowsでもgpu対応できるようなので手順をメモします。
Pythonから動かすことを前提としています。
この記事を読むと分かること
- windows10でxgboostを動かすのに必要な手順・設定・モジュールのバージョンなど
Contents
なぜxgboostか
なぜ(少し)速いと言われているlightgbmでなくてxgboostなのか。
- lightgbmの優位は「多少」である
- xgboostがoriginなので広く使われている
- GPU実行したときにlightgbmは速くなるとは限らない(下記記事参照)
以上の理由から、僕はlightgbmではなくxgboostを使っています。
使用するライブラリのバージョン
- xgboostのmaster branch(最新リリースの方が良いと思う)
- Visual Studio 2017
- Visual C++ 2015 Build Tools
- 最新のmingw64
- 最新のcmake
- CUDA 8.0(CUDA Toolkit 8.0 GA1 (8.0.44) ※GA2(8.0.61)ではダメ(後述)
使用したwindows10のバージョンは、windows 1709 OS Build 16299.431です。
またインストール手順自体は下記記事にて書かれていますが、いろんな組合せが混在しすぎていてはっきりいって良くわかりません。(なので本記事の手順に沿うと良いでしょう)
https://xgboost.readthedocs.io/en/latest/build.html#building-with-gpu-support
依存ツール群をインストール
mingw64
上記リンクからダウンロード&インストールします。インストーラーでは下画像のように選択:
インストール後、バイナリの格納されている下記パスをユーザー環境変数またはシステム環境変数Pathに追加します:
C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin
cmakeのインストール
上記URLからダウンロード&インストールします。
インストーラーのオプションでは、システム環境変数またはユーザー環境変数Pathへの追加を選択します。
CUDA
CUDA 8.0(CUDA Toolkit 8.0 GA1 (8.0.44)をインストールします。
ちなみにGA2(8.0.61)だと下記エラーでビルドに失敗するので気をつけてください:
nvcc error : ‘cicc’ died with status 0xC0000005
Visual Studio 2017、2015 Build Tools
過去の別記事で触れてますので参照してください:
xgboostのビルド
やっとビルドです。
Developer Command Prompt for VS 2017を管理者権限で開いて下記コマンドの手順に従ってください:
git clone --recursive https://github.com/dmlc/xgboost
cd xgboost
mkdir build
cd build
cmake .. -G"Visual Studio 14 2015 Win64" -DUSE_CUDA=ON
cmake --build . --target xgboost --config Release
ビルドが終了すると、lib以下にライブラリのファイルが出来ています。これらをpython-package\xgboost以下ににコピーし、
cd python-package
python setup.py install
でpythonのパッケージインストールを行います。これで完了です。
動作確認
xgboost内のtests\benchmark\benchmark_tree.pyがエラーなく実行できればOKです。
もし別のPythonなどを参照していたり、過去にインストールしたcpu用のxgboostなどが使用されると
xgboost.core.XGBoostError: b'[15:12:22] src/learner.cc:153: XGBoost version not compiled with GPU support.’
といったエラーが出ます。
使用時の注意
sklearn APIではgpu用のパラメータ使用が保証されない
xgboostを使うほとんどの人がsklearn APIを利用してXGBClassifierなどを使うと思うのですが、公式に書かれているように「ドキュメントに列挙されている以外のパラメータ」は有効になることが保証されません。
gpu使用を明示するために必要なtree_methodパラメータはXGBClassifierのパラメータに含まれませんので、このやり方は避けたほうがよいでしょう。代わりに、xgboostの普通のAPIを使います。
例えば、sklearnで学習可能なトレーニングデータがtrain_x, train_yに用意されているとした場合:
import xgboost as xgb
dtrain = xgb.DMatrix(train_x, train_y)
param = {
"max_depth":5, "objective":"multi:softmax", "num_class": 10,
"subsample":0.5, "colsample_bytree":0.5, "tree_method":"gpu_hist"
}
clf_xgb = xgb.train(param, dtrain, 100) # 100はn_estimatorsと等価
clf_xgb.save_model("hogehoge.model")
みたいな感じで学習からモデルの保存ができます。num_classは利用するデータに合わせてください。
エラーを出さずに終了する場合
大きなデータやmax_depthの値が大きすぎる場合、xgb.trainでデータをGPUに展開する過程でクラッシュします。
[17:35:58] Allocated 228MB on [0] GeForce GTX 1060, 4841MB remaining.
[17:35:58] Allocated 3MB on [0] GeForce GTX 1060, 4837MB remaining.
[17:35:58] Allocated 2545MB on [0] GeForce GTX 1060, 2291MB remaining.
[17:36:08] Allocated 768MB on [0] GeForce GTX 1060, 1520MB remaining.
こうしたログがすべて吐き出されずに終了する場合は、GPUのメモリに対してデータ・max_depthが大きすぎます。
コメント