XGBoost--3--CPU、GPU与Multi-GPU安装

本文主要介绍的是XGBoost的CPU、GPU与Multi-GPU的安装,以下几点说明:

  • linux平台、源码编译、支持python

补充:相比于本文,XGBoost文档提供了更为详细、丰富的的安装过程,其实完全可以参考原文;那么,该文目的在哪呢,想了一下主要有两点:

  • 一方面是中文介绍,
  • 另一方面就是对一些可能发生的问题进行避免,并特别说明,这一点是比较重要的;

另外,全文无图;

1. 依赖环境

虽然XGBoost可以提供多种语言的接口,如Python、R、JVM、Ruby等等,但本文仅涉及Python;

因此,需要创建一个独立的虚拟python环境,用于测试;

创建独立python运行环境,并激活使用;

virtualenv -p /usr/bin/python3 env
source env/bin/activate
  • virtualenv用于创建多个独立的python运行环境;
  • -p /usr/bin/python用于指定采用基础python环境,不包含任何其他第三方库;
  • env表示将新建的python运行环境所需文件指定到该路径;
  • source env/bin/activate用于激活;

另外,不管进行哪个版本的安装,都需要下载XGBoost的源码

git clone --recursive https://github.com/dmlc/xgboost  # 挺慢的

注意下载的xgboost下文件夹cub/dmlc-coregputreeshap是否包含文件,如果是空的需要在指定仓库下下载;

另外,在下面的验证代码中,使用了scikit-learnpandas,因此这里也一并安装上;

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scikit-learn
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas

2. XGBoost的CPU版本安装

除了源码编译安装之外,其实还有一个更为简单的方式使用XGBoost CPU的版本,相比大家也可以想的到,那么就是使用pip安装;

2.1 pip安装

这里借助的是清华源镜像:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xgboost

安装成功后,使用下面代码进行验证;

import xgboost as xgb
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

# 创建数据集
dataset, labels = make_classification(n_samples=10000, n_features=50, n_informative=3, n_classes=3)
print(dataset.shape, labels.shape)
# 拆分数据集
x_train, x_test, y_train, y_test = train_test_split(dataset, labels, test_size=0.3, random_state=7)
print("x_train: {}, x_test: {}".format(x_train.shape, x_test.shape))

# 构建DMatrix
dtrain = xgb.DMatrix(x_train, y_train)
dtest = xgb.DMatrix(x_test, y_test)

# 参数设置
params = {
        'tree_method': "hist",
        'booster': 'gbtree',
        'objective': 'multi:softmax',
        'num_class': 3,
        'max_depth': 6,
        'eval_metric': 'merror',
        'eta': 0.01,
        # 'gpu_id': cr.gpu_id
    }

# 训练
evals = [(dtrain, 'train'), (dtest, 'val')]
model = xgb.train(params, dtrain, num_boost_round=100,
                  evals=evals)

输出如下:

(10000, 50) (10000,)
x_train: (7000, 50), x_test: (3000, 50)
[0]     train-merror:0.12200    val-merror:0.15467
[1]     train-merror:0.12371    val-merror:0.15267
[2]     train-merror:0.12286    val-merror:0.15333
[3]     train-merror:0.12343    val-merror:0.15467
...

2.2 源码编译XGBoost CPU版本

2.2.1 编译XGBoost

CPU版本最简单的方法就是使用pip安装,这里再一次利用源码编译是为了熟悉整个流程;

进入到已经下载并解压(或者git clone)成功的xgboost文件夹,依次执行:

cd xgboost
mkdir build
cd build
cmake ..
make -j12
  • build
  • make -j12中的12表示机器的核心数,可以通过在命令行中,执行nproc进行查看;根据具体情况设置大小;

如果没有报错,那么就表示编译成功;

2.2.2 配置Python Package

那么接下来进行Python Package的安装配置;

需要注意的是,下载完成的xgboost默认是master分支,如果想要使用最新版本的python包,则不需要切换分支;如果想要安装指定版本的python包,则需要切换分支,具体操作如下:

