LightGBM GPU 教程

本文档的目的是为您提供一个关于GPU训练的快速分步教程。

我们将使用 Microsoft Azure 云计算平台 上的 GPU 实例进行演示,但您可以使用任何配备现代 AMD 或 NVIDIA GPU 的机器。

GPU 设置

您需要在 Azure 上启动一个 NV 类型的实例(在东美国、美国中北部、美国中南部、西欧和东南亚区域可用),并选择 Ubuntu 16.04 LTS 作为操作系统。

对于测试,最小的 NV6 类型虚拟机就足够了,它包括 1/2 M60 GPU,具有 8 GB 内存,180 GB/s 内存带宽和 4,825 GFLOPS 峰值计算能力。不要使用 NC 类型实例,因为其 GPU(K80)基于较旧的架构(Kepler)。

首先,我们需要安装最小的 NVIDIA 驱动程序和 OpenCL 开发环境:

sudo apt-get update
sudo apt-get install --no-install-recommends nvidia-375
sudo apt-get install --no-install-recommends nvidia-opencl-icd-375 nvidia-opencl-dev opencl-headers

安装驱动程序后,您需要重新启动服务器。

sudo init 6

大约30秒后,服务器应该会重新启动。

如果你使用的是AMD GPU,你应该下载并安装 AMDGPU-Pro 驱动,同时安装 ocl-icd-libopencl1ocl-icd-opencl-dev 包。

构建 LightGBM

现在安装必要的构建工具和依赖项:

sudo apt-get install --no-install-recommends git cmake build-essential libboost-dev libboost-system-dev libboost-filesystem-dev

NV6 GPU 实例在 /mnt 挂载了一个 320 GB 的超快 SSD。让我们将其用作我们的工作空间(如果你使用的是自己的机器,请跳过此步骤):

sudo mkdir -p /mnt/workspace
sudo chown $(whoami):$(whoami) /mnt/workspace
cd /mnt/workspace

现在我们准备好检出 LightGBM 并使用 GPU 支持进行编译:

git clone --recursive https://github.com/microsoft/LightGBM
cd LightGBM
cmake -B build -S . -DUSE_GPU=1
# if you have installed NVIDIA CUDA to a customized location, you should specify paths to OpenCL headers and library like the following:
# cmake -B build -S . -DUSE_GPU=1 -DOpenCL_LIBRARY=/usr/local/cuda/lib64/libOpenCL.so -DOpenCL_INCLUDE_DIR=/usr/local/cuda/include/
cmake --build build -j$(nproc)

你将会看到生成了两个二进制文件,lightgbmlib_lightgbm.so

如果你在 macOS 上构建,你可能需要移除 src/treelearner/gpu_tree_learner.h 中的宏 BOOST_COMPUTE_USE_OFFLINE_CACHE 以避免 Boost.Compute 中的已知崩溃错误。

安装 Python 接口(可选)

如果你想使用 LightGBM 的 Python 接口,你现在可以安装它(以及一些必要的 Python 包依赖项):

sudo apt-get -y install python-pip
sudo -H pip install setuptools numpy scipy scikit-learn -U
sudo sh ./build-python.sh install --precompile

你需要设置一个额外的参数 "device" : "gpu" (连同你的其他选项如 learning_ratenum_leaves 等)来在 Python 中使用 GPU。

你可以阅读我们的 Python-package Examples 以获取更多关于如何使用Python接口的信息。

数据集准备

使用以下命令准备 Higgs 数据集:

git clone https://github.com/guolinke/boosting_tree_benchmarks.git
cd boosting_tree_benchmarks/data
wget "https://archive.ics.uci.edu/ml/machine-learning-databases/00280/HIGGS.csv.gz"
gunzip HIGGS.csv.gz
python higgs2libsvm.py
cd ../..
ln -s boosting_tree_benchmarks/data/higgs.train
ln -s boosting_tree_benchmarks/data/higgs.test

现在我们通过运行以下命令为 LightGBM 创建一个配置文件(请复制整个代码块并一次性运行):

cat > lightgbm_gpu.conf <<EOF
max_bin = 63
num_leaves = 255
num_iterations = 50
learning_rate = 0.1
tree_learner = serial
task = train
is_training_metric = false
min_data_in_leaf = 1
min_sum_hessian_in_leaf = 100
ndcg_eval_at = 1,3,5,10
device = gpu
gpu_platform_id = 0
gpu_device_id = 0
EOF
echo "num_threads=$(nproc)" >> lightgbm_gpu.conf

在刚刚创建的配置文件中,通过设置 device=gpu 启用了GPU。在此配置中,我们使用系统上安装的第一个GPU(gpu_platform_id=0gpu_device_id=0)。如果未设置 gpu_platform_idgpu_device_id,将选择默认的平台和GPU。您可能拥有多个平台(AMD/Intel/NVIDIA)或GPU。您可以使用 clinfo 工具来识别每个平台上的GPU。在Ubuntu上,您可以通过执行 sudo apt-get install clinfo 来安装 clinfo。如果您有AMD/NVIDIA的独立GPU和Intel的集成GPU,请确保选择正确的 gpu_platform_id 以使用独立GPU。

在GPU上运行您的第一个学习任务

现在我们准备好开始GPU训练了!

首先,我们想要验证GPU是否正常工作。运行以下命令在GPU上进行训练,并记录50次迭代后的AUC:

./lightgbm config=lightgbm_gpu.conf data=higgs.train valid=higgs.test objective=binary metric=auc

现在使用以下命令在CPU上训练相同的数据集。你应该观察到类似的AUC:

./lightgbm config=lightgbm_gpu.conf data=higgs.train valid=higgs.test objective=binary metric=auc device=cpu

现在我们可以在GPU上进行速度测试,而无需在每次迭代后计算AUC。

./lightgbm config=lightgbm_gpu.conf data=higgs.train objective=binary metric=auc

CPU 速度测试:

./lightgbm config=lightgbm_gpu.conf data=higgs.train objective=binary metric=auc device=cpu

你应该在这个GPU上观察到超过三倍的加速。

GPU 加速也可以用于其他任务/指标(回归、多类分类、排序等)。例如,我们可以将 Higgs 数据集作为回归任务在 GPU 上进行训练:

./lightgbm config=lightgbm_gpu.conf data=higgs.train objective=regression_l2 metric=l2

此外,您可以比较训练速度与CPU:

./lightgbm config=lightgbm_gpu.conf data=higgs.train objective=regression_l2 metric=l2 device=cpu

进一步阅读

参考

如果您发现GPU加速有用,请在您的出版物中引用以下文章:

Huan Zhang, Si Si 和 Cho-Jui Hsieh. “GPU 加速大规模树提升”. SysML 会议, 2018.