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-libopencl1
和 ocl-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)
你将会看到生成了两个二进制文件,lightgbm
和 lib_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_rate
、num_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=0
和 gpu_device_id=0
)。如果未设置 gpu_platform_id
或 gpu_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.