首先,定位到xgboost根目录下:

git branch -a  # 查看分支
git checkout remotes/origin/release_1.2.0  # 切换指定版本的分支

其次,定位到python_packages

cd python_packages

执行:

python setup.py install  # Install the XGBoost to your current Python environment.
python setup.py build    # Build the Python package.
python setup.py build_ext # Build only the C++ core.
python setup.py sdist     # Create a source distribution
python setup.py bdist     # Create a binary distribution
python setup.py bdist_wheel # Create a binary distribution with wheel format

成功执行后,通过pip list查看已经安装成功;

2.2.3 验证

使用下面例子(同上)进行验证:

import xgboost as xgb
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

# 创建数据集
dataset, labels = make_classification(n_samples=10000, n_features=50, n_informative=3, n_classes=3)
print(dataset.shape, labels.shape)
# 拆分数据集
x_train, x_test, y_train, y_test = train_test_split(dataset, labels, test_size=0.3, random_state=7)
print("x_train: {}, x_test: {}".format(x_train.shape, x_test.shape))

# 构建DMatrix
dtrain = xgb.DMatrix(x_train, y_train)
dtest = xgb.DMatrix(x_test, y_test)

# 参数设置
params = {
        'tree_method': "hist",
        'booster': 'gbtree',
        'objective': 'multi:softmax',
        'num_class': 3,
        'max_depth': 6,
        'eval_metric': 'merror',
        'eta': 0.01,
        # 'gpu_id': cr.gpu_id
    }

# 训练
evals = [(dtrain, 'train'), (dtest, 'val')]
model = xgb.train(params, dtrain, num_boost_round=100,
                  evals=evals)

3. XGBoost的GPU版本安装

3.1 编译XGBoost

与CPU版本相比,GPU版本训练过程会更高效一些;几倍之差吧;

配置过程与CPU版本类似:

cd xgboost
mkdir build
cd build
cmake .. -DUSE_CUDA=ON
make -j12
  • -DUSE_CUDA=ON表示支持CUDA加速;因此,需要注意的是在此之前需要Nvidia的显卡及其驱动、CUDA等的成功配置;

3.2 配置Python Package

注意:如果需要安装指定版本的XGBoost,需要切换到相应的分支下;

git branch -a
git checkout remotes/origin/release_1.2.0

然后,定位到python-packages目录:

cd python-packages

执行(注意,这里和CPU的略有不同):

python setup.py install --use-cuda
python setup.py build   
python setup.py build_ext
python setup.py sdist     
python setup.py bdist    
python setup.py bdist_wheel 

配置成功,使用pip list查看;

3.3 验证

配置成功,使用代码进行验证:

(这里就不放完整的代码了,与CPU的验证类似,差别之处在下面指出)

# 参数设置
params = {
        'tree_method': "gpu_hist",  # 与CPU不同
        'booster': 'gbtree',
        'objective': 'multi:softmax',
        'num_class': 3,
        'max_depth': 6,
        'eval_metric': 'merror',
        'eta': 0.01,
        'gpu_id': 0  # 与CPU不同
    }
  • 需要将tree_method对应的值改成gpu_hist
  • 指定使用的GPU,gpu_id指定为0

4. XGBoost的Multi-GPU版本安装

XGBoost的CPU和GPU版本两者相差不大,仅计算平台不同;相比于CPU、GPU,Multi-GPU有以下不同:

  • 相对复杂的安装配置过程;
  • 不同的代码实现;

4.1 安装配置NCCL

安装Multi-GPU版本的XGBoost,那么就需要多个GPU的通信,需要NCCL;

NCCL(NVIDA Collective Communications Library)目的是为了实现Multi-GPU或Multi-node之间的通信;

有两种安装方式,一是具有root权限的安装,二是不具有root权限的安装配置;

安装方式见:Linux下NCCL源码编译安装

4.2 编译XGBoost

与CPU版本相比,GPU版本训练过程会更高效一些;几倍之差吧;

配置过程与CPU版本类似:

