GPU support for XGBoost and Ligh
GBDT 是表格型数据挖掘比赛的大杀器,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。XGBoost 和 LightGBM 是两个实现 GBDT 算法的框架,为了加快模型的训练效率,本文记录了 GPU Support 的 XGBoost and LightGBM 的构建过程。
本次构建的系统环境为 CentOS 7.2。
Installation Guide for XGBoost GPU support
Building XGBoost from source,构建和安装 XGBoost 包括如下两个步骤,
- 从 C++ 代码构建共享库(libxgboost.so for Linux/OSX and xgboost.dll for Windows)
- 安装语言包(如Python)
Building the Shared Library
在 CentOS 上构建共享库,默认情况下,分布式 GPU 训练是关闭的,仅仅只有一个 GPU 将被使用,为开启分布式 GPU 训练,用 CMake 构建时,设置选项USE_NCLL=ON
,分布式 GPU 训练依赖 NCLL2 ,可在 https://developer.nvidia.com/nccl 获取,下载过程需要登录并完成调查问卷,所以构建 GPU Support 的 Pre-installation Actions is,
- gcc/g++ 5.0 or higher
- CMake 3.3 or higher(3.12 or higher for building with CUDA)
- NCLL2
gcc/g++ 5.0+,
CentOS 7.2 默认的 gcc/g++ 版本为4.8.5,不满足构建的需要,需升级 gcc/g++,首先做一些准备工作,
- 下载 gcc,https://ftp.gnu.org/gnu/gcc/,
tar xjvf gcc-7.4.0.tar.bz2 && cd gcc-7.4.0
- 编译安装gcc的依赖组件,在机器不能联网的环境,从
./contrib/download_prerequisites
查找指定的版本,自行下载这些组件到目录 gcc-7.4.0,将download_prerequisites
里面的 wget 全部注释。
gmp='gmp-6.1.0.tar.bz2'
mpfr='mpfr-3.1.4.tar.bz2'
mpc='mpc-1.0.3.tar.gz'
isl='isl-0.16.1.tar.bz2'
再执行,
./contrib/download_prerequisites
- configure,新建一个目录存储编译文件,默认安装目录为 /usr/local ,可以使用 --prefix 修改自定义路径,编译选项参考默认的 gcc-4.8.5 的编译选项。建议使用
make -j8
进行编译,缩短编译时间,但可能会编译失败。
mkdir gcc-7.4.0-build && cd gcc-7.4.0-build
../configure --prefix=/usr/local/gcc-7.4.0 --enable-bootstrap --enable-build-with-cxx --enable-cloog-backend=isl --disable-libjava-multilib --enable-checking=release --enable-gold --enable-ld --enable-libada --enable-libssp --enable-lto --enable-objc-gc --enable-vtable-verify --enable-checking=release --enable-languages=c,c++,objc,obj-c++,fortran --disable-multilib
make -j8
make install
- 配置环境变量,配置库文件和头文件路径,在 .bashrc 配置,
export PATH=/usr/local/gcc-7.4.0/bin/:$PATH
export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64/:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/usr/local/include/:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/usr/local/include/:$CPLUS_INCLUDE_PATH
验证 gcc 版本,
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/gcc-7.4.0/libexec/gcc/x86_64-redhat-linux/7.4.0/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr/local/gcc-7.4.0 --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 7.4.0 (GCC)
但 g++ 和 c++ 版本仍指向原来的4.8.5,增加软链接修改指向,
sudo cp /usr/bin/g++ /usr/bin/g++-4.8.5.bak
sudo rm /usr/bin/g++
sudo ln -s /usr/local/gcc-7.4.0/bin/g++ /usr/bin/g++
sudo cp /usr/bin/c++ /usr/bin/c++-4.8.5.bak
sudo rm /usr/bin/c++
sudo ln -s g++ /usr/bin/c++
c++ -v
g++ -v
CMake,
build CMake from source,参考 https://cmake.org/install/,
tar -zxvf cmake-3.16.2.tar.gz
cd cmake-3.16.2/
./bootstrap --prefix=/usr/local
make
make install
which cmake
cmake -version
NCLL2,
参考
https://docs.nvidia.com/deeplearning/sdk/nccl-install-guide/index.html
When compiling applications, specify the directory path to where you installed NCCL, for example /usr/local/nccl-<version>/
tar -zxvf nccl-2.5.6-2.tar.gz
mv nccl-2.5.6-2 /usr/local/
ll /usr/local/nccl-2.5.6-2
GPU support for XGBoost,
By default, distributed GPU training is disabled and only a single GPU will be used. To enable distributed GPU training, set the option USE_NCCL=ON. Distributed GPU training depends on NCCL2, available at this link. Since NCCL2 is only available for Linux machines, distributed GPU training is available only for Linux.
首先从 Git 获取源码,
git clone --recursive https://github.com/dmlc/xgboost
编译支持 GPU 训练,设置选项 USE_CUDA=ON
,分布式 GPU 训练,设置选项 USE_NCCL=ON
,指定 NCCL2 根路径,
cd xgboost
mkdir build
cd build
cmake .. -DUSE_CUDA=ON -DUSE_NCCL=ON -DNCCL_ROOT=/usr/local/nccl-2.5.6-2
make -j4
XGBoost Python Package Installation
python 包位于 xgboost/python-package
,
cd python-package
sudo python setup.py install
benchmark测试,
cd xgboost/tests/benchmark
python benchmark_tree.py
XGBoost GPU accelerated Usage
compute capability of GPU card,
https://en.wikipedia.org/wiki/CUDA#GPUs_supported
使用 sklearn 风格的接口,使用 sklearn 风格的参数。
import xgboost as xgb
clf = xgb.XGBClassifier(tree_method='gpu_hist', gpu_id=0)
Installation Guide for LightGBM GPU support
Building LightGBM from source
Requirements
- glibc >= 2.14
- OpenCL 1.2 headers and libraries
- libboost 1.56 or later (1.61 or later is recommended)
- CMake 3.2 or later
glibc和CMake已满足要求,CentOS 7.2 的base repo中 boost 版本为1.53,epel repo有1.69,或者从 boost 源码编译。
libboost installation,
#sudo yum install boost169 boost169-devel
#Error: Package: python36-libs-3.6.8-1.el7.x86_64 (centos72-epel)
# Requires: libcrypto.so.10(OPENSSL_1.0.2)(64bit)
#rpm -qa | grep boost
tar -zxvf boost_1_69_0.tar.gz
cd boost_1_69_0/
./bootstrap.sh
./b2
./b2 install
OpenCL,
查看 OpenCL headers and library,
ls /usr/local/cuda/lib64/libOpenCL.so /usr/local/cuda/include/
Build LightGBM GPU Version,
构建 LightGBM GPU 版本,
git clone --recursive https://github.com/microsoft/LightGBM
cd LightGBM
mkdir build
cd build
cmake -DUSE_GPU=1 -DOpenCL_LIBRARY=/usr/local/cuda/lib64/libOpenCL.so -DOpenCL_INCLUDE_DIR=/usr/local/cuda/include/ ..
make -j4
LightGBM Python-package Installation
cd LightGBM/python-package
python setup.py install
主要参考文档,
https://xgboost.readthedocs.io/en/latest/
https://lightgbm.readthedocs.io/en/latest/index.html
微信公众号「padluo」,分享数据科学家的自我修养,既然遇见,不如一起成长。
数据分析读者交流电报群
知识星球交流群
知识星球读者交流群