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-core
、gputreeshap
是否包含文件,如果是空的需要在指定仓库下下载;
另外,在下面的验证代码中,使用了scikit-learn
与pandas
,因此这里也一并安装上;
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进行分布式训练,那么接下来就需要安装两个库,分别是:Dask
与dask-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三个版本的安装到此完成;