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/秒内存带宽和 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 实例有一个 320 GB 的超快速 SSD 挂载在 /mnt。让我们用它作为工作空间(如果您使用自己的机器,请跳过此步骤)

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 中一个已知的崩溃 bug。

安装 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

您需要在 Python 中设置一个额外的参数 "device" : "gpu"(以及您的其他选项,如 learning_rate, num_leaves 等)来使用 GPU。

您可以阅读我们的 Python 包示例,了解有关如何使用 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。