cd xgboost
mkdir build
cd build
cmake .. -DUSE_CUDA=ON -DUSE_NCCL=ON -DNCCL_ROOT=/home/chenz/software/nccl
make -j12
  • -DUSE_CUDA=ON表示支持CUDA加速;因此,需要注意的是在此之前需要Nvidia的显卡及其驱动、CUDA等的成功配置;
  • -DUSE_NCCL=ON表示使用NCCL;
  • -DNCCL_ROOT表示nccl的安装位置;

4.3 配置Python Package

注意:如果需要安装指定版本的XGBoost,需要切换到相应的分支下;

git branch -a
git checkout remotes/origin/release_1.2.0

然后,定位到python-packages目录:

cd python-packages

执行(注意,这里和CPU/单GPU的略有不同):

python setup.py install --use-cuda --use-nccl
python setup.py build   
python setup.py build_ext
python setup.py sdist     
python setup.py bdist    
python setup.py bdist_wheel 

配置成功,使用pip list查看;

4.4 Dask与dask-cuda的安装

使用pip list成功看到xgboost,表明编译成功;

XGBoost支持使用Dask进行分布式训练,那么接下来就需要安装两个库,分别是:Daskdask-cuda

Dask是一个基于Python的并行计算库,能够更容易的管理分布式的worker...

安装Dask

pip install dask==2.21.0
  • 我这边安装的是2.21.0

另外,还需要dask-cuda,可以从dask-cuda页面下载,我下载的是0.14.1版本;

pip install dask_cuda-0.14.1-py3-none-any.whl

4.5 验证

配置成功,使用代码进行验证:

XGBoost的Multi-GPU的代码与CPU/单GPU有很大的不同,如下:

import time
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from dask_cuda import LocalCUDACluster
from dask.distributed import Client
from xgboost.dask import DaskDMatrix
import xgboost as xgb
from dask import array as da


def train():

    dataset, labels = make_classification(n_samples=10000, n_features=50, n_informative=3, n_classes=3)
    print(dataset.shape, labels.shape)

    x_train, x_test, y_train, y_test = train_test_split(dataset, labels, test_size=0.3, random_state=7)
    print("x_train: {}, x_test: {}".format(x_train.shape, x_test.shape))

    X_train_da = da.from_array(x_train, chunks=(100))
    X_test_da = da.from_array(x_test, chunks=(100))
    y_train_da = da.from_array(y_train, chunks=(100))
    y_test_da = da.from_array(y_test, chunks=(100))

    dtrain = DaskDMatrix(client, X_train_da, y_train_da)
    dtest = DaskDMatrix(client, X_test_da, y_test_da)

    params = {
        'tree_method': 'gpu_hist',
        'booster': 'gbtree',
        'objective': 'multi:softmax',
        'num_class': 3,
        'max_depth': 6,
        'eval_metric': 'merror',
        'eta': 0.01
    }

    evals = [(dtrain, 'train'), (dtest, 'val')]

    res = xgb.dask.train(client, params, dtrain, num_boost_round=100,
                           evals=evals)

    train_error = res['history']['train']['merror']
    eval_error = res['history']['val']['merror']
    for tra, eva in zip(train_error, eval_error):
        print("train: {}, eval: {}".format(tra, eva))

if __name__ == "__main__":
    with LocalCUDACluster(n_workers=1, threads_per_worker=3, CUDA_VISIBLE_DEVICES="0,1,2,3") as cluster:
        with Client(cluster) as client:
            train()

输出结果:

task [xgboost.dask]:tcp://127.0.0.1:43551 connected to the tracker
task [xgboost.dask]:tcp://127.0.0.1:43551 got new rank 0
train: 0.091143, eval: 0.117333
train: 0.091571, eval: 0.117333
train: 0.090857, eval: 0.117333
train: 0.090714, eval: 0.117667
...

好了,XGBoost的CPU、GPU、Multi-GPU三个版本的安装到此完成;

posted @ 2020-10-27 15:57  chenzhen0530  阅读(2925)  评论(0编辑  收藏  举报